常见问题
1.内部类、局部内部类、匿名内部类和静态内部类
- 成员内部类:可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
- 局部内部类:是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
- 匿名内部类:多创建接口的实例对象或者抽象类的子类对象,多用于接口回调。匿名内部类在编译的时候由系统自动起名为 Outter$1.class,按照数字序号起名。
- 静态内部类:
1.要创建静态类的对象,并不需要其外围类的对象。
2.静态类的对象中只能访问静态成员和变量
3.普通内部类不能有static数据和字段,也不能包含嵌套类
1.概念
将一个类的定义放在另一个类的定义内部,叫内部类。
成员内部类可访问外部类所有的方法和成员变量。
不能有静态的方法和成员变量。
public class Outer {
String name;
class Inner{
String iName;
}
}
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
内部类可以访问外围类的方法和字段,就像自己拥有它们似的,带来许多方便。
所以内部类自动拥有对其外围类所有成员的访问权。
内部类的对象之能在其外围类的对象关联的情况下才能被创建。构建内部类对象时,需要一个指向其外围类对象的引用。
2 .this 和 .new
内部类中获取外部类引用时,可以直接使用.this关键字。
在创建内部类时,可以直接使用外部类的引用和.new关键字 创建内部类对象。
3.内部类-向上转型
public class Outer {
String name;
public class Inner implements Contents{
@Override
public void xxx() {
}
}
}
interface Contents{
void xxx();
}
//main 执行转型操作
Outer outer = new Outer();
Contents inner = outer.new Inner();
4.方法和作用域内的内部类
使用场景:
1.实现了某类型的接口,可以创建并返回对其的引用。
2.想要解决一个复制问题,创建一个类来辅助你的解决方案,可是又不希望这个类是公共可用的。
class Outer{
public Runnable getXXX(){
class Inner implements Runnable{
public void run(){
}
}
return new Inner();
}
}
//if 作用内部可以创建内部类
if(true){
class Inner implements Runnable{
public void run(){
}
}
new Thread(new Inner()).start();
}
5.匿名内部类
没有具体引用名称的内部类,叫内部类。
没有类名,没有class关键字也没有extends和implements等关键字修饰。类的定义和对象的实例化同时进行。
6.静态内部类(嵌套类)
普通内部类对象隐藏地保存了一个引用,指向创建它的外围类对象。然而当内部类为静态static时,情况发生了变化。
1.要创建静态类的对象,并不需要其外围类的对象。
2.不能从嵌套类的对象中访问非静态的外围类对象。
3.普通内部类不能有static数据和字段,也不能包含嵌套类。
只能访问外部类的静态成员变量与静态方法。
静态内部类的非静态成员可访问外部类的静态变量,而不可访问外部类的非静态变量。
7.为什么需要内部类
内部类继承自某个类和实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。
外围类实现接口不是总能享用到接口带来的方便,有时候需要用到接口的实现。每个内部类都能独立地继承一个接口的实现,所以无论外围类是否已经继承了某个接口的实现,对于内部类没有影响。