------- android培训、java培训、期待与您交流!
----------
1. 内部类的概括。
把一个类中定义在另一个类,这个类就叫做:内部类,或者是嵌套类,内置类.
定义内部类的原则:描述事物的同时还有内部事物,此事物内部类,内部事物访问外部事物。
2. 内部类之间的调用关系
2-1.内部类和外部类之间的理论调用
1. 内部类访问外部类的成员,可以直接访问,包括私有成员----因为内部类中持有一个外部类的引用,格式:外部类名.this
2.外部类访问内部类必须通过内部类的对象进行访问内部类的成员。
3.要是在其他的类中调用内部类成员切内部类不是私有,先获得内部类对象,内部类对象获得的方式:外部类.内部类 名称=外部类对象.内部类对象,例如:(Outer.Innerin=new Outer().new Inner())
2-2.内部类与外部类之间公共变量,局部变量之间的调用
1.外部类和内部类调用的是名称不相同的变量
public class Outer { private int x = 3; class Inner { private String name="zhangsan"; /** * 内部类之间方法外部类的私有成员变量 */ public void show() { System.out.println("这是内部类中的方法"); System.out.println("直接方法外部类中的成员变量:"+x); } } /** * 在外部类访问内部类的成员 */ public void function(){ Inner inter=new Inner(); System.out.println("在外部类调用内部类的私有属性:"+inter.name); } } public class Text { public static void main(String[] args) { Outer.Inner in=new Outer().new Inner();//在其他类中实例化内部类对象 in.show(); new Outer().function();//调用外部类方法 } }
结果:这是内部类中的方法
直接方法外部类中的成员变量:3
在外部类调用内部类的私有属性:zhangsan
2.内部类和外部类调用相同名称的变量。(内部类默认权限)
public class Outer { private int x = 3; class Inner { private int x=10; /** * 内部类和外部类有相同名称的变量,和方法中的局部变量的名称相同 */ public void show() { int x=20;//局部变量 System.out.println("直接方法局部变量:"+x); System.out.println("访问内部类的相同名称的成员:"+this.x); System.out.println("访问外部类的相同名称的成员:"+Outer.this.x); } } } public class Text { public static void main(String[] args) { Outer.Inner in=new Outer().new Inner();//在其他类中实例化内部类对象 in.show(); } }
结果: 直接方法局部变量:20 访问内部类的相同名称的成员:10 访问外部类的相同名称的成员:3 |
3.静态内部类(用static修饰内部类)。
3-1.静态内部类只能调用外部类的静态成员(static修饰的)。
3-2.外部其他类访问静态内部类的非静态成员,
New 外部类.内部类().非静态成员
外部类其他类访问静态内部类的静态成员
New 外部类.内部类.静态成员
public class Outer { static class Inner { public static String name = "张三"; public void show() { System.out.println("静态内部类的非静态成员"); } } } public class Text { public static void main(String[] args) { new Outer.Inner().show();// 外部类其他类访问静态内部类的非静态成员 System.out.println(Outer.Inner.name);// 外部类其他类访问静态内部类的静态成员 } }
3-3.当内部类中定义了静态成员,该内部类必须是静态的。
当外部类中的静态方法调用内部类的时候,内部类必须是静态的。
public class Outer { static class Inner { public void show() { System.out.println("show()"); } } public static void function(){ new Inner().show();//这里会编译出错, //因为,此静态的方法只要是类一加载,那么此方法就会生成, //但是内部类是默认权限,不是外部类的静态成员,此时外部类一加载, //此内部类不会加载,但是外部类的静态方法却调用了此内部类,所以会出错, //解决方法是:把内部类定义成静态的 } }
3-4:内部类定义在局部时。
不能被成员修饰符修饰(static ),因为方法中不能定义成员,只能定义局部变量,同时此时的内部类就不能定义静态的变量。
不能访问他所在的局部中的的成员,但是此成员必须被final修饰。
public class Outer { class Inner { public void show() { final int x=1; class aa{ public void func(){ System.out.println(x); } } new aa().func(); } } }
4.匿名内部类。
4-1.匿名内部类的概念
匿名内部类就是内部类的一种简化书写。
4-2.匿名内部类的书写和前提。
1.要向书写内部类,此类必须继承一个类或者是接口。
2.内部类的格式:new 父类或者是接口(){子类的内容}
3.其实匿名内部类其实就是一个子类的对象。
4.一个内部类中最多重写三个方法,多了最好定义一个类,然后继承父类。
4-3.匿名内部类的优点和缺点。
匿名内部类简化了代码,但是代码的阅读性比较差。
4-4.匿名内部类的结构图。
带名字的匿名内部类
abstract class ABC { public abstract void show(); } public class Outer { public void method() { ABC news=new ABC() { public void show() {// 重新show()方法 System.out.println("show"); } }; news.show();// 调用show()方法 } }
4-5.匿名内部类小测试
interface Inter { void method(); } class Test { static Inter function(){ return new Inter(){ public void method(){ System.out.println("method"); //这是补充的代码 } }; } } public class InnterClassText { public static void main(String[] args) { Test.function().method(); } }
4-6.匿名内部类的常见形式。
interface Inter { void method(); } public class InnterClassText { public static void main(String[] args) { show(new Inter(){ public void method(){ System.out.println("show run"); } });//使用匿名内部类作为show方法的传入的参数 } public static void show(Inter in){ in.method(); } }
4-7.小转脑筋题。
假如一个类没有父类也没有实现接口,那么它可以定成内部类吗?请思考!
首先答案是肯定的,可以这样写。使用Object类。
public class InnterClassText { public static void main(String[] args) { new Object() { public void function() { System.out.println("helloworld"); } }.function(); } }
但是如果是这样的话,就不正确了!
public class InnterClassText { public static void main(String[] args) { Object oo=new Object() { public void function() { System.out.println("hello world"); } }; oo..function();//在这里会出错,因为在java虚拟机中没有给Object类中没有funtion()方法 } }
------- android培训、java培训、期待与您交流!
----------