版权声明: https://blog.csdn.net/qq_40794602/article/details/86775163
内部类:
- 默认内部类
- 私有内部类
- 静态内部类
- 局部内部类
- 匿名内部类
默认内部类:
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
- 外部类名.内部类名 对象名 = 外部类对象.内部类对象
- EG:
public class J1 { public static void main(String[] args) { Outer.Inner out_in = new Outer().new Inner(); out_in.show(); } } class Outer{ int a = 10; class Inner{ public void show(){ System.out.println(a); } } }
私有内部类EG:
class OuterA{
int a = 10;
private class InnerA{
public void test2(){
System.out.println("InterA test2......");
}
}
public void test1(){ //私有内部类通过类内方法进行使用
InnerA a = new InnerA();
a.test2();
}
}
静态内部类EG:
public class J1 {
public static void main(String[] args) {
OuterC.Inner inner = new OuterC.Inner();//调用方法和默认内部类不一样
inner.test();
OuterC.Inner1.test();
}
}
class OuterC{
static class Inner{
public void test(){
System.out.println("Inner test...");
}
}
static class Inner1{
public static void test(){
System.out.println("Inner1 test...");
}
}
}
局部内部类:
- 局部内部类访问局部变量必须用final修饰
- 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么:因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
- 但是jdk1.8取消了这个事情,所以我认为这是个bug
- EG:
public class J1{ public static void main(String[] args){ Outer out = new Outer(); out.test(); } } class Outer{ public void test(){ final int a = 10; class Inner{ public void show(){ System.out.println(a); } } Inner in = new Inner(); in.show(); } }
匿名内部类:
- 匿名内部类就是内部类的简化写法
- 写匿名内部类前提是存在一个抽象类或者接口
- 匿名内部类格式:new 抽象类或者接口名(){ 重写方法; }
- 匿名内部类本质是什么呢:是一个继承了该类或者实现了该接口的子类匿名对象。
- 匿名内部类的特点:匿名内部类必须实现接口的所有方法;匿名内部类必须实现抽象类的所有方法
- 匿名内部类的方法调用:像普通对象一样,调用方法即可
- 抽象类EG:
public class J1{ public static void main(String[] args){ A a = new A(){ public void show(){ System.out.println("show方法"); } }; a.show(); } } abstract class A{ public abstract void show(); }
面试题:
//控制台输出30,20,10。
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
补充:
- eclipse常用快捷键
- eclipse中jar包的使用