> 文章列表 > Java-内部类

Java-内部类

Java-内部类

部类

什么是内部类

  • 在类的内部比那些的类就叫内部类!
  • 一个类的内部又完整的嵌套在另一个类结构中,被嵌套的类称之为内部类(inner class),嵌套的其他类称之为外部类(outer class);

类的五大成员

  • 属性
  • 方法
  • 构造器
  • 代码快
  • 内部类

内部类的优点

  1. 可以访问外部类的私有成员,从而实现了封装
  2. 方便将存在一定逻辑关系的类组织在一起,又可以对外界进行隐藏,不暴漏实现细节;
  3. 方便编写事件驱动程序
  4. 方便编写线程代码
  5. 可以实现多重继承,一个类可以继承多个接口

成员内部类

在类的内部,方法的外部编写的类

// 定义一个外部类
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();