Java 内部类、匿名内部类、抽象类

何为内部类

内部类是指 在一个类中在定义一个类
如:
1.成员内部类

public class F {

    private int a;
    public void fun(){
        //TODO
    }

    public class M{
        private int a;
        public void fun(){
            //TODO
        }
    }

}

2.局部内部类

public class F {

    private int a;
    public void fun(){
        //TODO
        class M{
            private int a;
            public void fun(){
                //TODO
            }
        }

        M m = new M();
        m.fun();
    }

}

值得注意的是:

1 . 无论是成员内部类还是局部内部类,内部类中定义的方法名和变量名可以和外部类相同。这是因为 当程序正确编译后,会生成两个class文件,即:F.class和F$M.class,且这两个class文件是两个不同的文件,故可以重名

2 . 上述内部类实例的存在必须依赖于父类的实例,
即:在外接使用内部类时,必须先new 一个F的实例,然后在调用F.new M()生成M的实例对象

3 . 若内部类是static修饰过的,即静态内部类,这直接new一个静态内部类对象即可,注意要导入正确的包,它位于父类下。
4. 静态内部类参数必须用final修饰的原因:

静态内部类不依赖父类的实例的存在而存在

我们知道静态方法、静态成员变量随着类的加载而产生,不依赖与任何对象的存在
静态内部类解除了与外部类的关联,不持有外部类的引用

Java 对象的初始化顺序:

  1. 静态对象-非静态对象-构造器
    其中静态对象包括:静态块,静态方法,静态属性
  2. 对于继承父类的对象的初始化顺序:父类静态对象-子类静态对象-父类构造方法-子类构造方法
    说明:在静态对象中初始话顺序实际上是按照声明的顺序执行的。

3.匿名内部类
在Android开发中常用到如:

button.setOnClickListener(new Button.OnClickListener() { 
    @Override 
    public void onClick(View v) {
           // TODO
    } 
}); 

其中的new Button.onclickListener(){}即为匿名内部类的实例对象类

匿名内部类要求
1. 匿名内部类没有名字,因此只能使用一次,下次再使用重新创建对象。
2. 匿名内部类的适用情形:某个类不是经常使用,如只使用一次,使用完后不保存该实例的对象,为了便于代码的编写常采用匿名内部类
3. 使用匿名内部类的前提条件:必须继承一个父类或实现一个接口

其他说明:

无论是匿名内部类、接口或者抽象类,都不能实例化
但我们常用到的new 一个匿名内部类、接口或者抽象类实际上是执行3步的合并,即:
a.先定义一个子类,让该子类继承上述接口或实现上述抽象类;
b.然后new一个该子类的对象;
c.将该子类的一个引用赋值给接口或者抽象类变量(它是依据java多态特性:父类指向子类的引用)。

上述说明事例代码:
1. new 一个接口

Runnable runnable = new Runnable() {

            @Override
            public void run() {

            }
        };
  1. 实际上的执行步骤为:
a.
 class MyRunnable implements Runnable{

        @Override
        public void run() {

        }

    }
b.  
MyRunnable myRunnable = new MyRunnable();
c.
Runnable runnable = myRunnable;
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值