面试题--(内部类、代码块和修饰符)javaSE基础查漏补缺day03

内部类、代码块和修饰符

  • ---上期回顾:静态和接口---
  • 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修饰构造方法的话,就只能在本类内部调用构造方法。其他类中想创建该类对象,只能通过该类的方法进行返回操作
单例模式就是使用的这种构造方法。

40.单例模式用的就是私有构造方法。

你可能感兴趣的:(java,开发语言,后端,面试,内部类)