您的位置:首页 > 职场人生

黑马程序员-java中内部类知识点总结

2013-12-10 16:35 363 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

内部类:将一个类定义在另一个类里面。内部类可以直接访问外部类中的成员,包括私有成员。

格式 Outer.Inner in=new Outer().new Inner();

成员内部类:就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。外部类访问内部类成员必须先建立内部类对象。外面的其他类要访问内部类时,需要实例化,格式 Outer.Inner in=new Outer().new Inner();

这里需要内部类不是private。之所以可以可以直接访问外部类中的成员,是因为内部类中持有并隐藏了一个外部类的引用,格式 外部类名.this.成员 。如
class Outer{
int x=1;
class Inner{
int x=2;
public void a(){
int x=3;
System.out.println(x);
System.out.println(this.x);
System.out.println(Outer.this.x);
}
}
}

输出结果为321
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

当内部类被static修饰后,它只能访问外部类的静态成员。

注意:当内部类中有静态成员,该内部类必须是static的。当外部类中的静态方法访问内部类时,内部类也必须是static的。

局部内部类:是指内部类定义在方法和作用域内。

内部类定义在局部时,1不可以被成员修饰符修饰。
    2可以直接访问外部类中的成员,因为还持有外部类的引用。但是不可以访问它所在局部中的变量。只能访问被final修饰的局部变量。

public class Parcel4 {
public Destination destination(String s) {
class PDestination implements Destination {
private String label;

private PDestination(String whereTo) {
label = whereTo;
}

public String readLabel() {
return label;
}
}
return new PDestination(s);
}

public static void main(String[] args) {
Parcel4 p = new Parcel4();
Destination d = p.destination("Tasmania");
}
}
public class Parcel5 {
private void internalTracking(boolean b) {
if (b) {
class TrackingSlip {
private String id;
TrackingSlip(String s) {
id = s;
}
String getSlip() {
return id;
}
}
TrackingSlip ts = new TrackingSlip("slip");
String s = ts.getSlip();
}
}

public void track() {
internalTracking(true);
}

public static void main(String[] args) {
Parcel5 p = new Parcel5();
p.track();
}
}
局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。

 匿名内部类:
1匿名内部类其实就是内部类的简写格式。
2定义匿名内部类的前提:内部类必须是继承一个外面的类或者接口,甚至可以继承自己所在的类。
如:
class Inter2{
void method2() {
}
static Inter2 in2=new Inter2(){//定义Inter2的子类
void method3(){}
void method2(){}
};
}

abstract class Inter3{
abstract void method();
Inter3 in3=new Inter3(){//定义Inter3的子类
void method(){}
};
}

3匿名内部类的格式: new 父类或者接口(){定义子类的内容}.方法();实在没有父类了,就new一个Object作
为此类的父类。
4其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。
5匿名内部类中定义的方法最好不要超过3个。

在实际开发时候,会大量用到匿名内部类,因为它简单方便。

----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: