java从小白到老白⑤——传智播客27版笔记
- 今天主要说些内部类的相关基础知识,如果能做出下面这个小题目,再下面的内容不看也罢(面试题答案在最后)
内部类面试题:补全下列代码,实现目标输出,其中描述阶段的数字只能调用已有变量,不能用其他方式public class TestInner1 { public static void main(String[] args) { //调用 } } class Programmer{ private int n = 1; class Bald{ private int n = 2; public void expert() { int n = 3; System.out.println("level " + *** + ":programmer"); System.out.println("level " + *** + ":bald"); System.out.println("level " + *** + ":expert"); } } }
输出目标:
level 1:programmer level 2:bald level 3:expert
- 内部类(一般内部类是为了增强安全性,不易被外界访问)
1.访问特点:
①内部类可直接访问外部类的成员,包括私有
②而外部类想要访问内部类的成员,需要先创建对象
2.(1)成员内部类
①直接访问内部类:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
eg:
package javaBasic;
public class TestInner {
public static void main(String[] args) {
new Stripling().new Diligent().need();
}
}
class Stripling{
class Diligent{
public void need() {
System.out.println("Make a great effort to pass CET-6 at one time!");
}
}
}
②成员内部类被静态修饰后的访问方式是:外部类名.内部类名 对象名 = new 外部类名.内部类名();
eg:
package javaBasic;
public class TestInner {
public static void main(String[] args) {
new Stripling. Diligent().need1();
}
}
class Stripling{
private int num1 = 1;//static的内部类Diligent不能访问外部类的非static成员
private static int num2 = 2;
public static class Diligent{
public void need() {
System.out.println(num2 + "\nMake a great effort to pass CET-6 at one time!");
}
public static void need1() {
System.out.println(num2 + "1\nMake a great effort to pass CET-6 at one time!");
}
}
}
3.局部内部类
①局部内部类访问局部变量必须用final修饰
a.局部变量是随着方法的调用而调用,随着调用完毕而消失
b.相比之下,堆内存的内容不会立即消失(堆内存随着垃圾回收器的作用而消失)
c.综合a、b,我们需要用final修饰,变量变常量——内存中存储的是对应的数据值
4.匿名内部类:继承了相应的类或者实现了相应接口的子类匿名对象,功能上可理解为内部类的简化写法
①前提:存在一个类(可是具体类也可是抽象类)或接口
②格式:new 类名或者接口名(){
重写方法;
}
- 顺序问题:package>import>class
- 修饰符:
①权限修饰符:private,default,protected,public
②状态修饰符:static,final
③抽象修饰符:abstract
(1)类:
①权限修饰符:private,default,protected,public
②状态修饰符:final(因为内部类可以看做外部类的成员,则内部类可以用static修饰)
③抽象修饰符:abstract
(2)成员变量:
①权限修饰符:private,default,protected,public
②状态修饰符:static,final
(3)构造方法:
①权限修饰符:private,default,protected,public
(4)成员方法:
①权限修饰符:private,default,protected,public
②状态修饰符:static,final
③抽象修饰符:abstract
(5)the other组合方式:
成员变量:public static final//静态成员常量
成员方法:public static
public final
public abstract
- 面试题答案:
package javaBasic; public class TestInner1 { public static void main(String[] args) { new Programmer().new Bald().expert(); } } class Programmer{ private int n = 1; class Bald{ private int n = 2; public void expert() { int n = 3; System.out.println("level " + Programmer.this.n + ":programmer");//通过外部类名限制this范围 System.out.println("level " + this.n + ":bald"); System.out.println("level " + n + ":expert"); } } }