|
[笔记]java学习笔记7--内部类
1 内部类:定义在类内部的类,类之间有了包含关系。(不是重点)
所有用到内部类的地方都可以不用内部类,有内部类可以使代码简洁,内部类是个编译时语法. 内部类可以访问外部类的私有成员。内部类是依附外部类而存在的,在构造内部类时先构造外 部类对象。内部类可为静态,可用protected和private修饰。而外部类不可以,外部类只能使用 public和default。
2 内部类的分类:
成员式(作为外部类成员): 静态内部类 //只能访问外部类的静态成员。 成员内部类
局部式(方法体内部): 局部内部类 //方法体内部有效
匿名内部类
3 成员内部类:作为外部类的成员,与外部类的属性,方法并列.
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性
System.out.println(Outer.this.name1);
//Outer.this外部类的当前对象,内部类对象是哪个外部类对象生成的谁就是外部类的当前对象
4 对于一个名为outer 的外部类和其内部定义的名为inner 的内部类。编译完成后出现 outer.class 和outer$inner.class 两个类。
5 成员内部类不可以有静态属性,这是因为静态属性是在加载类的时候创建,这个时候内部类还 没有被创建。
6 在外部类内部可以直接inner s=new inner();
//因为外部类知道inner 是哪个类,所以可以生成对象。
7 在外部构造成员内部类语法两种:
(1) Outer.Inner in=Outer.new.Inner();
(2) OurerA out =new OutreA();
OutreA.innerB innb=out.new innerB();
OurerA.innerA oi=new OurerA.innerA(); //注意这种写法不对
8 局部内部类:在方法中定义的内部类.在局部内部类前不加修饰符public 和private,其范围为 定义它的代码块。局部内部类可以访问外部类的final的局部变量.
在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。
要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。
9 静态内部类:定义在类中,任何方法外,用static修饰.
静态内部类的对象可以直接生成,不需要外部类对象,这是和成员内部类的区别:
OurerA.innerA oi=new OurerA.innerA();
静态内部类只能访问外部类的静态成员。
10 匿名内部类:一个匿名内部类一定是在new 的后面,用其隐含实现一个接口或实现一个类,没 有类名,根据多态,我们使用其父类名。
11 匿名内部类:唯一一个没有构造方法的类.这是因为构造器的名字必须合类名相同,而匿名内部 类没有类名。匿名内部类在编译的时候由系统自动起名Out$1.class。
匿名内部类例子:
public class Arrmy {
public static void attack(Weapon w){
w.shoot();
}
public static void main(String[] args) {
attack(new Weapon(){
public void shoot(){
System.out.println("shoot");
}
});
}
}
interface Weapon{
void shoot();
}
12 编译时概念:编译器给你检查差别,语法
(1)内部类 编译器检查是否符合内部类的语法.
(2)访问权限
(3)泛型
13 特殊语法:
除了在外部类外部访问内部类之外,也可以在外部类某个方法里生成内部类对象.
public InnerB m(){
return this.new InnerB(); // 谁调m()方法,谁是外部类的当前对象. 参看老师代码
} //InnerClassTestA.java
好好学习,天天向上 |
|