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

黑马程序员_内部类

2014-01-12 19:08 260 查看
------- android培训java培训、期待与您交流!
----------

内部类(内置类、嵌套类)

1.内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。

2.内部类的访问规则:

1).内部类可以直接访问外部类中的成员,包括私有,是因为内部类中持有了一个外部类的引用,格式:外部类名.this。

2).外部类要访问内部类,必须建立内部类对象。

例子:

classOuter{

int num = 4;

class Inner {

void show(){

System.out.println("inner show run "+num);

}

}

public void method(){

Inner in = new Inner();//创建内部类的对象。

in.show();//调用内部类的方法。

}

}

3.访问格式:

1),默认修饰符:当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。

可以直接建立内部类对象。

格式:外部类名.内部类名
变量名= 外部类对象.内部类对象;

Eg:Outer.Innerin = new Outer().new Inner();

2),当内部类在成员位置上,就可以被成员修饰符所修饰。

比如,private修饰符:将内部类在外部类中进行封装。

static修饰符:内部类就具备static的特性。

当内部类被static修饰后,只能直接访问外部类中的static成员。出现
了访问局限。

在外部其他类中,如何直接访问static内部类的非静态成员呢?

newOuter.Inner().function();

在外部其他类中,如何直接访问static内部类的静态成员呢?

uter.Inner.function();

注意:当内部类中定义了静态成员,该内部类必须是static的。

当外部类中的静态方法访问内部类时,内部类也必须是static的。

4.内部类定义的原则

当描述事物时,事物的内部还有事物,该事物用内部类来描述。

因为内部事务在使用外部事物的内容。

5.内部类编译后的文件名为:“外部类名$内部类名.java”;

6.内部类定义在局部时:

①不可以被成员修饰符所修饰。

②可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量。

例子:

class Outer

{

int x = 3;

void method(final int a)

{

final int y = 4;

class Inner

{

void function()

{

System.out.println(y);

}

}

new Inner().function();

}

}

class InnerClassDemo

{

public static void main(String[] args)

{

Outer out = new Outer();

out.method(7);//4

out.method(8);//4

}

}

7.匿名内部类:

1).匿名内部类其实就是内部类的简写形式。

2)定义匿名内部类的前提:内部类必须是继承一个类或者实现接口.

3).匿名内部类的格式:new
父类或者接口(){定义子类的内容}

定义格式:

接口名变量 = new
接口名(){

覆盖抽象方法

};

变量.方法名();

4).其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为有内容的对象。

5).匿名内部类中定义的方法最好不要超过3个

例子:

abstract class AbsDemo

{

abstract void show();

}

class Outer

{

int x = 3;

public void function()

{

AbsDemo d = new AbsDemo()

{

int num = 9;

void show()

{

System.out.println("num==="+num);

}

void abc()

{

System.out.println("haha");

}

};

d.show();

}

}

class InnerClassDemo3

{

public static void main(String[] args)

{

new Outer().function();//9

}

}

6).匿名内部类的使用场景:

当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。

其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。

8.小练习

练习一:1和2的写法正确吗?有区别吗?说出原因。

//1

new Object(){

void show(){

System.out.println("showrun");

}}.show();

//2

Object obj = new Object(){

void show(){

System.out.println("showrun");

}};

obj.show();

1和2的写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。

两者之间的区别:

第一个可是编译通过,并运行。

第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,就被提升为了Object类型,而编译时检查Object类中是否有show方法,所以编译失败。

练习二:通过匿名内部类补足Outer类中的代码。

interface Inter{

void show();

}

class Outer{//通过匿名内部类补足Outer类中的代码。

public static Inter method(){

return new Inter(){

publicvoid show(){}

};

}

}

class InnerClassDemo7 {

public staticvoid main(String[] args) {

Outer.method().show();

}

}

Outer.method():意思是:Outer中有一个名称为method的方法,而且这个方法是静态的。

Outer.method().show():当Outer类调用静态的method方法运算结束后的结果又调用了show方法,意味着:method()方法运算完一个是对象,而且这个对象是Inter类型的。

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