MEC@JavaSE@基础篇@笔记16@内部类与匿名内部类

上一篇讲解了是抽象类与抽象方法:

使用方式:第一步,通过继承抽象类,并实现抽象方法,产生新类(子类);第二步,实例化这个子类,完成应用需求。

这是前面介绍的抽象类的使用方式,但是这种使用手法不是唯一的,有更直接、更犀利的实现手段。

内部类

介绍:在一个类中,可以定义其他类,这些类成为内部类。

注意:在一个类中的意思是,在这个类定义过程的“{}”内。

内部类代码示例及相关使用介绍:

package com.mec.about_innerclasee;

/**
 * 这个类展示内部类与外部类的关系
 */
public class Outerclass {
    private int privateMember;
    protected int protectedMember;
    public int publicMember;

    public Outerclass() {
        privateMember = 1;
        protectedMember = 1;
        publicMember = 1;
    }

    //定义三种不同权限的修饰方法

    private void privateFun(){
        System.out.println("privateMember:" + privateMember);
    }

    protected void protectedFun(){
        System.out.println("protectedMember:" + protectedMember);
    }

    public void publicFun(){
        System.out.println("publicMember:" + publicMember);
    }

    /**
     * 这是OuterClass的内部类
     */
    public class InnerClass{
        private int innerMember;

        public InnerClass() {
            innerMember = 4;
        }

        //在内部类的方法中,可以直接引用外部类的所有成员
        //且,不受权限修饰符的约束。
        private void innerFun(){
            privateMember++;
            protectedMember++;
            publicMember++;

            privateFun();
            protectedFun();
            publicFun();
            System.out.println("innerMember:" + innerMember);
        }
    }

    //外部类可以定义内部类对象的成员
    private InnerClass innerObject;

    public void fun(){
        //可以实例化该成员
        innerObject = new InnerClass();
        //外部类的方法,可以通过内部类的对象,引用内部类的所有成员与方法
        innerObject.innerFun();
        System.out.println("innerObject.innerMember++:" + innerObject.innerMember++);
    }

}

匿名内部类

介绍

    匿名内部类(重点)
        匿名:没有名字
        匿名内部类:指的是没有名字的子类。
    匿名内部类作用:简化代码
        把定义子类继承父类,重写父类的方法,创建子类对象合成一步完成
        把实现类实现接口,重写接口中的方法,创建实现类对象合成一步完成

格式:

        new 父类|接口(){
            重写父类|接口中的方法
        };

匿名内部类演示代码

定义一个抽象类:Bird

package com.mec.about_abstract.core;

public abstract class Bird {
    private String name;

    public Bird(String name) {
        this.name = name;
    }

    public abstract String cry();

    public void print(){
        System.out.println("(" + name + ")的叫声" + cry());
    }

}

这个抽象类很典型,与前面给出的抽象类也和相似,且更简短。

对于这个抽象类,想现在不打算建立新的派生类,而是直接在演示类中对其进行“实例化”。

此“实例化”非直接创建对象,而是一种“非”直接实例化。

演示代码如下:

package com.mec.about_abstract.core;

public class Test {

    public static void main(String[] args) {

        Bird lark = new Bird("百灵鸟") {
            @Override
            public String cry() {
                return "婉转,优美";
            }
        };
        lark.print();
        //上面的代码书写格式很独特
        //new 抽象类构造方法(){
        //  在这里实现这个抽象类的所有抽象方法
        //};
        //其本质上个也是生成了一个类,不过,这个类,没有机会命名。
        //所以这个类就是匿名类;但是它会生成相应的类文件!

        new Bird("乌鸦") {
            @Override
            public String cry() {
                return "嘶哑,难听";
            }
        }.print();
        //这里的写法,干脆连这个匿名类的对象名都省略了
        //第26行的.print(),其实就是方法的调用。
        //应该知道,new关键字返回类的实例的首地址,也就是对象
        //所以,new的返回结果其实就是这个类的对象;
        //当然就可以通过这个对象调用它的方法了

        new Bird("是不是鸟已经无所谓了") {
            public Bird fun(){
                System.out.println("可以在这里定义方法!");
                //注意这里的返回值类型是Bird
                return this;
            }

            @Override
            public String cry() {
                return "叫声已经不重要了!";
            }
        }.fun().print();
        //如果fun()的返回值不是Bird的话,
        //我们就不能用这种方式继续调用其他方法了。
    }

}

——————————————————————————————————————————————————————————————————————————————————-
(百灵鸟)的叫声婉转,优美
(乌鸦)的叫声嘶哑,难听
可以在这里定义方法!
(是不是鸟已经无所谓了)的叫声叫声已经不重要了!

这种方式的好处

1、不需要明确的生成派生类,对这个简单问题,明显提高变成效率;

2、在需要时临时产生匿名内部类,实现抽象方法,这样更灵活;

3、一个匿名内部类对应一种抽象方法的实现,这样更紧凑。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值