黑马程序员——内部类

来源:互联网 发布:网络举报网站 编辑:程序博客网 时间:2024/06/07 14:06

------- android培训、java培训、iOS培训、.Net培训期待与您交流! ----------


将一个类定义在另一个类的里面,对里面那个类就称为内部类

class Outer  //外部类{private int x=3;void method(){System.out.println(x);}class  Inner//内部类 ,跟其他类定义一样{void function(){System.out.println("inner:"+x); }}}


内部类的访问规则:

1.内部类可以直接访问外部类中的成员,包括私有

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

class Outer  //外部类{private int x=3;void method(){Inner in=new Inner();in.function();}class  Inner//内部类 {void function(){System.out.println("inner:"+x); }}}


直接访问内部类中的成员function

Outer.Inner in=new Outer().new Inner();   //外部类名.内部类名  变量名 外部类对象.内部类对象

in.function();

当内部类私有后不能这样访问了,此时内部类在外部类的成员位置上,有可能会将其私有

问:类能不能被private修饰

能,内部类可以被private修饰,当内部类在外部类成员位置上时

 

之所以内部类可以直接访问外部类中成员,是因为内部类中持有了一个外部类的引用 格式:外部类名.this

class Outer  {private int x=3;void method(){Inner in=new Inner();in.function();}class  Inner//内部类 {int x=4;void function(){int x=6;System.out.println("inner:"+x); //打印6System.out.println("inner:"+this.x); //打印4System.out.println("inner:"+Outer.this.x); //打印3}}}


访问格式:

1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,可以直接建立内部类对象

2.当内部类在成员位置上,就可以被成员修饰符所修饰,如private:将内部类在外部类中进行封装。static:内部类就具备了static的特性,当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限

什么时候写静态内部类?

类中几乎是静态的时候,不涉及特有数据,全共享数据

注意事项:

1.当内部类中定义了静态成员,该内部类必须是static

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

 

当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容

内部类只有定义在成员位置上时才能被privatestatic所修饰,一般内部类是不会被public所修饰,内部类还能定义在类的任意位置上,成员包括局部,局部内部类中不能定义静态成员

内部类定义在局部时:

1.不可以被成员修饰符修饰

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

匿名内部类

1.匿名内部类其实就是内部类的简写格式

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

abstract class AbsDemo{abstract void show();}class Outer{int x=3;class Inner extends AbsDemo  //也可以继承非抽象的{void show()  //复写父类的show方法{System.out.println("show:"+x);}}public void function(){new Inner().show();}}


简化成匿名内部类形式

abstract class AbsDemo{abstract void show();}class Outer{int x=3;public void function(){new AbsDemo(){void show(){System.out.println("show:"+x);}}.show();}}


3.匿名内部类的格式:

new 父类或者接口()

{

定义子类的内容;

}


4.其实匿名内部类就是一个匿名子类对象,可以理解为带内容的对象,匿名对象调用方法只能调用一次,

弊端:1)不能直接调用自己方法

      2)不能有强转动作

       3)若抽象方法很多,用匿名对象全得复写一遍,代码已经没有阅读性,一般写匿名内部类里面方法不超过三个

5.匿名内部类中定义的方法,最好不要超过三个,最好两个或者一个

什么时候用匿名内部类?

当使用的方法参数类型是一个接口类型时,该接口里面方法不超过三个时,可以定义一个匿名内部类,把匿名内部类作为参数传进去


0 0