Java-内部类
内部类
什么是内部类
- 在类的内部比那些的类就叫内部类!
- 一个类的内部又完整的嵌套在另一个类结构中,被嵌套的类称之为内部类(inner class),嵌套的其他类称之为外部类(outer class);
类的五大成员
- 属性
- 方法
- 构造器
- 代码快
- 内部类
内部类的优点
- 可以访问外部类的私有成员,从而实现了封装
- 方便将存在一定逻辑关系的类组织在一起,又可以对外界进行隐藏,不暴漏实现细节;
- 方便编写事件驱动程序
- 方便编写线程代码
- 可以实现多重继承,一个类可以继承多个接口
成员内部类
在类的内部,方法的外部编写的类
// 定义一个外部类
public class OuterClass {private String name = "张三"; // 定义一个私有成员变量// 定义一个成员内部类public class InnerClass {// 定义一个方法,访问外部类的私有成员变量public void display() {System.out.println("外部类的name值为: " + name);}}
}
特点:
- 成员内部类可以无条件的访问外部类的所有成员属性,成员方法(包括private成员和静态成员)
- 成员内部类可以实现更好的封装,使得代码更加的安全可靠;
- 成员内部类可以实现多重继承,一个类可以继承多个接口。
- 成员内部类可以对同一个包中的其他类隐藏起来,不暴露其实现细节。
- 成员内部类是定义在另一个类中的类。
注意:
成员内部类可以使用四种访问权限
- public(公开的)
- protected(受保护的)
- default(缺省/默认的)
- private(私有的)
实例化对象
//外部类创建对象
OuterClass outerClass = new OuterClass();
/*** 外部类名称.内部类名称 对象名称 = 外部类实例化对象.new 内部类的构造方法();*/
MapOuterClassDemo.InnerClass innerClass = outerClass.new InnerClass();/*** 外部类名称.内部类名称 对象名称 = new 外部类构造方法().new 内部类的构造方法();*/
MapOuterClassDemo.InnerClass innerClass = new OuterClass().new InnerClass();
调用内部类的方法
//成员内部类对象调用成员内部类方法
innerClass.display();
局部内部类
局部内部类是定义在方法或作用域内的类,它只能在该方法或作用域内使用,不能在外部类的其他方法中使用。
// 定义一个外部类
public class OuterClass {private String name = "张三";// 定义一个方法(在方法中定义一个内部类)public void myMethod() {// 定义一个局部内部类class LocalInnerClass {public void display() {System.out.println("外部类的name值为: " + name);}}// 创建局部内部类的实例LocalInnerClass inner = new LocalInnerClass();// 调用局部内部类的方法inner.display();}
}
特点
- 局部内部类可以访问外部类的所有成员,包括私有成员,这样可以方便的访问外部类的成员变量和方法。
- 局部内部类的优点是可以实现更好的封装,使代码更加的安全可靠。
- 局部内部类可以实现多重继承,一个类可以继承多个接口
注意:
- 局部内部类可以使用final修饰符
- 不能使用:
- public(公开的)
- private(私有的)
- protected(受保护的)
实例化对象
// 创建外部类的实例
OuterClass outer = new OuterClass();
调用方法
// 调用外部类的方法,该方法中创建了局部内部类的实例并调用其方法
outer.myMethod();
匿名内部类
匿名内部类是一种没有名字的内部类,通常用于创建只需要使用一次的类的示例。
通常用作接口的实现类或抽象类的子类。
//定义一个接口
public interface MyInterface {void doSomething();
}public class MyClass {//在main方法中使用匿名内部类实现了这个接口public static void main(String[] args) {// 使用匿名内部类实现接口MyInterface myInterface = new MyInterface() {@Overridepublic void doSomething() {System.out.println("具体实现代码...");}};//创建了一个MyInterface类型的对象myInterface,并调用了其方法myInterface.doSomething();}
}
特点
- 没有类名,直接使用new关键字创建对象并实现接口或继承抽象类
- 只能使用一次,因为没有类名,无法重复使用
- 通常用于简化代码,避免编写大量的实现或子类
注意:
- 匿名内部类不能有构造方法,因为没有类名
- 如果要访问外部类的成员变量或者方法,需要将其声明为final 或 effectively final
- 匿名内部类中可以定义自己的成员变量和方法,但是不建议这样做,因为只能使用一次,没有必要添加复杂度
- 匿名内部类中可以访问外部类的private成员,因为它们在同一个类中。
静态内部类
静态内部类是在类内部定义一个静态类,
// 定义外部类
public class OuterClass{// 定义静态内部类public static class StaticInnerClass{// 静态内部类方法public void doSummething(){System.out.println("实现代码 ");}}
}
特点
- 可以有自己的成员变量和方法,也可以访问外部类的静态成员和方法
- 可以直接使用外部类的静态成员和方法,不需要创建外部类对象
- 可以定义自己的静态成员和方法,与外部类的静态成员和方法没有任何区别
- 可以访问外部类的private成员,因为是在同一个类中
- 静态内部类不能访问外部类的非静态成员和方法,因为他们在创建对象时才会被初始化
注意:
- 静态内部类不能访问外部类的非静态成员和方法,因为他们只有创建对象时才会初始化
- 静态内部类可以直接使用外部类的静态成员和方法,不需要创建外部类的对象
- 静态内部类可以定义自己的静态成员和方法,与外部类的静态成员和方法没有任何区别
创建对象
//创建静态内部类的对象
OuterClass.StaticInnerClass innerClass = new OuterClass.StaticInnerClass();
调用方法
innerClass.doSomething();