内部类

 

内部类: 写在一个类内部的类

          java中允许将一个类A声明再类B中,则类A就是内部类, 类B称为外部类

为什么要有内部类: 简答来说 比如一个人有个大脑 但是这个人的大脑是这个人独有的不是别人有的,所以这个大脑我们放在自己内部不暴露出去,

                         那为什么不去用私有一个变量或者方法来代表这个类呢? 因为大脑有很多的用途可以思考问题 提供人体必需物质等多个属性和方法所以定义一个内部类,

                        来只所属于这个人类的本身

 

 

内部类的总结

 

 *  内部类的分类,成员内部类(静态的非静态的)Vs局部内部类(方法内, 代码块内,构造器内)
 *
 *  成员内部类:
 *      一方面作为外部类的成员
 *          > 调用外部类的结构
 *          > 静态的内部类只能调用外部静态的方法
 *          > 可以被static修饰
 *          > 可以被四种不同权限修饰
 *
 *
 *      另一方面作为一个类
 *            >类内可以定义属性,方法, 构造器等
 *            >可以被final修饰不可以被继承, 不被final修饰可以被继承
 *            > 可以被抽象abstract修饰
 *
 *
 * 4:关注如下的3个问题:
 *       a: 如何实例化内部类成员对象
 *       b:如何在成员内部类中区分外部类结构
 *       c: 开发中局部内部类的使用

 

 

 

public class InnerClassTest {

    public static void main(String[] args) {

        // 实现静态的成员内部类
        PersonTestOne.InnTestTwo innTestTwo = new PersonTestOne.InnTestTwo();

        //实现非静态的成员内部类,因为是非静态的需要先实例化对象 然后去调用内部的非静态内部类,就是有了对象用对象去调用内部结构
        PersonTestOne personTestOne = new PersonTestOne();
        PersonTestOne.InnTestOne innTestOne = personTestOne.new InnTestOne();
        innTestOne.innermethod();
    }

}


class PersonTestOne{

    String name = "外部类的name";
    int age = 30;

    public void eat(){
        System.out.println("吃饭");
    }


    //静态成员内部类
   static class InnTestTwo{

    };

    // 非静态内部类
    class InnTestOne{
        String  name = "老王";
        int age;
        public void show(){
            System.out.println("非静态内部类的show方法");
        };

        public void innermethod(){
            method1();
            System.out.println(this.name);  // 调用内部类属性
            System.out.println(PersonTestOne.this.name); //调用外部类属性

        }
    };

    public static  void method1(){  //静态方法
        System.out.println("我是外部类的静态方法");
    }

    public void mthod(){
        // 局部内部类
        class aa{};
    }

    {
        //局部内部类
        class cc{};
    }
}

 

 

如何实例化外部中的静态内部类:

      直接在使用外部类.静态内部类就直接实例化

       // 实现静态的成员内部类
        PersonTestOne.InnTestTwo innTestTwo = new PersonTestOne.InnTestTwo();

 

如何实例化非静态内部类

 

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


        //实现非静态的成员内部类,因为是非静态的需要先实例化对象 然后去调用内部的非静态内部类,就是有了对象用对象去调用内部结构
        PersonTestOne personTestOne = new PersonTestOne();
        PersonTestOne.InnTestOne innTestOne = personTestOne.new InnTestOne();

 

 

如何调用内部类中与外部类同名的属性

        public void innermethod(){
            method1();
            System.out.println(this.name);  // 调用内部类属性
            System.out.println(PersonTestOne.this.name); //调用外部类属性

        }

 

 

 

在局部内部类中的方法中调用外部类的方法中的属性 这个属性在内部类中必须是final的不然就会报错

jdk7: 要求此属性显示的就是一个final

jdk8: 要求此方法可以省略final的声明

好比 这个属性在外部类的作用域中存在,内部类是另一个作用域 你想使用我 我给你一个copy的副本,这个副本是随着我外部类本身的作用域改变的  内部类拿的是副本不可以改变

 

 

声明局部内部类:

 

 

 

在一个方法中或者内部类中在声明的内部类就叫局部内部类 只在这一块区域生效

 

如何使用局部内部类 

只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方 都不能使用该类 
 但是它的对象可以通过外部方法的返回值返回使用,返回值类型只能是局部内部类 的父类或父接口类型

 

 

局部内部类的特

 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但 是前面冠以外部类的类名和$符号,以及数字编号。
 只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方 都不能使用该类。
 局部内部类可以使用外部类的成员,包括私有的。 
 局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局 部变量的声明周期不同所致。  局部内部类和局部变量地位类似,不能使用public,
protected,缺省,private
 局部内部类不能使用static修饰,因此也不能包含静态成员

 

匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一 个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或 实现一个类。 
 格式: 
    new 父类构造器(实参列表)|实现接口(){

              //匿名内部类的类体部分 

            } 

 匿名内部类的特点 
 匿名内部类必须继承父类或实现接口 
 匿名内部类只能有一个对象 
 匿名内部类对象只能使用多态形式引用                     

 

posted @ 2019-10-24 20:11  可爱的红领巾  阅读(172)  评论(0编辑  收藏  举报