内部类

内部类

内部类是写在类里面的类,在一个类中,还可以定义多个类,内部类可以直接直接获取外部类中的所有属性和方法,就算是私有属性也可以获得。如果说继承像父亲和儿子,那外部类和内部类的关系就像丈夫和妻子,只不过这里是一夫多妻制。内部类像妻子,可以直接使用外部内中所有东西。但内部类不是个称职的妻子,外部内不能使用内部类中的属性和方法。(除了类中的类,还有写在方法中的类,叫做局部内部类。但不推荐使用。)

内部类就是在一个类中再定义一个类,这个类可以直接使用外部类中的所有方法和属性,但如果内部类被static修饰的,会比外部类更早生成,这样就不能使用外部类的东西了。在调用内部类时,需要先初始化外部类,再用外部类来调用内部类。

调用方法,先实例化外部类后:

外部类 . 内部类 对象 = 外部类 . new 内部类();

 

创建内部类

package oop.Demo08;

//外部类
public class Outer {
  private int ID = 5;
  public void go (){
      System.out.println("外部类");
  }


  //内部类
  public class Inner{
      public void in (){
          System.out.println("内部类");
      }

      public void gatID(){
          System.out.println(ID);//可以直接获取到外部类的私有属性
      }
  }
}

测试类

package oop;

import oop.Demo08.Outer;

public class Application {
  public static void main(String[] args) {

      Outer outer = new Outer();//实例化外部类

      Outer.Inner inner = outer.new Inner();//通过外部类再实例化内部类

      outer.go();//输出外部类的方法
      inner.in();//输出内部类的方法
      inner.gatID();//输出内部类获取到外部类的私有属性的方法
  }
}

多种不同的内部类

1. 内部类还可以写在一个类的外面,不被外部内所包含,相当于一个类的界面出现两个类。由于class可以定义无数个,但public class只能定义一个,所以没有public的类就被当做内部类,这种类不能直接调用外部内的私有属性和方法。但可以正常的使用main方法,一般作为测试类使用。

package oop.Demo08;

//外部类
public class Outer {
   private int ID = 5;
   public void go (){
       System.out.println("外部类");
}
}//外部内的大括号截止到这里

//写在外面的内部类
class Cc{
   public static void main(String[] args) {

  }
}

 

2. 写在方法中的变量,叫局部变量。所以,写在方法中的内部类,叫做局部内部类。局部内部类中还可以在定义方法和内部类。

package oop.Demo08;

//外部类
public class Outer {
   private int ID = 5;
   public void go (){
       System.out.println("外部类");
  }


   //内部类
   public class Inner{
       public void in (){//内部类中的方法
            class Aaa{//在方法中再创建内部类
                public void aaa(){//再在这个内部类中创建方法
                    class Aaa2{//再来一个内部类
                        public void aaa2(){//然后再来一个方法
                            System.out.println(ID);//输出外部类的私有属性
                        }
                    }
                }
          }
           System.out.println("内部类");
      }

       public void gatID(){
           System.out.println(ID);//可以直接获取到外部类的私有属性
      }
  }
}

可以看出,在方法中无论定义多少个局部内部类和方法,都可以照常输出外部内的私有属性和私有方法。

 

3. 匿名内部类:一个不需要名字的类,在实例化的时候,不使用 (对象类型 对象名 = new 类名())的方式,可以直接(new 类名().【需要调用的类成员】())方式直接调用。这样的形式就是创建了一个匿名内部类。

package oop;

public class Application {//测试类
   public static void main(String[] args) {
       new A().a();//通过该方法创建了一个匿名内部类
  }
}

class A{//创建一个类(不一定必须创建内部类)
   public void a(){
       System.out.println("匿名内部类");
  }
}

 

posted on 2020-11-21 11:30  晋歪歪  阅读(77)  评论(0编辑  收藏  举报