• 内部类


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

              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 父类构造器(实参列表)|实现接口(){
    
                  //匿名内部类的类体部分 
    
                } 
    
     匿名内部类的特点 
     匿名内部类必须继承父类或实现接口 
     匿名内部类只能有一个对象 
     匿名内部类对象只能使用多态形式引用                     
  • 相关阅读:
    关于cookies、sessionStorage和localStorage解释及区别
    冒泡排序到demo
    关于Spring配置文件提示的插件下载
    js动态获取浏览器或页面等容器的宽高
    16JavaScript for循环
    15JavaScript switch语句
    14JavaScript条件语句
    第一天 评分卡模型
    SQL面试50题
    第七章-模型评估
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/11734562.html
Copyright © 2020-2023  润新知