成员内部类:
-
成员内部类在类内部定义,与实例变量和实例方法同级;
-
创建内部类对象时必须依赖外部类对象;
-
内部类中不能包含静态成员,但是可以是静态常量;
package com.oop.Class;
public class Outer {
private String name = "小叶";
public int age = 21;
private int id = 1111;
class Inner{
//如果出现属性和外部类相同的情况,优先使用内部类的
// 若要使用外部类,外部类.this.属性
int age = 22;
String name = "小红";
// 内部类中不能包含静态成员,但是可以是静态常量,加final
static final int nummber = 100;
public void out(){
System.out.println(nummber);
System.out.println(name);
System.out.println(Outer.this.name);
System.out.println(age);
System.out.println(id);
}
}
}
package com.oop.Class;
public class TestOuter {
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();
inner.out();
}
}
静态内部类:
package com.oop.Class;
public class Outer02 {
private int age = 18;
public String name = "小叶";
// 静态内部类和外部类级别相同
// 只有静态内部类能加static修饰符,普通的类不能
static class Inner02{
private String adderss = "珠穆朗玛峰";
public String phone = "123344556";
// 静态成员
static String name2 = "小红";
public void out(){
// 调用外部类属性的需要创建一个外部类对象
Outer02 outer02 = new Outer02();
System.out.println(outer02.age);
System.out.println(outer02.name);
// 调用静态内部类的属性
System.out.println(adderss);
System.out.println(phone);
// 调用静态属性
System.out.println(Inner02.name2);
}
}
}
package com.oop.Class;
public class TestOuter02 {
public static void main(String[] args) {
Outer02.Inner02 inner02 = new Outer02.Inner02();
inner02.out();
}
}
局部内部类:
package com.oop.Class;
public class Outer03 {
private int age = 18;
public String name = "飞飞公主";
public void out(){
// 局部变量不能加任何访问修饰符
String adddress = "喜马拉雅山脉"; // 为保证生命周期和局部内部类相同,局部变量会变成常量
// 局部内部类不能加任何访问修饰符
// 局部内部类使用范围局限于方法内部
class Inner03{
private String name = "貂蝉";
public int id = 123;
// 局部内部类里面不能有静态成员,但是可以是静态常量
final static String skill = "dance";
public void out02(){
// 访问外部类的属性
System.out.println(Outer03.this.name);
System.out.println(Outer03.this.age);
// 访问局部变量:jdk1.7要求变量必须是常量,jdk1.8后自动添加了final
System.out.println(adddress);
System.out.println("===================");
// 访问内部类的属性
System.out.println(this.name);
System.out.println(this.id);
}
}
// 使用局部内部类----在方法内部创建局部内部类对象
Inner03 inner03 = new Inner03();
inner03.out02();
}
}
package com.oop.Class;
public class TestOuter03 {
public static void main(String[] args) {
Outer03 outer03 = new Outer03();
outer03.out();
}
}
匿名内部类:
- 没有类名的的局部内部类(一切特征都与局部内部类相同)
- 必须继承一个父类或者实现一个接口
- 定义类,实现类,创建对象的语法合并,只能创建一个该类的对象
package com.oop.Class;
public interface Usb {
void service();
}
package com.oop.Class;
public class Mouse implements Usb{
@Override
public void service() {
System.out.println("连接电脑成功,鼠标正在工作...");
}
}
package com.oop.Class;
import javax.swing.*;
public class TestUsb {
public static void main(String[] args) {
// Usb usb = new Mouse();
// usb.service();
// 局部内部类
// class KeyBoard implements Usb{
// @Override
// public void service() {
// System.out.println("连接电脑成功,键盘正在工作...");
// }
// }
// 使用局部内部类创建对象
// Usb usb = new KeyBoard();
// usb.service();
// 使用匿名内部类优化 (相当于创建了一个局部内部类)
Usb usb = new Usb() {
@Override
public void service() {
System.out.println("连接电脑成功,键盘正在工作...");
}
};
usb.service();
}
}
————————————————————
————————————
————