java中内部类和嵌套类

在阅读数据结构和算法(java)中,出现了一个名词是嵌套类,这是我本来不明白的。

如下为自己总结的内容,如果有出错的地方欢迎读者评论指出。

代码部分有的截图自书中,有的是复制了别的文档。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

在查阅后总结下和内部类的区别。

简单来说

static的嵌套类应该就是内部类四个小分类中的静态内部类。而非static的嵌套类应该是内部类四个小分类中的成员内部类。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

而内部类这个名字,他的四个小分类,

分别是成员内部类,静态内部类,局部内部类和匿名内部类。

针对几个内部类进行下总结:

1.成员内部类。

1.1 含义

一个类在另一个的类中,并且以一个成员的身份出现。

1.2 说明:

    1.内部类可以对外部类的任何成员进行使用,即使是private。

    2.外部类如果相对内部类成员进行使用,那么需要创建内部类对象的声明。

    3.如果内部类和外部类的成员名称或者方面名字相同的了,如果没有显示声明,默认调用的是内部类的内容。当然可以显示的调用外部类,比如,外部类.this.方法名。

代码 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class Circle {

    private double radius = 0;

    public Circle(double radius) {

        this.radius = radius;

        getDrawInstance().drawSahpe();   //必须先创建成员内部类的对象,再进行访问

    }

     

    private Draw getDrawInstance() {

        return new Draw();

    }

     

    class Draw {     //内部类

        public void drawSahpe() {

            System.out.println(radius);  //外部类的private成员,可以直接使用

        }

    }

}

     4.内部类是依赖于外部类的。除去外部类,如果其他的类想要使用内部类的成员需要先生成外部类的对象,在引用其内部类。

代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

public class Test {

    public static void main(String[] args)  {

        //第一种方式:

        Outter outter = new Outter();

        Outter.Inner inner = outter.new Inner();  //必须通过Outter对象来创建

         

        //第二种方式:

        Outter.Inner inner1 = outter.getInnerInstance();

    }

}

class Outter {

    private Inner inner = null;

    public Outter() {

         

    }

     

    public Inner getInnerInstance() {

        if(inner == null)

            inner = new Inner();

        return inner;

    }

      

    class Inner {

        public Inner() {

             

        }

    }

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

2 局部内部类

2.1 含义:一个类在另一个类的方法或局部作用域中出现。

代码:

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();

    }

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

3 匿名内部类

2.1 含义

      匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。

2.2 说明

    1. 使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。

    2. 匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。

   3. 匿名内部类在编译的时候由系统自动起名为Outter$1.class。

下面这段代码是一段Android事件监听代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

scan_bt.setOnClickListener(new OnClickListener() {

             

            @Override

            public void onClick(View v) {

                // TODO Auto-generated method stub

                 

            }

        });

         

        history_bt.setOnClickListener(new OnClickListener() {

             

            @Override

            public void onClick(View v) {

                // TODO Auto-generated method stub

                 

            }

        });

同时他等同于如下的代码: 但是一般不使用

1

 2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

private void setListener()

{

    scan_bt.setOnClickListener(new Listener1());       

    history_bt.setOnClickListener(new Listener2());

}

class Listener1 implements View.OnClickListener{

    @Override

    public void onClick(View v) {

    // TODO Auto-generated method stub

             

    }

}

class Listener2 implements View.OnClickListener{

    @Override

    public void onClick(View v) {

    // TODO Auto-generated method stub

             

    }

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

4.静态内部类(static的嵌套类)

2.1  含义

用了static进行了修饰的内部类。

2.2  说明

   在使用的时候,static的类中不能使用外部类的非static的成员或者方法。

代码:

     注意这个代码中他想使用外部类的theitems变量,但是他没有把外部类的修改改为static,而是在内部类 

创建了一个外部类的对象,这样就可以使用该变量了。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

参考:

https://www.cnblogs.com/dolphin0520/p/3811445.html

https://www.cnblogs.com/littlepanpc/p/3778472.html

猜你喜欢

转载自blog.csdn.net/qq_36098284/article/details/81186896