内部类

103 阅读3分钟

1.概念

  • 内部类就是类中之类,说白了就是在类里面还去定义一个类

  • 作用就是相对安全一点,实现数据对外隐藏

2.内部类有哪些?

  • 成员内部类(现阶段了解即可,因为你根本就不会这么写,所以只需要了解其调用规则即可)

  • 局部内部类

  • 静态内部类

  • 匿名内部类

3.语法

  • 看代码

4.特点

  • 1.内部类可以访问外部类的所有成员,哪怕是私有的都可以访问

  • 2.外部类如果要访问其自己的内部类成员,就必须创建其内部类的对象(就是对其内部类进行实例化)

public static void main(String[] args) { 
// 如何调用Inner的method方法
Outer outer = new Outer(); 
// System.out.println("a===="+outer.a);// 因为a是私有的,无法调用 
outer.method();//a===10
} }
class Outer{//外部类 
//成员变量 
private int a = 10; 
//成员方法 
public void method() {
//外部类如果要访问其自己的内部类成员,就必须创建其内部类的对象(就是对其内部类进行实例化) Inner i = new Inner();
i.method(); 
} 
//成员内部类 
class Inner{ 
// 成员内部类的成员方法可以访问到外部类的成员变量 
public void method() { 
System.out.println("a==="+a); 
} }

局部内部类

public static void main(String[] args) { 
// 如何调用print方法 
Outer2 o = new Outer2(); 
o.method(); 
} }
class Outer2{
public void method() { 
int num = 10; // 局部变量 生命周期随着方法调用而消失的,局部内部类不会随着方法消失而消失,因为gc回收是不定时回收,所以要加上final 
// final修饰的变量 而是一个常量,存储位置和局部变量不同,存在一个常量池里面,就不会随着方法调用结束而消失 
// 在jdk1.8之前是需要强制加上的,1.8之后对这个变量进行了处理,所以不需要加final 
// 局部内部类 
class Inner2{ 
public void print() {// 局部内部类成员方法
//num = 20; // num前面默认加了final,由final修饰的成员变量是常量 无法修改 System.out.println("num===="+num);//num====10
} 
} // 实例化Inner2 
Inner2 i = new Inner2(); 
i.print();
}

静态内部类

public static void main(String[] args) {
// 如何调用method方法?
// 这里不是在实例化Outer3 而是在实例化Inner3
// 因为static修饰的成员 变量 方法 内部类 ,都是可以通过类名直接.出来的 
Outer3.Inner3 oi = new Outer3.Inner3(); 
oi.method(); 
// 可以直接.出来 Outer3.Inner31.method(); 
}
} 
class Outer3{ 
// 静态内部类
static class Inner3{ 
public void method() {
System.out.println("静态内部类的成员方法...");
} } 
// 静态内部类2 
static class Inner31{ 
public static void method() {
System.out.println("静态内部类的成员方法...");
} } }

匿名内部类:没有名字的内部类

  • 前提条件:

  • 1.要求先存在一个类,或者一个接口(抽象类)

  • 接口中有且只有一个抽象方法的时候,就用匿名内部类

格式:

new 类名/接口名

 public static void main(String[] args) {
new Dog(){//相当于Dog的子类
    @Override
    public void eat() {
        System.out.println("狗吃肉");//对方法的重写
    }
}.eat();
    }}
     class Dog{
         public void eat() {
         }
     }

等价于

 public static void main(String[] args) {
cat c=new cat();
c.eat();
    }}
     class Dog{
         public void eat() {
         }
     }
     class cat extends Dog{
         public void eat() {
             System.out.println("猫吃肉");
         }
public static void main(String[] args) {
      Outer4 o = new Outer4();
      o.method();
   }
}
// 1.要求先存在一个类,或者一个接口(抽象类)
interface Inter{// 先决条件  一个接口
   void print(); // 接口中的抽象方法
   void show();// 第二个抽象方法
}
class Outer4 {// 外部类
   // 定义一个有名字的内部类去实现Inter接口,并重写其抽象方法
   class Inner4 implements Inter{
      // 重写Inter接口的抽象方法
      public void print() {
         System.out.println("print方法...");
      }
      public void show() {
         System.out.println("show方法...");
      }
   }   
   public void method() {
      // 父类引用指向子类对象  多态的体现...
      Inter i = new Inner4();
      i.print();
      i.show();
      // 采用匿名内部类的形式去实例化Inter接口
      // 父类引用指向子类对象  多态的体现...
      // 父类引用指向了一个没有名字的子类对象
       new Inter() {
         public void print() {
            System.out.println("print方法...");
         }
         public void show() {
            System.out.println("show方法...");
         }
      }.show();
   }