内部类

小知识

内部类拥有对外围内所有成员的全部访问权限,这是因为在外围类创建一个内部类对象时候,内部类对象会自动秘密捕捉一个指向外围类对象的引用,然后通过这个引用去访问这个外围类的所有成员。这种是针对普通的内部类,如果是static静态的嵌套类,是没有指向外部类的引用的,因此是不可以访问非静态外部对象的。
普通内部类是不能出现static数据和字段的,这很好理解,因为普通内部类作为外部类的一部门,普通内部类的字段和数据肯定是在运行时加载的,而嵌套类就不一样了,初始化的时候就加载了。

关于内部类的一些使用语法.this和.new

在外部类的非静态方法之外的任意位置创建某个内部类对象都需要具体指明这个对象的类型:OuterClassName.InnerClassName

如果我们想要在内部类使用外部类的引用,我们就用.this语法

public class Outer{ 
    、、、省略外围类代码
    public class Inner{
        public Outer getOuter(){
            return Outer.this;
        }
    }
}

创建内部类对象时需要用到.new,要想直接创建内部类的对象,必须使用外部类的对象来创建该内部类的对象;在拥有外部类对象之前是不可能创建内部类对象的,除非是静态内部类(嵌套类)

Public Class Outer(){
    public Class Inner(){}
    public static void main(){
        Outer out = new Outer();
        Outer.Inner inner = out.new Inner();
    }
}

在方法和作用域内的内部类

内部类可以放在任何域里面,不过要注意他的访问权限,就是你的内部类域在哪里,你创建这个内部类就不能超过这个域。
在方法里面的内部类,指的是在外部类的方法里面创建一个内部类,然后只能在这个航啊哈里面创建这个内部类,其他域里面是不能创建的。

public class Outer{
    public void show(String s){
        public class Inner{
            public void show2(String s){
                system.out.println();   
            }
        }
        new Inner.show2(s);//在这个方法域之外就不能创建这个内部类对象了
    }
}

匿名内部类

就以前对象的初始化就是CllassName className = new ClassName(){}

//在方法里面返回一个立即生成的匿名内部类
public NonameInnner getNonameInner(){
    return new NonameInner{
        private int value = 1204;
        public int getValue(return value;);  
    }
}
//直接生成匿名内部类的对象
Gameactory factory = new GameFactory(){//匿名内部类具体内容}
//工厂模式里面有时就可以借用匿名内部类,就是new FactoryName().getFactory()来生成具体的单一工厂对象

如果要在匿名内部类里面用到在其外部定义的对象,编译器强制要求其参数引用是final的 ,不然会报编译器错误。
匿名内部类可以继承类也可以实现接口,但只能实现一个接口。

为什么使用内部类

书上给出的原因:每个内部类都能独立地继承自一个(接口的)实现,所以无论对外围类是否已经继承了某个(接口的)实现,内部类仍然可以继承其他的实现,对内部类完全没有其他影响。
理解:我们在写一个类的时候最多只可以继承一个类,但是可以实现多个接口,然后在有的时候我们需要继承实现多个类,却不可以,接口只是部分地解决了这个问题,而内部类就允许我们在里面继承其他基类,这里就有效地实现了“多重继承”。
内部类的特性:

  1. 可以有多个实例,状态信息域外围类的信息相互独立,及解耦合。
  2. 外围类中可以让内部类以不同的方式实现同一个接口或继承同一个类。
  3. 内部类对象的创建不依赖外围类对象的创建。
  4. 内部类是一个独立的实体,没有接口那种“is-a”关系。

内部类域控制框架

在一个大的控制框架中,使用内部类继承基本的事件,然后在内部类实现各自的具体事件行为,这样使得这些事件之间的代码分离变得容易。
比如控制温室的运作:灯光控制、水、温度控制、响铃、重新启动,这些都可以看做一个事件,我们用一个GreenhouseContollers表示整个温室控制器,然后在分别有关于灯管控制、水、温度等的内部类去继承一个基本的event事件,这样就将温室运作的这几个行为分离开了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值