黑马程序员技术交流社区
标题:
内部类和匿名内部类
[打印本页]
作者:
xiaoya0o0o
时间:
2015-9-17 22:04
标题:
内部类和匿名内部类
1,内部类。
1.1 内部类的由来:因为访问的特点。一个类如果直接访问另一个类中的成员,建议写内部类。
1.2 内部类出现后访问特点:
内部类可以直接访问外部类的成员,包括私有的。
外部类要访问内部类需要创建内部类的对象。
1.3 内部类在成员位置可以给成员修饰符所修饰。★★★
public : 格式 外部类名.内部类名 变量名 = new 外部类().new 内部类();
static :
情况一:访问静态内部类中的非静态成员。
外部类名.内部类名 变量名 = new 外部类名.内部类名();
情况二:访问静态内部类中的静态成员。
外部类名.内部类名.静态成员;
注意事项:
1,非静态内部类中,不允许定义静态成员,只可以定被final修饰的static常量。
2,外部类的静态方法要访问内部类,需要创建内部类的对象,一定要注意,该内部类必须被静态修饰。
否则,只能通过外部类对象.内部类对象的方式访问。看以下代码演示。
class Outer
{
static class Inner1
{
}
class Inner2
{
}
public static void method()
{
//访问Inner1.
new Inner1();
//访问Inner2非静态。
new Outer().new Inner2();
}
}
1.4 非静态内部类之所以可以直接访问外部类中的成员:原因是内部类持有了 外部类名.this
1.5 局部内部类。
局部内部类一样可以直接访问我外部类中的成员。
注意:局部内部类不能直接访问局部中的变量:局部变量生命周期太短,很有可能局部变量已消失,而内部类对象还在。
局部内部类只能访问被final修饰的局部变量,因为是一个常量,值不变。
1.6 内部类是可以继承其他类和实现接口的。★★★★
如果内部类不需要对外提供,可以通过其继承的父类或者实现的接口,这种公共的类型对外提供。
2,匿名内部类。
其实就是对1.6的简化书写。
原理:匿名内部列其实就是一个子类对象。
格式:new 父类or接口(){子类内容}
//匿名内部类练习。
interface Inter
{
public void show();
}
class Outer
{
//代码补足。要求使用匿名内部类。
public static Inter method()
{
//既然在Oute类中使用到了Inter的对象。可以使用内部类来完成。
//需要子类型,只要简化格式即可,因为接口中就只有一个方法。
return new Inter()
{
public void show()
{
//code..;
}
};
// return new Inner();
}
/*
// 还原成内部类。 当静态方法访问内部类时,内部类必须是静态的。
static class Inner implements Inter
{
public void show(){}
}
*/
}
//Outer$Inner.class 成员内部类Inner
//Outer$1Inner.class 局部内部类名称为Inner
//Outer$2.class//匿名内部类。
//面试题。
class Outer2
{
public void method()
{
//以下两个对象有区别吗?
new Object()
{
public void show(){}
}.show();//这个可以编译通过。
Object obj = new Object()
{
public void show(){}
};
// obj.show();//编译失败。为啥呢?因为匿名内部类是子类对象,当Object obj指向时,就被提升了Object。而Object类中没有定义show方法,编译失败。
}
// class Inner extends Object
// {
// public void show(){}
// }
}
class InnerClassDemo7
{
public static void main(String[] args)
{
Outer.method().show();
/*
Outer.method():Outer类中有一个method的方法。这个方式静态的。
Outer.method.show():能调用show()的必然是对象,说明method方法运算完应该返回一个对象。而且能调用Inter中的show方法,说明这个对象的类型是Inter。
*/
Inter in = Outer.method();new InterImpl();
in.show();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2