内部类
就是在一个类的内部再定义一个类
-
成员内部类
-
静态内部类 static
-
局部内部类
-
匿名内部类
成员内部类
在类的内部定义,与实例变量、实例方法同级别的类。
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
//1创建外部类对象 // Outer outer = new Outer(); //2创建内部类对象 // Inner inner = outer.new Inner();
当外部类、内部类存在重名属性时,会优先访问内部类属性。
-
内部类属性和外部类的属性名字相同Outer.this
成员内部类不能定义静态成员。
public class Outer {
// 实例变量
private String name = "张三";
private int age = 20;
// 内部类
class Inner {
private String address = "北京";
private String phone = "110";
//private static final String coutry="中国"成员内部类**不能定义**静态成员,加个final可以,算是静态常量
// 方法
public void show() {
// 打印外部类的属性
System.out.println(Outer.this.name);
System.out.println(Outer.this.age);
// 打印内部类中的属性
System.out.println(this.address);
System.out.println(this.phone);
}
}
}
public class TestOuter {
public static void main(String[] args) {
//1创建外部类对象
// Outer outer = new Outer();
//2创建内部类对象
// Inner inner = outer.new Inner();
//一步到位
Inner inner = new Outer().new Inner();
inner.show();
}
}
静态内部类
级别和外部类相同
public class Outer {
private String name = "xxx";
private int age = 18;
// 静态内部类:和外部类相同
static class Inner {
private String address = "上海";
private String phone = "111";
// 静态成员
private static int count = 1000;
public void show() {
// 调用外部类的属性呢
// 1.先创建外部类对象
Outer outer = new Outer();
// 2.调用外部类对象的属性
System.out.println(outer.name);
System.out.println(outer.age);
// 调用静态内部类的属性和方法
System.out.println(address);
System.out.println(phone);
// 调用静态内部类的静态属性
System.out.println(Inner.count);
}
}
}
public class TestOuter {
public static void main(String[] args) {
// 直接创建静态内部类对象
Outer.Inner inner = new Outer.Inner();
/*Outer.Inner inner = new.Outer().Inner();*///Outer加个括号就是创建对象
// 调用方法
inner.show();
}
}
局部内部类
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final
前面不能加任何访问修饰符
在局部内部类不调用局部变量下,就是普通变量,可以修改
public class Outer {
private String name = "刘德华";
private int age = 35;
public void show() {
// 定义局部变量
String address = "深圳";
// 局部内部类:注意不能加任何访问修饰符
class Inner {
// 局部内部类的属性
private String phone = "15588888888";
private String email = "liudehua@qq.com";
public void show2() {
// 访问外部类的属性
System.out.println(Outer.this.name);
System.out.println(Outer.thisage);
//访问内部类的属性
System.out.println(this.phone);
System.out.println(this.email);
//访问局部变量,jdk1.7要求必须是常量final,jdk1.8之后自动添加final
System.out.println(address);
}
}
}
}
匿名内部类
-
没有类名的局部内部类(一切特征都与局部内部类相同)
-
必须继承一个父类或者实现一个接口
-
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
没有名字初始化类,不用将实例保存到变量中
new Apple().eat();
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
//通过这个外部类来实例化内部类
Outer.Inner inner = outer.new Inner();
inner.in();
inner.getID();
}
}
public class Outer {
private int id;
public void out(){
System.out.println("这是外部类的方法");
}
/*public*/ class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性
public void getID(){
System.out.println(id);
}
}
}
匿名内部类
//使用匿名内部类优化(相当于创建了一个局部内部类)
Usb usb = new Usb() {
@Override
public void service() {
System.out.println("连接电脑成功,风扇开始工作了....");
}
};
usb.service();
这个可以直接用
//new Apple().eat(); new Mouse().service();

TestUsb$1.class 可以理解为匿名内部类的名字
988

被折叠的 条评论
为什么被折叠?



