内部类、代码块和修饰符
- ---上期回顾:静态和接口---
- 1.在本类中,静态方法只能直接调用静态方法。
- 2.能建接口,就不要建抽象类。
- 3.static变量放到公共的变量类里,static方法-会被单独放到工具类里
- 4.实现的两个接口中,成员同名怎么办?
- 5.测一下类和接口之间的冲突。
- 6.多态转型,没有编译期异常,编译器异常只:检查显示的类型转换。
- 7.多态相当于对类型的抽象。
- ------内部类-----
- 8.匿名内部类----测试的时候用的多。
- 9.内部类会被编译成字节码文件,相当于一个正常的外部类。
- 10.内部类可以被定义为抽象的。
- 11.内部类的好处是,可以很好的描述所属关系。
- 12.外部类不能继承自己的内部类。
- 13.内部类可以直接访问外部类的成员,但是外部类得new内部类对象才可以访问。
- 14.外部类,想调用其他外部类的内部类,必须要先new内部类的外部类对象,再new内部类对象。
- 15.为什么内部类访问外部类成员需要写成:Outside.this.XX?
- 16.需要学什么才能看懂字节码文件???
- 17.内部类里面-new 同级内部类,不需要New 外部类,可以直接new 同级内部类,相当于在同一个包中。
- 18.匿名内部类必须要继承或实现一个父类或接口。
- 19.匿名内部类的这种写法的优缺点:
- 20.什么时候用默认的访问修饰符修饰类?
- 21.接口中只能使用public。
- 22.匿名内部类没有访问修饰符。
- 23.成员内部类修饰符有什么注意事项吗?
- 24.静态内部类--相当于一个外部类
- 25.使用匿名内部类的注意事项:
- 26.匿名内部类的使用场景:
- 27.普通内部类无法使用静态代码块,静态内部类才可以 。
- 28.如果内部类是静态的,其实相当于一个外部类。可以直接用外部类的对象调用内部类类名使用
- 29.如果内部类中定义了静态的成员,该内部类也必须定义成静态的否则会编译失败,
- ----代码块-----
- 30.有继承关系的,子父类构造代码,执行顺序是,先父类再子类。
- 31.构造代码块是给所有对象初始化的,构造函数是给特定的对象初始化的
- 32.为什么构造代码块优先构造方法执行?
- 33.局部代码块:
- 34.当内部类处于局部位置时,该内部类只能访问局部中被final修饰的局部变量。
- 35.局部内部类为什么只能访问final修饰的实例?
- ----修饰符-----
- 36.为什么外部类,只能用public和defult修饰符?
- 37.java中非静态内部类不能有静态代码块、静态方法、静态变量?
- 38.为什么非静态内部类中可以有静态常量?(static final)
- 39.private修饰构造方法
- 40.单例模式用的就是私有构造方法。
—上期回顾:静态和接口—
1.在本类中,静态方法只能直接调用静态方法。
如果new对象的话,就可以调用非静态方法了。
2.能建接口,就不要建抽象类。
抽象类不灵活,只能继承一次。
3.static变量放到公共的变量类里,static方法-会被单独放到工具类里
4.实现的两个接口中,成员同名怎么办?
1)冲突的成员常量不会被继承,不冲突的可以被继承。
2)公有默认方法冲突,必须重写。
3)静态方法,不会被继承,不会冲突。
5.测一下类和接口之间的冲突。
成员变量----会发生冲突,需要重新定义成员变量。
成员方法-----不会冲突,先extends 再implements 成员方法优先继承父类的,就会把接口的方法重写。
6.多态转型,没有编译期异常,编译器异常只:检查显示的类型转换。
7.多态相当于对类型的抽象。
------内部类-----
8.匿名内部类----测试的时候用的多。
9.内部类会被编译成字节码文件,相当于一个正常的外部类。
所以没有提高效率,lamada不会生成新的类文件提高了效率。
10.内部类可以被定义为抽象的。
11.内部类的好处是,可以很好的描述所属关系。
1)内部类可以很好的实现隐藏,也就是封装性。一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2)内部类拥有外围类的所有元素的访问权限
3)可是实现多重继承
4)可以避免修改接口而实现同一个类中两种同名方法的调用
12.外部类不能继承自己的内部类。
要是能继承,还要内部类干啥。
13.内部类可以直接访问外部类的成员,但是外部类得new内部类对象才可以访问。
14.外部类,想调用其他外部类的内部类,必须要先new内部类的外部类对象,再new内部类对象。
15.为什么内部类访问外部类成员需要写成:Outside.this.XX?
Outside.this—相当于外部类的引用,内部类能直接访问外部类成员,就是因为他持有外部类引用。
所以必须这么写outside.this.
底层原理
1 编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用;
2 编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值;
3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引。
16.需要学什么才能看懂字节码文件???
知道的请留言。
17.内部类里面-new 同级内部类,不需要New 外部类,可以直接new 同级内部类,相当于在同一个包中。
18.匿名内部类必须要继承或实现一个父类或接口。
19.匿名内部类的这种写法的优缺点:
1).优点:可以少定义一个“java文件”;
2).缺点:可读性差、编写也不容易、没有重用性…
不能向下转型。
20.什么时候用默认的访问修饰符修饰类?
自己设计模块用的类,就这一个模块内使用,就用默认的访问修饰符。其他模块用不到。
默认==友好同胞。同包内才可以使用。
21.接口中只能使用public。
22.匿名内部类没有访问修饰符。
23.成员内部类修饰符有什么注意事项吗?
四个修饰符都可以使用。
24.静态内部类–相当于一个外部类
1)静态内部类,不能访问外部类的非静态成员
2)静态内部类 不需要创建外部类的对象就可访问(外部类名.内部类 比如new MyMain.Person().display();就创建了静态内部类对象)
3)静态内部类可以有public、protected、默认的、private等多种类型 (这个功能我倒是从来没听说,通过实验的确ok)
25.使用匿名内部类的注意事项:
1) 当在创建内部类对象的时候可以调用子类特有的方法,当创建对象的父类引用类型时,就不能引用子类特有的方法了,因为对象已经向上进行了转型。
26.匿名内部类的使用场景:
当函数参数是接口类型时,且接口中的方法不超过三个,这个时候就可以用匿名内部类作为实际参数进行传递。
27.普通内部类无法使用静态代码块,静态内部类才可以 。
28.如果内部类是静态的,其实相当于一个外部类。可以直接用外部类的对象调用内部类类名使用
29.如果内部类中定义了静态的成员,该内部类也必须定义成静态的否则会编译失败,
----代码块-----
30.有继承关系的,子父类构造代码,执行顺序是,先父类再子类。
31.构造代码块是给所有对象初始化的,构造函数是给特定的对象初始化的
32.为什么构造代码块优先构造方法执行?
1)构造代码块是随着类的加载而加载的,只要类已存在,构造代码块就加载进内存,而构造函数时在创建对象的时候才会执行,因为此构造代码块会优先于构造函数执行。
33.局部代码块:
1)变量的生命周期,离开{ }之后便结束!
无法在代码块外部访问,可以防止引用类型的空指针异常。
2)目的:在局部代码块中定义并使用该变量,使用完成后,便释放该变量所在的内存空间
34.当内部类处于局部位置时,该内部类只能访问局部中被final修饰的局部变量。
35.局部内部类为什么只能访问final修饰的实例?
在使用内部类的时候,内部类有时会访问到外部类的变量,这时,如果被访问的外部变量如果不是final修饰的,就会报错。原因是因为内部内在引用外部类的变量时,是进行拷贝的,所以不是同一个引用了,内部类中的修改对外不可见,外部修改对内部类也不可见,这是不符合常规编程约定的,所以使用final修饰,直接规避了修改这个途径,杜绝了这个变量不同步的可能性。
----修饰符-----
36.为什么外部类,只能用public和defult修饰符?
对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。 因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。可以满足所有的情况了。
37.java中非静态内部类不能有静态代码块、静态方法、静态变量?
非静态内部类相当于外部类中的非静态成员变量,而如果外部类需要调用非静态成员变量就需要先实例化才可以,如果非静态内部类中有静态方法块,那么又可以在加载类的时候提前加载,不需要考虑外部类的实例化,所以有矛盾,所以不可以。
38.为什么非静态内部类中可以有静态常量?(static final)
因为常量存放在常量池中,在编译时就已经加载进去了,所以不需要考虑是否静态。
39.private修饰构造方法
private修饰构造方法的话,就只能在本类内部调用构造方法。其他类中想创建该类对象,只能通过该类的方法进行返回操作
单例模式就是使用的这种构造方法。