其他分享
首页 > 其他分享> > day11周六上午课周日休息_内部类

day11周六上午课周日休息_内部类

作者:互联网

整理了长风老师在Day11的内部类章节的随堂代码

成员内部类访问特点

package com.cskaoyan.javase.oop3.innerclazz6.member2.basic2;

/**
 * @description: 成员内部类的访问特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 【0.】前提:
 *   1.成员内部类和外围类的访问:
 *     不受访问权限限制,即便是私有的,它们也可以互相访问
 *   2.对象依赖于外围类对象:
 *     (1)this传参表示成员内部类自身对象
 *     (2)先有外围类对象。
 *     (3)外围类this传参,表示外围类对象自身
 *     (4)外围类成员方法中,没有成员内部类对象:
 *     外围类对象不依赖成员内部类对象,如果想有,需要手动创建
 *
 * 【1.】成员内部类的访问特点
 * -----成员内部类内部访问外围类
 *      1.不限访问权限
 *      2.同名:
 *       普通成员变量
 *          (1)不区分:优先选择内部类自身的成员
 *          (2)this.成员:表示内部类自身的成员
 *          (3)外围类类名.this加成员:表示外围类的成员,以示区分
 *       静态的成员变量
 *           没有。成员内部类中没有静态的成员变量
 *       全局常量
 *           类名区分
 *
 * 【2.】外围类访问成员内部类成员特点
 *-------外围类成员方法中
 *       访问内部类的成员
 *              (1)对象:先创建外围类对象,再创建内部类对象,用对象访问
 *              (2)类名:访问成员内部类的全局常量时,可以直接用类名,无需创建对象
 *              (3)同名:
 *                    对象名点:出来的是内部类
 *                    全局常量:类名区分
 *
 *-------外围类静态方法中
 *       访问内部类成员
 *              (1)创建外围类对象再创建内部类对象。对象名点访问
 *              (2)同名:不同的对象名
 *
 * 【3.】外部类访问成员内部类成员
 *       (1)创建内部类对象:内部类构造方法private,则不能创建
 *             如果不是private,先创建外围类对象,再创建内部类对象
 *       (2)访问权限限制
 *       (3)静态方法还是成员方法:没有外围类对象,都需要创建外围类对象
 *
 * 【4.】成员内部类访问外部类成员(了解)
 *       (1)创建外部类对象
 *             不可创建:受访问权限限制。
 *             可以创建:访问成员也受权限限制
 *
 */
public class Demo {//外部类
    int a = 10;
    private int b = 20;
    public static void main(String[] args) {
        //(1)先创建外围类对象
        EnclosedClazz ec = new EnclosedClazz();
        //(2)再创建内部类对象。用外围类类名.内部类类名 指示该内部类属于谁
        EnclosedClazz.Inner inner0 = ec.new Inner();

        //(3)链式:上述步骤二合一
        EnclosedClazz.Inner inner = new EnclosedClazz().new Inner();
        //外围类名.内部类名 对象名 = new 外部类名().new 内部类名();

        //System.out.println(inner.a);//测试:外部类中访问内部类对象成员

        //ec.test1();//测试:外围类成员方法中,访问内部类成员
        //EnclosedClazz.testStatic();//测试:外部类调用外围类静态成员方法,访问内部类成员

        inner.testInner();

    }
}
class EnclosedClazz{ //外围类
    //定义外围类的成员
    int a = 10;
    private int b = 20;
    static int c = 30;
    private static final int D = 40;//static final,大部分人都是static在前面

    public void testEnclosedMember(){
        System.out.println("testEnclosedMember");
    }
    public static void testEnclosedStatic(){//静态
        System.out.println("testEnclosedStatic");
    }

    public void test1(){//测试:外围类中,访问内部类成员、方法
        //(1)对象。直接创建内部类对象
        Inner inner = new Inner();
        //用这个对象访问内部类成员
        System.out.println(inner.a);
        System.out.println(inner.b);//既然是对象,可以访问私有
        System.out.println(Inner.D);//类名. 是静态常量,也可对象点,一般类名点
        System.out.println(EnclosedClazz.D);//外围类自己同名静态成员常量D
        System.out.println("this指的是xxx" + this.a);//this指的是外围类的成员a
        System.out.println(b);      //不指定,默认访问外围类自己的同名成员变量

    }

    //外围类的静态成员方法
    //测试访问内部类成员
    public static void testStatic(){
        //(1)先创建外围类对象
        EnclosedClazz ec = new EnclosedClazz();
        //(2)再创建内部类对象
        Inner inner = ec.new Inner();

        //(3)链式:上述步骤二合一
        Inner inner0 = new EnclosedClazz().new Inner();
        System.out.println(inner0.a);//100
        System.out.println(inner0.b);//200
        System.out.println(inner0.D);//400
        System.out.println(EnclosedClazz.D);//40
        /*//静态方法没有this,所以不能直接访问本类中的成员变量
        System.out.println(this.a);//没有本类的对象,静态方法没有
        System.out.println(b);*///ctrl + shift + /

    }
    class Inner{ //内部类
        int a = 100;
        private int b = 200;
        private static final int D = 400;
        //定义一个成员方法来访问外围类成员
        //内部类访问外围类成员
        public void testInner(){
            //this指向当前内部类对象
            System.out.println("yyy" + this.a);//100
            System.out.println(EnclosedClazz.this.a);//肯定有外部类对象,外部类名.this指的是外部类对象
            System.out.println(b);//200
            System.out.println(Inner.D);//400
            System.out.println(EnclosedClazz.c);//30
            System.out.println(EnclosedClazz.D);//40

            testEnclosedMember();//测试:可以在内部类调用外部类方法
            EnclosedClazz.testEnclosedStatic();//测试:可以调用外部类静态方法
            //this.test2();
            //EnclosedClazz.this.test1();//测试:调用外部类test1方法

            //Demo d = new Demo();
            //System.out.println(d.a);
            //System.out.println(d.b);

        }

        public void test2(){}
    }
}

 

标签:内部,对象,成员,System,day11,周六,println,out,周日
来源: https://blog.csdn.net/xjadolphx/article/details/115607983