常规内部类
Q:常规内部类能否使用外部类的属性和方法?
A: 可以。本质还是因为常规内部类对象依赖于创建好的外部类对象。
Q:外部类能否使用常规内部类的属性和方法?
A:可以,但必须创建内部类对象,通过内部类对象使用内部类的属性和方法,包括private权限的。
Q:如何创建一个常规内部类对象?
A:
Outter o=new Outter();
OUtter.Inner i=o.new Inner();
Q:常规内部类可是定义静态属性吗?
A:不可以。
public class Outter{
public class Inner{
public static Inner innerInstance=new Inner();
}
}
内部类对象的创建必须依附外部类对象,而上面这个例子,在调用内部类static属性时,内部类加载并初始化,这时就将创建一个内部类对象,这和定义是违背的,所以常规内部类中不可以定义静态属性。
Q:外部类加载时会加载内部类吗?
A:不会。包括静态内部类也不会。
静态内部类
Q:静态内部类与常规内部类的区别
A:
- 静态内部类创建不依赖外部类对象,可直接创建内部类对象
- 静态内部类只能访问外部类的静态属性和方法
- 静态内部类可以静态和非静态的属性和方法
局部内部类
Q:局部内部类能在方法外创建对象吗?
A:不能。局部内部类对象只能在当前方法中创建,但可以在外部获取到创建的对象。
Q:局部内部类有权限修饰吗?
A:没有。因为局部内部类对象只能在当前方法中创建,所以不涉及权限问题。
Q:局部内部类可以使用外部类对象和方法吗?
A:可以。
Q:如何创建局部内部类对象?
A:
- 在局部方法中创建局部内部类对象:
package com.inner.local;
public class Outter {
public static void main(String[] args) {
Outter o = new Outter();
o.show();
}
public void show() {
class Inner {
public void showInner() {
System.out.println("Inner");
}
}
Inner i = new Inner();
i.showInner();
}
}
- 在外部获取局部内部类对象,通过接口回调:
package com.inner.local;
public interface UseInner {
void showInner();
}
package com.inner.local;
public class Outter {
public static void main(String[] args) {
UseInner ui = new Outter().show();
ui.showInner();
}
/**
* 定义一个方法返回UseInner接口对象
* @return 返回一个Inner对象
*/
public UseInner show() {
/**
* 局部内部类实现UseInner接口
* @author 83998
*
*/
class Inner implements UseInner {
@Override
public void showInner() {
System.out.println("Inner");
}
}
return new Inner();
}
}
Q:为什么局部内部类可以访问方法中的局部变量但不能进行修改?
A:为什么局部内部类可以访问方法中的局部变量但不能进行修改?
匿名内部类
new class|interface|abstractClass(){
@Override
}