内部类的应用

1.什么事内部类?

答:一个类在另一个类的成员位置或者局部位置上,这个类就叫做另一个类的内部类。

 *当内部类在成员位置上,就可以被成员修饰符所修饰。
 * 比如:private :将内部类在外部类中进行封装。
 * static:内部类就具备了static的特性,只能访问外部类中的static成员。
//外部类
class Outer3{
//内部类,并且私有化内部类。
private   class   Inner3{

}
}


2.什么时候使用内部类?

答:当描述一个事物时,事物中还有事物时,内部事物要使用外部事物,外部事务使用内部事物,使用内部类。


3.内部类与外部类的访问规则

***********

a.内部类访问外部类的规则:

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

class Outer3{
private int  x=3;
class Inner3{
private int  x=5;
void show()
{
int x=8;
//内部类直接调用外部类对象
//当内部类中没有同名成员变量和局部变量时,等效于System.out.println(Outer3.this.x);
//当内部类中存在同名局部变量时,此时调用的是局部变量,否则调用同名内部成员变量

System.out.println(x);


//指定调用内部类的成员变量

System.out.println(this.x);


//指定调用外部类的成员变量
System.out.println(Outer3.this.x);



}
}
}

********************

*******************

b.外部类访问内部类的规则:

外部类要访问内部类必须先建立内部类对象;当内部类定义在外部类的成员位置上,而且私有,可以在外部其他类中建立内部类对象。

public class InnerLianXi {
public static void main(String args[])
{
/*格式:
*外部类名.内部类名. 变量名=外部类对象.内部类对象;
*/
Outer3.Inner3 inn  = new Outer3().new Inner3();
inn.show();
}
}

   c.注意:当内部类中定义了静态成员,该内部类必须是static的。
     当外部类中的静态方法访问内部类时,内部类必须是静态的。

*//外部类直接访问静态内部类成员
//new Outer.Inner().function();
//外部类直接访问静态内部类静态成员
Outer.Inner.function();

4.匿名内部类:

匿名内部类其实就是(子类)内部类的简写格式。该内部类一定是某个类的子类或者实现了某个接口。


//定义一个父类
abstract class Father
{
void fun(){}
}

//定义一个外部类
class OuterSon
{
/*直接定义子类内部类调用内部类的成员
class Son extends Father{
void fun(){System.out.println("132");};
}
public void show()
{
Son son=new Son();
son.fun();
}*/
//使用匿名内部类调用内部类成员
public void show()
{
new Father() {

void fun() {
System.out.println(213);
}
}.fun();//此处等同于Son son=new Son();son.fun();

}

}
public class InnerLianXi2 {
public static void main(String args[])
{

new OuterSon().show();//调用外部类的show方法。
}
}

5.实现接口的匿名内部类:

a.直接定义内部类对象:

//定义一个car接口

interface car
{
void  fun();  
}

//定义内部类

class OuterClass
{
/*直接定义Txcar类实现接口car
class Txcar implements car {
public  void fun(){System.out.println("fun run");}

}

}

public class InnerLianXi3 {
public static void main(String args[])
{

//定义内部类对象,并调用fun方法。
OuterClass.Txcar t=new OuterClass().new Txcar();
t.fun();

}
}

b.使用匿名内部类,在外部类定义car类型的方法返回内部类对象。



interface car
{
void  fun();  
}


class OuterClass
{

//定义functio方法返回一个匿名内部类对象
  car function()
  {
 return new car() {


public void fun() {
System.out.println("fun run...");
}
};
  }
}


public class InnerLianXi3 {
public static void main(String args[])
{

//定义一个匿名内部类对象
OuterClass o=new OuterClass();
//用function返回的对象调用fun方法
o.function().fun();

}

}


c.直接在主函数里传递匿名内部类对象



interface car
{
void  fun();  
}
class OuterClass
{
}


public class InnerLianXi3 {
public static void main(String args[])
{
//在show方法中调用匿名内部类对象
show(new car() {


public void fun() {

System.out.println("run ...");
}
});
}

//定义一个方法传递接收匿名内部类对象
public static void show(car c)
{
c.fun();
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值