Thinking in java 之 内部类

1.引言:


最近看thinking in java 正好看到内部类得,看得过程中发现自己以前对内部类的理解是多么肤浅,在此与大家分享下。

2.内容


在开始之前我先例举一个最常见的内部类的例子:代码如下:

public class A {
    int i=1;
    public class B{
        public void printf()
        {
            System.out.print(i);
        }
    }
    public static void main(String args[])
    {
    }
}


知识点1:
以前在学习java的时候,没认真思考过,为什么内部类 B,可以直接用类A里面的常量i? 那是因为内部类对象 里面有一个指向外部类的引用,因为这个引用的存在,因此可以访问外部的成员和方法。


知识点2:
在另外一个包里面有一个类c,c中需要new 一个 类B的对象,那应该怎么做呢?。具体代码如下:


import com.A.B;

public class C {
    public static void main(String args[])
    {
        A a=new A();
        B b=a.new B();
    }
}


可以看到 要得到,A中的内部类B。必须要先得到类A的实例,然后根据.new的方式 获取到内部类B。前面说过 内部类里面有一个指向外部类的引用。因此必须要有外部类才能有内部类这一说。所以这里必须要先new一个实例 a,然后根据实例a 得到内部类B.


知识点3:
匿名内部类,实现代码如下:

public class Test3 {
    public bean getbean()
    {
        return new bean()
        {
            int i=2;
            public void seti()
            {
                i=6;
            }
        };
    }
    public static void main(String args[])
    {

    }
}



注意:return后面 : “ bean” 是一个接口它的定义如下:

package com;
public interface bean {

}



匿名类顾名思义是没得类名的。我记得最初学习java时候因为不懂匿名类还多次请教过老师。匿名类就是实现了接口bean,或者其他抽象的类。大概样式和正常的类差不多 只不过没得名字。
常见的匿名类:

    Thread a=new Thread(new Runnable() {
        public void run() {

        }
    });

以前写这段代码的时候,只知道这样搞,只知道要new thread对象,必须要实现里面的Runnable接口,看了这章之后,忽然发现 不知不觉我已经用到过匿名类。使用匿名内部类的时候,必须要实现某一个接口或者抽象类,因此有的时候 匿名内部类存在向上转型的情况。 例如下面的 代码:

public Runnable test()
    {
        return new Runnable() {
            public void run() {

            }
        };
    }

方法返回值要求是接口Runnable,然而返回的是实现了接口的匿名类,然后向上转型生成一个Runnable对象。

匿名内部类在访问变量的时候要在参数前面 加上final,例如

    public Runnable test(final String i)
    {
        return new Runnable() {
            public void run() {
                System.out.print(i);
            }
        };
    }

知识点4:嵌套内部类

所谓的嵌套内部类,就是在一般的内部类前加一个 static修饰。嵌套类不需要与外部类关联;不能从嵌套类的对象中访问非静态的外围类对象。

这里写图片描述

看报错了。注意:嵌套类中不能访问非静态的外围变量。


关于内部类的知识点,就总结到这里,实际上书上讲的还有很多,而且长篇大论,人就看糊涂了,索性就没看了,在这里我就把我认为常用,简单,易理解的写上来了,具体还有什么问题,可以买一本看看,这本书你绝对值得拥有。

今天就写到这里了,希望能帮助到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值