---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!----------------------
一.内部类
1.什么是内部类:
在一个类的内部声明另外一个类, 这个新类就是内部类.
2.内部类的类名:
外部类名.内部类名. class文件名为: 外部类名$内部类名.class
3.创建内部类对象:
必须指定在哪个外部类上创建, 也就是说先要创建一个外部类对象, 才能创建内部类对象.
例如: Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();
Outer.Inner inner = new Outer().new Inner();
4.内部类访问外部类成员:
使用 外部类名.this.成员名 形式访问
5.外部类访问内部类成员:
不能直接访问, 因为外部类创建之后有可能还没有创建内部类对象.
如果一定要在外部类中访问内部类成员, 可以先创建内部类对象. 再通过对象访问.
6.在外部类中创建内部类对象:
可以直接使用 内部类名 创建, 无须再加上 外部类名. 会优先找内部类.
在外部类中可以直接通过引用访问内部类的私有成员.
7.内部类中的静态成员:
静态的本意就是让别人不创建对象就可以使用.
而内部类的本意是让别人先创建外部类对象再使用内部类.
他们之间互相矛盾, 所以不能再内部类中声明静态的成员.
二.方法中的内部类:
1.应用场景:
如果一个类只在某一个方法中使用, 那么就可以定义在方法中.
2.方法中内部类的使用:
在方法中定义的内部类, 只能在方法中使用, 必须先定义才能创建对象(方法中的代码是由上到下顺序执行的).
3.方法中内部类的类名:
在方法中直接写内部类名就可以, 方法外访问不到. class文件名: 外部类名$1内部类名.class
三.匿名内部类
1.应用场景:
通常用在参数传递的时候, 方法的形参定义的是一个父类类型.
这时我们需要写一个子类, 并创建对象传入.
这个类只使用一次, 我们就可以使用匿名内部类.
2.定义方式:
new 父类名(){类定义}
在这里做了两件事, 定义一个子类, 再根据这个子类创建了一个对象.
3.类名:
在程序中只使用一次, 没有类名, 不能多次通过此类创建对象. class文件名为: 父类类名$编号.class
四.静态内部类
1.什么是静态内部类:
用static修饰的内部类, 就是静态内部类.
2.静态内部类的使用:
直 接使用 外部类名.内部类名 创建, 不用创建外部类对象.
例如: Outer.Inner inner = new Outer.Inner();
3.内部类访问外部成员:
静态内部类中不能访问外部非静态成员
因为静态内部类创建的时候, 外部类有可能没有创建对象, 所以外部类成员不能被直接访问.
4.内部类中的静态成员:
普通内部类不能定义静态成员, 因为必须创建外部类对象.
静态内部类由于不用创建外部类对象, 直接可以使用. 那么也就可以定义静态成员了, 其静态成员仍然不需要创建任何对象即可直接访问.
5.静态内容:
只要是静态内容(context), 那么就不能访问外部非静态成员, 也不能使用this.
学习内部类时所遇到的错误:
Exception in thread "main" java.lang.ClassCastException: Typist cannot be cast to Coder
at TypeCastDemo.main(TypeCastDemo.java:34)
34行: 类型转换异常: Typist 不能转换成 Coder
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!----------------------