Java中的内部类

来源:互联网 发布:反补世界树 知乎 编辑:程序博客网 时间:2024/05/17 03:12

面向对象—内部类

内部类场景

package com.cloud.day5;

/*

内部类:一个类定义在另外一个类的内部,那么该类就称作为内部类。

内部类的class文件名:外部类$内部类好处:便于区分该class文件是属于哪个外部类的。

内部类的类别:

   1. 成员内部类:

        成员内部类的访问方式:

             方式一:在外部类提供一个方法创建内部类的对象进行访问。    

             方式二:在其他类直接创建内部类的对象。格式:外部类.内部类 变量名 = new 外部类().new 内部类();

        注意:如果是一个静态内部类,那么在其他类创建的格式:

             外部类.内部类 变量名 = new 外部类.内部类();

        内部类的应用场景:我们在描述A事物的时候,发现描述的A事物内部还存在另外一个比较

        复杂的事物B时候,而且这个比较复杂事物B还需要访问A事物的属性等数据,那么这时候

        我们就可以使用内部类描述B事物。

        比如:--->心脏

         class{

       

        氧气

        ....

        class 心脏{       

       }    

         }

        内部类的好处:内部类可以直接访问外部类的所有成员。

        内部类要注意的细节:

           1.如果外部类与内部类存在同名的成员变量时,在内部类中默认情况下是访问内部类的成员变量。

             可以通过"外部类.this.成员变量名"指定访问外部类的成员。

           2.私有的成员内部类只能在外部类提供一个方法创建内部类的对象进行访问,不能在其他类创建对象了。

           3.成员内部类一旦出现了静态的成员,那么该类也必须使用static修饰。

   局部内部类:

*/

//外部类

class Outer{

   intx = 10;

   //成员内部类

   staticclass Inner{

      staticint x=10;

      publicvoid print(){

        System.out.println("Outer.Inner.print()"+x);

      }

   }

   publicvoid instance(){

      Inner inner = new Inner();

      inner.print();

   }

}

publicclass Demo2 {

   publicstatic void main(String[] args) {

      System.out.println(Outer.Inner.x);

      Outer outer = new Outer();

      outer.instance();

      Outer.Inner inner = new Outer.Inner();

      inner.print();

   }

}

局部内部类

package com.cloud.day5;

/*

局部内部类:在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类。


局部内部类要注意的细节:

   1. 如果局部内部类访问了一个局部变量,那么该局部变量必须使用final修饰、

*/

class Outer1{

   String name = "外部类的name";

   publicvoid test(){

      //局部变量

      //y从内存消失的时间就是,方法执行完毕后

      finalint y = 100;

      //局部内部类

      class Inner {

        /*

         test方法执行完毕后,y马上从内存中消失,Inner对象在方法执行完毕的时候还没有从内存中消失

         */

        intx = 10;

        publicvoid print(){

           System.out.println("Outer1.test().Inner.print()"+y);

        }

      }

      Inner inner = new Inner();

      inner.print();

   }

}

publicclass Demo3 {

   publicstatic void main(String[] args) {

      Outer1 outer = new Outer1();

      outer.test();

   }

}

匿名内部类

package com.cloud.day5;

/*

匿名内部类:没有类名的类就称作为匿名内部类。

匿名内部类的好处:简化书写。

匿名内部类的使用前提:必须存在继承或者实现关系才能使用。

匿名内部类一般是用于实参。

*/

abstractclass Animal {

   publicabstract Animal run();

   publicabstract void sleep();

}

class OuterAnimal{

   publicvoid print(){

      /** 局部内部类

      class Dog extends Animal{

        @Override

        public void run() {

           System.out.println("OuterAnimal.print().Dog.run()");

        }

        @Override

        public void sleep() {

           System.out.println("OuterAnimal.print().Dog.sleep()");

        }

      }

      Dog d = new Dog();

      d.run();

      d.sleep();

      */

      //多态

      Animal a = new Animal() {

        @Override

        publicvoid sleep() {

           System.out.println("OuterAnimal.print().new Animal() {...}.sleep()");

        }

        @Override

        public Animal run() {

           System.out.println("OuterAnimal.print().new Animal() {...}.run()");

           returnthis;

        }

        //特有的方法

        publicvoid bite(){

           System.out.println("狗会咬人...");

        }

      };

      a.sleep();

      a.run();

   }

}

publicclass Demo4 {

   publicstatic void main(String[] args) {

      OuterAnimal animal = new OuterAnimal();

      animal.print();

   }

}

实现关系下的匿名内部类

package com.cloud.day5;

//实现关系下面的匿名内部类

interface DaoTest{

   publicvoid add();

}

class OuterTwo{

   publicvoid print(){

      new DaoTest() {

        @Override

        publicvoid add() {

           System.out.println("添加成功");

        }

      }.add();

   }

}

publicclass Demo5 {

   publicstatic void main(String[] args) {

      test(new DaoTest() {       

        @Override

        publicvoid add() {

           System.out.println("添加员工成功");

        }

      });

   }

   publicstatic void test(DaoTest d){

      d.add();

   }

}

0 0
原创粉丝点击