一、内部类
1.概念
在一个类的内部在定义一个完整的类。
内部类有4种:分别是 成员内部类、静态内部类、局部内部类、匿名内部类
class Outer{class Inner{}
}
2.特点
- 编译后可生成独立的字节码文件。Outer$Inner.class
- 内部类可以自接访问外部类的私有成员,而不破坏封装
- 可为外部类提供必要的内部功能组件
二、成员内部类
-
成员内部类实例化需要依赖外部类的实例,简单的说,想要内部类的实例,就要线创建外部实例类
-
成员内部类不能有静态属性、方法、构造块,但是可以有静态的常量
-
在我们成员内部类中想要访问外部类的属性
1. 方式1:实例化外部类 2. 方式2:外部类名.this.属性
-
当我们内部类和外部类有同名属性存在时,优先使用内部属性
-
实例化内部类的语法:
//方法一
OutSide o = new OutSide();
InSide i = o.new InSide();//方法二
InSide i = new OutSide().new InSide();
- 我们的成员内部类是可以加上访问修饰符的,如:private InSide{} 这个时候,外部类以外,没有人可以访问内部类
- 例题
public class Test {public static void main(String[] args) {//先声明一个外部类Outer o = new Outer();//调用外部内的方法得到外部类的属性o.show();//声明一个内部类Inner i = o.new Inner();//调用内部内的方法得到内部类的属性i.show();//调用内部内的方法操作外部类的属性i.showOut();}
}class Outer {private int outSider = 5; public void show() {System.out.println("外部类的变量:outSider="+outSider);}/*** * @author asus* @Description:成员内部类*/class Inner {int inSider = 10;public void show() {System.out.println("内部类的变量:inSider="+inSider);}public void showOut() {System.out.println("外部类的变量加5:outSider="+(outSider+5));}}
}
三、静态内部类
1.静态的内部类就是我们成员类部类前加上static
2.静态内部类同样可以加上访问修饰符
3.在静态内部类,可以定义静态与非静态的属性和方法
A:在外部类中可以通过静态内部类的全类名来调用静态内部类的静态属性、静态方法(外部类名.静态内部类名.属性)(外部类名.静态内部类名.方法)
B:在外部类中要先创建 内部类实例 来调用静态内部类的非静态属性和方法
C:在静态内部类中可以直接调用外部类的静态属性、静态方法
D:在静态内部类中要先创建 外部类实例 来调用外部类的非静态属性、非静态方法
四、局部内部类
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。
局部内部类访问 外部类 当前方法(创建局部内部类的方法) 中 的局部变量,因无法保障变量的生命周期与自身相同,变量必须使用final来修饰局部变量后,才能在局部内部类中使用
public class OutSide {public void OutShow() {final String age="18";/*** @Description:局部内部类*/class InSide{String name = "地球";public void show() {System.out.println("name="+name);System.out.println("age="+age);}}//实例内部类InSide i = new InSide();i.show();}public static void main(String[] args) {OutSide o = new OutSide();o.OutShow();}
}
五、匿名内部类
把对象的声明 实例化 类/接口方法的实现 全部合在一起
匿名内部类:没有名字的内部的类。
前提:接口或继承父类。
直接new匿名内部类的对象
匿名内部类适合:只使用一次,创建一次对象。
interface A {public void test();
}public class Test {public static void main(String[] args) {A a = new A() {// 从此处开始,就是匿名的内部类@Overridepublic void test() {System.out.println("实现接口A");}};// 到此处结束a.test();}
}