内部类

##内部类

  • 内部类可以隐藏属性(可以很好的把属性隐藏在内部类中)
  • 内部类可以访问内部类外边的属性(可以在一个类里添加一个内部类来实现接口,再给里面写一个生成内部类对象的方法,则可以在后边代码中使用外部类提供的方法使用内部类实现的接口)
  • 内部类中.this和.new的用法

.this:需要对生成对外部类对象的引用,那就可以使用 outer.this产生一个外部类对象的引用,并且可以调用外部类的方法和属性。
.new:创建一个内部类的对象,外部类.new 来创建一个内部类对象

  • 内部类的向上转型:就是将内部类向上转为一个基类,最主要用途是转为一个接口时,可以很好的隐藏它的内部实现(在没使用前没有什么感觉,但是了解它的含义的话就可以清楚了解到它的好处)

Java编程思想中一题:在第一个包中创建一个至少有一个方法的接口。然后在第二个包内创建一个类,在其中增加一个protected的内部类以实现那个接口。在第三个包中,继承这个类,并在一个方法中返回该protected内部类的对象,在返回的时候向上转型为第一个包中的接口的类型。

因为protected只能在本类中使用,要让别的类也可以实现他那个内部类就必须向上转,因此可以在第三个包中的类继承第二个包的类,然后再第二个包内加上有protectrd修饰的内部类并且实现第一个包的接口,然后用第三个包中继承第二个包中的类对父类进行实例化(也就是第二个包里的类)然后调用内部类里所实现的接口。

代码如下:
package package1;

public interface A { //按题中所说第一包中为接口
void test();
}

package package2;
import package1.A;

public class B {
protected class Inner implements A{
public void test(){
System.out.println(“sadjfl”);
}
}
public A a(){ //因为内部类只能在这个包中被访问,所以可以通过方法来变相访问,毕竟B可以被访问
return new Inner();
}
}

package package3;

import package1.A;
import package2.B;

public class C extends B{
public A test2(){ //通过向上转型为接口,可以访问到内部类 所以完全隐藏了内部类的实现细节
B p=new B();
return p.a();
}

}

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

你的想法是:要解决一个问题,想创建一个类辅助你,但是又不希望这个类是公用的,那么,这个时候就是用到在任何一个作用域定义一个内部类。

如果在方法内,那么方法外的方法或者类不能访问方法内的内部类,可以通过实例化对象通过对象的方法访问。

当然也可以把它写在一个条件语句什么的可以,但是它的作用范围就是那个定义的范围,超过范围就无法访问了。
##匿名内部类
匿名内部类是什么呢?在我理解看来就是使用它的地方用不到它的名字,所以就匿名啦 。(匿名内部类的分号并不是标记内部类的结束,而是和其他代码一样,代表的是一个表达式的结束)

  • 内部类可以给外部的字段赋值

public void test(){

new Hello(){

public void helloFun(){

var = 2;

}

}.helloFun();

}

  • 内部类模拟普通类的构造器

public class Parcel9 {

// Argument must be final to use inside

// anonymous inner class:

//如果定义了一个内部类,并且希望它使用一个在其外部定义的对象,

//那么编译器会要求其参数为final的。

public Destination destination(final String dest) {

//匿名内部类语法:

/*
* 这种奇怪的语法指的是:创建一个继承自Destination的

* 匿名类的对象。通过new表达式返回的引用被自动向上转型

* 为对Destination的引用。

* */

return new Destination() {

//在匿名内部类中不可能有命名构造器,但通过实例初始化

//就能够达到为匿名类创建一个构造器的效果

{
System.out.println(“Destination()”);
}

private String label = dest;
public String readLabel() { return label; }

};

}

public static void main(String[] args) {

Parcel9 p = new Parcel9();

Destination d = p.destination(“Tasmania”);

System.out.println(d.readLabel());

}

} ///:~

==============

Destination()

Tasmania

==============

当然模拟出的效果和普通类基本没什么差别。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值