1.内部类
概念
- 在一个类的内部在定义一个完整的类
特点
- 编译之后可生成独立的字节码文件
- Outer.class && Outer$Inner.class
- 内部类可直接访问外部类的私有成员,而不破坏封装
- 可为外部类提供必要的内部功能组件
/**
* 内部类四种形式:
* 1 成员内部类
* 2 静态内部类
* 3 局部内部类
* 4 匿名内部类
*/
public class Outer {
private String name;
//内部类:一个类中包含一个完整的类,里层的类称为内部类,外层类称为外部类
class Inner{
}
}
分类
成员内部类
- 在类的内部定义、与实例变量、实例方法同一级别
- 创建成员内部类对象要依赖外部类对象
- Outer out = new Outer();
- Inner in = out.new Inner();
- 二合一 new Outer().new Inner();
- 特点
- 成员内部类可以使用任何访问修饰符
- 因为成员内部类与实例属性、实例方法同级别
- 外部类只能用public和默认的
- 成员内部类可直接访问外部类的属性和方法
- 因为成员内部类与实例方法同级别
- 当外部类与内部类存在重名属性时,会优先访问内部类属性,使用“外部类名.this”访问外部类的属性
- 成员内部类不能定义静态成员(属性和方法)
- 在类加载的时候,static变量就会被初始化,那么我们Inner对象在没有Outer这个对象的时候便生成了。这样这个成员内部类就脱离了外部类的掌控,不需要外部类的对象就可以生成内部类的对象,这与成员内部类的定义就相驳了,因为我们知道成员内部类的对象必须是现有外部类的对象才能创建,并且是绑定在一起的,所以成员内部类不可以定义静态变量。
- 成员内部类是和实例方法同级别
- 在加载Outer外部类的时候,内部类的静态属性就会被初始化,这是不被允许的,因为内部类没有new对象
- 成员内部类可以包含静态常量
- static final 特殊不可改变
- 在外部类加载的时候就已经赋值,将值替换成初始值,不可改变。加载一次,定义了也没有关系
- 成员内部类可以使用任何访问修饰符
public class Outer {
//实例属性
private String name="张三";
private int age=20;
//实例方法
public void show(){
System.out.println(name+"...."+age);
}
//成员内部类:在类的内部定义,与实例变量、实例方法同级别的类。
//特点:
/*
1成员内部类可以使用任意访问修饰符。
2成员内部类可以直接访问外部类的属性和方法。
3成员内部类中属性和外部类的属性同名时,使用"外部类名.this"访问外部类的属性
4成员内部类不能包含静态成员,但是可以包含静态常量。*/
class Inner{
private String phone="1316737137";
private String address="北京";
private String name="灿灿";
public void show(){
System.out.println(phone+"..."+address);
System.out.println(this.name+"======="+Outer.this.age);
System.out.println(Outer.this.name+"======="+Outer.this.age);
}
}
}
public class Test {
public static void main(String[] args) {
//1 创建外部类对象
/*
Outer outer=new Outer();
outer.show();
//2 创建内部类对象
Outer.Inner inner=outer.new Inner();
inner.show();
*/
//合二为一
Outer.Inner inner2 = new Outer().new Inner();
inner2.show();
}
}
Click here to view the copyright notice of this site(点击此处查看本站版权声明)
必须 注册 为本站用户, 登录 后才可以发表评论!