内部类详解

java中我们把一个类放在另一个类内部定义,我们称这样的类为内部类。

内部类分为成员内部类、局部内部类和匿名内部类。成员内部类包含静态内部类和非静态内部类。局部内部类定义在方法中,像是一局部变量。匿名内部类主要是接口和抽象类的继承类实例化(一般类继承也是可以的,注意匿名代表没有名字!!!)。以下是两种内部类的代码解析。

成员内部类:1静态内部类,静态内部类就像是类中的静态成员变量,其引用实例化可以直接类名.内部类类名()。

public class Outer{

        String  property1 =“学生”;

       static String    property2="老师";

       static class Inner {

       public void run(){

       System.out.println(" I am a "+property);

      }

      }

}

public class Test {

      public static void mian (String[] args){

     Outer.Inner inner =new Outer.Inner();

     inner.run();

 

}

}

注意静态内部类只能使用外部类的静态属性,非静态内部类从属于对象,创建了静态内部类对象不一定创建了外部类对象所以无法使用非静态外部类的属性。编译器找不到非静态内部类的属性地址。

2非静态内部类:非静态内部类如同非静态成员变量,所以从属于外部类对象中。故创建非静态内部类对象需要外部类的对象存在,使用外部类对象创建内部类对象。

public class Outer{

          String  property="学生";

          class Inner {

           String property ="老师";

           public void prin(){

                     System.out.printlc(property);

                     }

           }

}

public class Test{

           public static void main (String[] args){

                      Inner inner=new Outer().new Inner();

                      Outer out =new Outer();

                       Inner inner2=outer.new Inner();

                       inner.prin();

                        inner2.prin();

           }

}

最后输出为老师,老师。由于非静态内部类就如非静态内部成员变量存在于外部类的对象中,所以一定要用外部类的对象创建内部类的对象,同时内部类可以直接引用外部类的成员变量以及静态方法(如果内部类具有相同名字的属性则首先用内部类的属性)但是外部类不可以访问内部类的属性。

局部内部类:局部内部类出现于方法中

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class People{

    public People() {

         

    }

}

 

class Man{

    public Man(){

         

    }

     

    public People getWoman(){

        class Woman extends People{   //局部内部类

            int age =0;

        }

        return new Woman();

    }

}

  注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

匿名内部类:匿名内部类就如其名,内部类的名字是匿名的不可见的。主要用于接口和抽象类被继承的子类创建对象。以接口为例

public interface listener {
    String name ="ssss";
    public void  run();
}

public class Stutent {
    private String name;
    private int id;
    private int age;
    
    public Stutent(listener listener) {
        // TODO Auto-generated constructor stub
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void study() {
        System.out.println("I am learning");
    }
    public void sayHello(){
        System.out.println("HelloWord!!");
    }
    
}

public class Test{

         public static void main(String[] args){

                    Stutent stutent=new Stutent(new listener() {
        
                       @Override
                        public void run() {
                       
            
                        }

           }

}

其中new  student的时候我们创建了内部类继承接口listener因为listener不能直接实例化,并且在内部类中重写抽象方法。类名且不可见。然后创建对象。(在抽象类中非抽象方法可重写也可不重写)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值