菜鸟学JAVA之——内部类

内部类

内部类:定义在一个类里面的类。一般的内部类包括:成员内部类、局部内部类、匿名内部类和静态内部类 ,下面我们说一下成员内部类和静态内部类

一、成员内部类

成员内部类是最普通的内部类,定义在一个类的里面,代码如下

public class TestInnerClass {
	private int f = 1; 
    //内部类
    public class InnerClass {
        private int a = 1;
        private void test() {
            f = 6;
            System.out.println(f);//在内部类中,不用创建对象就可以调用外部类的所有属性和方法(包括私有的)
        }
    }
    public void foo() {
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.a); //而在外部类中调用内部类中的任何东西都需要先创建内部类对象
        innerClass.test();
   }
}

在内部类中,不用创建对象就可以调用外部类的属性,而在外部类中调用内部类中的任何东西都需要先创建内部类对象。 为什么?

这两个类属于所属型级别,InnerClass这个类是TestInnerClass这个类的从属,内部类包含外部类的属性方法。这里可以把内部类理解为外部类的一个方法,但是他也是一个类,外部类想要访问他,还是需要先创建对象才能调用它内部的属性方法。

这里需要注意:如果成员内部类与外部类的属性名或方法名重名时,则外部类的这些属性方法会被隐藏,即默认情况下访问的是成员内部类的成员。如果要访问外部类的成员需要为以下格式

外部类.this.成员变量

外部类.this.成员方法

举个例子

class TestInnerClass {
    private int a = 1;
    class InnerClass {
        private int a = 2;
        public void print() {
            int a = 3;
            System.out.println("局部变量:" + a);
            System.out.println("内部类变量:" + this.a);
            System.out.println("外部类变量:" + TestInnerClass.this.a);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        TestInnerClass.InnerClass i = new TestInnerClass().new InnerClass();
        i.print();
        //输出  3
        //     2
        //     1
    }
}

内部类对象的创建

**成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。**创建成员内部类对象的一般方式如下:

TestInnerClass.InnerClass c = new TestInnerClass().new InnerClass();

如果不想创建外部类对象就创建内部类对象,这就需要内部类是静态的(静态内部类),创建静态内部类对象的一般方式如下:

TestInnerClass.InnerClass i = new TestInnerClass.InnerClass();

二、静态内部类

静态内部类同样是定义在一个类里面,但是需要被static修饰,静态内部类不依托于外部类(静态内部类模板被放在元数据区里),并且静态内部类不能调用外部类的动态属性或方法。这点与之前讲的静可调动,但动不能调静一样。

  1. 在外部类加载的时候,静态内部类也随之加载,它的完整类名是,编译后的class的文件名为。
  2. 由于静态内部类是静态的,所以它无法访问外部类的非静态成员。
  3. 其实,静态内部类相对外部类来说,几乎是独立的,它可以在没有外部类对象的情况下,单 独创造一个内部类的对象。
  4. 从某种程度来说,公开的静态内部类就相当于一个普通的类。
  5. 其相对于外部类来说,仅仅是包含关系,缩小了命名空间,完整类名中多了一个外部类的名称。
  6. 本质上是两个独立的类,JVM也不知道它们两个有包含关系。

三、内部类的作用:

1.解决多继承问题

我们都知道Java中不存在多继承,如果要想实现多继承就需要通过接口。这里我们也可以通过内部类来实现,具体实现来看代码

public class TestInnerClass extends A {
    //内部类
    public class InnerClass extends B{
       //这里既可以用父类A的属性方法,也能用B的属性方法,相当于实现了多继承
    }
}

2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

平时我们对类的访问权限都是通过类前面的访问修饰符来限制的,一般的外部类,只能是public或default的,但内部类可以被四种访问控制符修饰,所以我们能通过内部类来隐藏我们的信息。

学习参考

https://www.runoob.com/w3cnote/java-inner-class-intro.html

https://www.iteye.com/blog/luhantu-1933263

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章