java基础之内部类

2018-06-12  本文已影响0人  沈默的头号狗腿

内部类:类里面再声明类

1》默认内部类

class Outer{

private int a = 12;

class Inner{

public void test2(){

//"内部类"可以直接访问"外部类"的成员,包括私有。

System.out.println("内部类访问外部的变量a=" + a);

}

}

}

创建内部类方式:Outer.Inner inner = new Outer().new Inner();

在内部类方法中访问外部类成员变量 Outer.this.a

访问内部类成员变量 this.a

访问方法内变量 a

2》私有内部类

class Outer{

private int a = 12;

private class Inner{

public void test2(){

System.out.println("内部类访问外部的变量a=" + a);

}

}

public void test1(){

Inner inner = new Inner();

inner.test2();

}

}

私有内部类外部无法访问

3》静态内部类

class Outer{

private int a = 12;

static class Inner{

public void test2(){

System.out.println("内部类访问外部的变量a=" + a);

}

}

}

创建方式:Outer.Inner inner =new Outer.Inner();

4》局部内部类

class Outer{

public void test1(){

final int a = 10;//局部变量

class Inner{//局部内部类

public void test2(){

System.out.println(a);

}

}

Inner inner = new Inner();

inner.test2();

}

}

面试题:局部内部类访问该方法内局部变量时,变量要加final修饰,为什么?

因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。

这里存在一个疑问,那就是它的引用如何能被传递出去,我试过在外部类中定义该内部类的引用,结果是无法找到该类。

jdk1.8,不加final代码不会报错,jdk1.7以下的版本不写final会报错

其实就是在jdk1.8的环境下,系统帮你默认添加了final关键字

匿名内部类

记住,这种匿名内部类的内部是相对于外部类而言的,不是相对于接口或者抽象类

  》抽象类的匿名内部类

  》接口的匿名内部类

  》new 抽象类 或者接口,都必须实现里面的所有未实现的方法

java接口中可以定义类,也不仅限于抽象类。只是接口本身不能被实例化,接口内部的类是可以实例化的。

调用接口的内部类有两种方法:

1.接口名.类名 Outer.Inner inner =new Outer.Inner();

2.创建实现类implements接口,再直接实例化内部类

上一篇 下一篇

猜你喜欢

热点阅读