欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

java-内部类

时间:2023-07-05

内部类

  内部类的概述

    当一个事务的内部,还有一个部分需要一个完整的结构进行描述(用属性和行为描述会不完整),

    那么这整个结构最好使用内部类;这个内部结构又为外部事务提供服务

  内部类的基本使用

      在一个类中定义一个类

     

    内部类的语法格式:

      class 外部类名{

        class 内部类名{         }=====================称为内部类

      }

public class Demo01 {

    public static void main(String[] args) {

      需要通过外部类对象创建内部类对象

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

            i.show();

    }

}

class Outer{

    private int num=10;

   

 class Inner{=======================================内部类

        public void show(){

内部类可以直接访问外部类所有的资源(方法和变量),包括私有的!

            System.out.println(num);

      调用外部的方法

      method();

        }         }

    public  void  method(){

       外部类要访问内部类的成员,必须创建内部类对象

        Inner i=new Inner();

        i.show();

    }

}

内部类的分类

    成员内部类和局部内部类

   

   成员内部类:在类中定义的

        也是一个类,作为一个类他有什么特征

            (1).类中可以定义属性,方法 构造器

            (2).可以被final和static和abstract修饰

           Private 和 default 和  protected 和 public修饰   

public class Demo02 {

    public static void main(String[] args) {

        Person.Cat c=new Person().new Cat();

        c.display("花花");

    }

}

class Person{

    String name="person";

    int age=10;

   

   成员内部类

    class Cat{

        int age;

        String name="cat";

        public Cat( ){        }---------------------------------------无参构造器

       

 public Cat(String name,int age){------------------------------------有参构造器

            this.age=age;

            this.name=name;

        }

        public void eat(){

            System.out.println("猫在吃小鱼干");

        }

        public  void display(String name){

  System.out.println("方法参数name:"+name);--------就近原则,表示的是参数name

  System.out.println("cat成员变量name:"+this.name);-----------是cat类的成员变量name

 System.out.println("person成员变量name:"+Person.this.name);------表示的是外部类的name

         

        }

    }                }

内部类---------------局部内部类

局部内部类:方法中定义

public class Demo02 {

    public static void main(String[] args) {        }

下列方法返回值是Y,则直接return new Y();

  下列方法返回值是T,则不能直接return new T();-----------因为抽象类不能实例化

  下列方法返回值是Compare,则不能直接return new Compare();-------因为接口不能实例化

  

  public T getT( ){

  局部内部类操作

 class H extends T{

          @Override-------------------------------------------创建局部内部类继承重写抽象类方法

          public int Ttest() {

              return 0;        }

      }

     

      当方法返回值是一个抽象类的时候,不能直接创建抽象对象

      所以在该方法中,创建类继承自抽象类,

      然后return 该抽象类的子类对象

       

      return  new H() ;

  }

   

}

abstract class  T{-----------------------------------------抽象类

   public abstract  int Ttest();

}

class Y{---------------------------------普通类

}

接口局部内部类也是同理

 public Compare getCompare(){

        

        当方法返回值是接口的时候,不能直接new接口对象

        可以在方法中创建该接口的实现类,

        return 实现类对象

         

     

   class Com implements  Compare{

      @Override

 public int compareTo() {------------------------------------------创建局部内部类继承重写抽象类方法

   return 0;

   }

        }

        return  new Com() ;

    }

interface Compare{=======================接口

    public int compareTo();=================方法

}

匿名内部类

写法格式:

   接口名/类名  引用变量=new   接口/类名(){

                        重写的方法;

                    };

写法格式二:

new   接口/类名(){

         重写的方法;

   };

public class Demo03 {

    public Compare test01( ){

        return new Compare() {--------------------------匿名内部类

            @Override

            public int compareTo() {---------------------------------重写里面方法

                return 0;         }

        };     

    }          }

interface Compare{=======================接口

    public int compareTo();=================方法

}

局部内部类为什么要继承抽象类?

抽象类不能实例化---抽象类中有抽象方法,抽象方法不完整

继承抽象类之后,重写了抽象方法

局部内部类为什么要实现接口?

接口不能实例化---接口中都是抽象方法,抽象方法不完整

实现接口之后,重写了接口中的抽象方法

案例:

A instanceof B

           返回true的情况:

           1:   A是B类型的对象

           2:   A是B类型的子类对象

           3:   A是B类型的实现类对象

System.out.println(new Aoo() instanceof Boo);---------------------------返回false  (错误的)

System.out.println(new To() instanceof  Hoo);------------------------------返回的true

class Aoo{-----------------父类

}

class Boo extends Aoo{-----------------子类

}

interface  Hoo {--------------------------------父类接口

}

interface  Too extends Hoo{---------------------------子类继承父类接口

}

class  To implements  Too{---------------------------------做一个子类的实现类

}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。