java基础 —- 内部类,匿名对象

1551-龙同学

发表文章数:45

热门标签

首页 » Java » 正文

java基础 —- 引用类型用法,内部类,匿名对象

内部类的理解概述:

一个类除了单独定义,还能定义在另一类中作成员内部类,另一个类的成员方法体中作局部内部类。如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,就可以在创建实现接口(继承父类)的同时创建实现类唯一对象名称(子类唯一对象名称),即使用匿名内部类。

内部类的使用概述:

  • 成员内部类定义在外部类的成员方法外,定义过程中内用外,随意访问;外用内,需要内部类匿名对象。main方法执行内部类的方法时,通过特殊定义语句新建的对象直接调用或者在外部类的方法中使用内部类,在main方法中通过外部类对象间接调用。外部类权限修饰词:public / (default);成员内部类:public / protected / (default) / private。
  • 局部内部类定义在外部类的成员方法中,通过在该方法中创建局部内部类的对象调用局部内部类的成员。局部内部类不用任何修饰词,方法内部可访问,方法外不可访问。
  • 匿名内部类定义在外部类的成员方法中,实现接口(继承父类)的同时创建唯一对象名称,该对象可以调用多次方法;实现接口(继承父类)的同时创建匿名对象,该匿名对象只能调用一次方法。

匿名对象的理解概述:

确定一个对象只需要使用唯一的一次取上名字显得多余。

匿名对象的使用概述:

不需要对象名称,直接new 类名()调用一次成员。要多次调用成员需要多个匿名对象。


 

成员内部类,匿名对象最终测试代码:

/**
 * 构造一个外部类包含内部类
 * 外部类包含同名私有成员变量,直接调用内部类成员一般成员方法
 * 内部类包含同名私有成员变量,直接调用内部类成员的,辨析同名参数的一般成员方法
 */
/**成员内部类类比 引用类型数据作成员方法*/
class OutsideClass {
    private int num = 10;

    public void methodOutside() {
        System.out.println("AAA");
    }

    //定义外部类时,用内部类的匿名对象调用内部类方法
    public void methodOutside02() {
        new InsideClass().methodInside();//BBB
        //  methodInside();错于外部类不能直接调用内部类的成员
    }

    // 内部类匿名对象可以调用内部的私有成员变量
    public void methodOutside03() {
        System.out.println(new InsideClass().num);// 20
    }

    class InsideClass {
        private int num = 20;

        public void methodInside() {
            System.out.println("BBB");
        }

        //内部类可以直接调用外部类的成员变量,私有也可以
        public void methodInside02() {
            System.out.println(num);
        }

        //内部类可以直接调用外部类的成员方法
        public void methodInside03() {
            methodOutside();
        }

        public void methodInside04() {
            int num = 30; // 内部类方法的局部变量
            System.out.println(num); // 30 局部变量,就近原则
            System.out.println(this.num); // 20 内部类的成员变量
            System.out.println(OutsideClass.this.num); // 10 外部类的成员变量
        }
    }
}
public class InsideClass {
    /**
     * 新建外部类对象
     * 测试外部类对象调用内部类成员
     * 新建内部类对象
     * 测试内部类对象分别调用外部类成员和内部类成员
     */
    public static void main(String[] args) {
        OutsideClass outsideOne = new OutsideClass();
        outsideOne.methodOutside02();//BBB  外部类在定义时通过匿名对象调用内部类方法,在主方法中用外部类对象间接调用
        //outsideOne.methodInside();错于外部类对象不能调用内部类成员
        //
        OutsideClass.InsideClass insideOne = new OutsideClass().new InsideClass();//定义内部类对象的格式
        //InsideClass insideOne = new InsideClass();  这种方法定义的对象不能调用任何内容
        insideOne.methodInside();//BBB
        //insideOne. methodOutside(); 错于内部类对象不能调用外部类内容
    }
}

 


 

局部内部类最终测试代码:

/**构造一个局部内部类*/
class Outer {

    public void methodOuter() {
        int num= 20;
        class Inner { // 局部内部类
            int num = 10;
            public void methodInner() {
                System.out.println(num); // 10
            }
        }
        Inner inner = new Inner();
        inner.methodInner();
        System.out.println(num);//20
    }

}

 

匿名内部类,匿名对象最终测试代码:

/**构造一个接口*/
MyInterface{
public void method1();
 public void method2();
}


/**构造一个实现类实现接口*/
public class MyInterfaceImpl implements MyInterface {
    @Override
    public void method1() {
        System.out.println("AAA");
    }

    @Override
    public void method2() {
        System.out.println("BBB");
    }
}


/**
 *创建一个实现类对象,测试调用两次方法
 *创建一个匿名内部类对象,测试调用两次方法
 *创建一个匿名内部类暨匿名对象,测试调用两次方法*/
public class MyTest {

    public static void main(String[] args) {
        MyInterface obj = new MyInterfaceImpl();//多态法创建子类对象
        obj.method1();//AAA
        obj.method2();//BBB
        
        //匿名内部类,在【创建对象】的时候,只能使用唯一一次。但可以用该对象多次调用方法。
        MyInterface objA = new MyInterface() { // 匿名内部类是省略了【实现类/子类名称】
            @Override
            public void method1() {
                System.out.println("AAA");
            }

            @Override
            public void method2() {
                System.out.println("BBB");
            }
        };
        objA.method1();//AAA
        objA.method2();//BBB
       
        //匿名对象,在【调用方法】的时候,只能调用唯一一次。要多次调用方法只能用多个匿名对象。
        new MyInterface() {//匿名对象是省略了【对象名称】
            @Override
            public void method1() {
                System.out.println("AAA");
            }

            @Override
            public void method2() {
                System.out.println("BBB");
            }
        }.method1();//AAA

        // 因为匿名对象无法调用第二次方法,所以需要再创建一个匿名内部类的匿名对象
        new MyInterface() {
            @Override
            public void method1() {
                System.out.println("AAA");
            }

            @Override
            public void method2() {
                System.out.println("BBB");
            }
        }.method2();//BBB
    }

}

 

标签:

未经允许不得转载:作者:1551-龙同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《java基础 —- 内部类,匿名对象》 发布于2021-02-10

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录