Java的内部类和匿名内部类

1.内部类

2.访问内部类

3.匿名内部类


1.内部类

1.内部类就是一个类定义在另一个类中。

2.A类要直接访问B类的成员时,可以将A类定义在B类中。哪怕访问的是B类的私有成员也可以。

3.规则:内部类可以直接访问外部类的成员,但外部类要想访问内部类的成员,只能通过创建内部类的对象来访问。

4.内部类相当于外部类的一个成员。可以被成员修饰符修饰。如 public,private,static等等。如果内部类的权限是非私有的,就可以被外部的用户程序访问到。

5.非静态的内部类中不能定义静态的变量,若非要用static修饰,就得同时用final修饰,表示静态常量。

6.为什么内部类可以直接访问外部类的成员?因为内部类持有了外部类的引用----- 外部类名.this 。但内部类是静态时就不持有外部类的引用了。


2.访问内部类

1.外部类访问内部类成员

2.外部用户程序访问内部类

3.静态非私有的内部类访问方法


1.外部类访问内部类成员:

只能通过创建内部类对象。那怎么创建呢?就是在外部类中定义一个方法,new一个内部类,再用其引用来访问内部类的成员。

class Outer //外部类
{
    class inter //内部类
    {
        int num = 5;
    }
    public void method()  //用于创建内部类对象
    {
        inter in = new inter();
        System.out.println(in.num); //访问内部类的num变量
    }
}

public class Main
{
    public static void main(String []args)
    {
        Outer out = new Outer();
        out.method();
    }
}
//打印结果:5

2.外部用户程序访问内部类成员

class Outer //外部类
{
    class inter //内部类
    {
        int num = 5;
    }
    public void method()  //用于创建内部类对象
    {
        inter in = new inter();
        System.out.println(in.num); //访问内部类的num变量
    }
}

public class Main
{
    public static void main(String []args)
    {
        Outer.inter in = new Outer().new inter();   //只要内部类不是私有的,就能通过用户程序创建其对象。
        System.out.println(in.num);
    }
}
//打印结果:5

3.静态非私有的内部类访问方法

        Outer.inter in = new Outer.inter();
        System.out.println(in.num);
跟上面的访问非静态的内部类不同,创建对象时不需要顺带创建外部类的对象。因为static静态修饰的东西不需要对象就可以调用。

class outer
{
    static class inter
    {
        int num = 5;
    }
}
public class Main
{
    public static void main(String[] args)
    {
        outer.inter in = new outer.inter();
        System.out.println(in.num);
    }
}
//打印结果:5


3.匿名内部类

匿名内部类用于简化代码。

匿名内部类一般用于实现抽象类的方法或者实现接口。

匿名内部类只调用一次。

使用匿名类的前提条件:必须继承一个抽象父类或者实现一个接口


没有使用匿名内部类的代码:

abstract class Person
{
    public abstract void show();
}

class Man extends Person
{
    public void show()
    {
        System.out.println("this is man");
    }
}

public class Main
{
    public static void main(String []args)
    {
        Person p = new Man();
        p.show();
    }
}
//打印结果:this is a man
可以看出,代码是实现多态的一个代码。Man类继承Person类后,随后就通过 Person p = new Man() 向上提升为Person对象。然后用户操作的其实就是person的引用p。那么Man类实际上就是用了一次,作用就是用来实现Person类的抽象方法而已。那岂不浪费?如果使用匿名内部类的哈,完全就不需要敲Man类的定义代码了。

如:

abstract class Person
{
    public abstract void show();
}

public class Main
{
    public static void main(String []args)
    {
        Person p = new Person(){
            public void show()
            {
                System.out.println("this is a man");
            }
        };
        p.show();
    }
}
//打印结果:this is a man


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值