1.内部类:将一个类的定义放在另一个类的内部。
2,。为什么需要内部类?
一般来说,内部类继承自某个类或实现某个接口内部类的代码操作创建它的外围类的对象。主要的原因是:每个内部类都能独立的继承一个接口的实现,所以无论是外围类是否已经继承了某个接口的实现,对于内部类没有影响。内部类有效地实现了“多重继承”。
3.内部类分类:
成员内部类
静态内部类
局部内部类
匿名内部类
成员内部类:定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类。
创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数),可以理解为隐式地保存了一个引用,指向创建它的外部类对象。
在成员内部类中访问外部类的成员方法和属性时使用:外部类名.this.成员方法/属性
package interClass;
public class InterClassNew {
class B{
private String s;
B(String h){
s=h;
}
String reads() {
return s;
}
}
public static void main(String[] args) {
InterClassNew i=new InterClassNew();
InterClassNew.B b=i.new B("abc");
System.out.println(b);
}
}
成员内部类的优点:⑴ 内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
⑵ 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
静态内部类:静态内部类定义在类中,任何方法外,用static定义,静态内部类可定义静态或者非静态的成员
创建静态内部类:外部类.内部类 内部类对象引用=new 外部类().内部类()
静态内部类不能访问外部类的普通方法,普通属性。只能访问外部类静态域。
静态内部类可以用于自己的普通方法,普通属性。
package interClass;
public class InterClassNew {
class B{
private String s;
B(String h){
s=h;
}
String reads() {
return s;
}
}
局部内部类:在方法中定义的内部类,与局部变量类似,在局部内部类前不加修饰符public或private,其范围为定义它的代码块。。局部内部类中不可定义静态变量,可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的。
为什么要使用局部内部类?
a.当你实现了某类型的接口可以创建并返回对其的作用。
b.你要解决一个问题时,想要创建一个类来辅助你解决方案,但是又不希望类时公用的。
public class Outer {
private int s = 100;
private int out_i = 1;
public void f(final int k){
final int s = 200;
int i = 1;
final int j = 10;
class Inner{ //定义在方法内部
int s = 300;//可以定义与外部类同名的变量
//static int m = 20;//不可以定义静态变量
Inner(int k){
inner_f(k);
}
int inner_i = 100;
void inner_f(int k){
System.out.println(out_i);//如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
System.out.println(k);//*****可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的*****
// System.out.println(i);
System.out.println(s);//如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
System.out.println(this.s);//用"this.变量名" 访问的也是内部类变量
System.out.println(Outer.this.s);//用外部"外部类类名.this.变量名" 访问的是外部类变量
}
}
new Inner(k);
}
public static void main(String[] args) {
//访问局部内部类必须先有外部类对象
Outer out = new Outer();
out.f(3);
}
}