##内部类
- 内部类可以隐藏属性(可以很好的把属性隐藏在内部类中)
- 内部类可以访问内部类外边的属性(可以在一个类里添加一个内部类来实现接口,再给里面写一个生成内部类对象的方法,则可以在后边代码中使用外部类提供的方法使用内部类实现的接口)
- 内部类中.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
==============
当然模拟出的效果和普通类基本没什么差别。