JavaSE - 内部类

目录

final定义常量

1. 内部类

1.1 实例内部类

1.1.1 如何获取实例内部类的对象

1.1.2 实例内部类中不能有静态的成员变量

1.1.3 实例内部类方法中可以直接访问外部类中的任何成员

1)在实例内部类方法中访问同名的成员时,优先访问自己的(就近原则)

2)如果非要访问外部类同名的成员,该怎么办呢?

1.1.4 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象

1.1.5 实例内部类也受public、private等访问限定符的约束

1.1.6 代码

1.2 静态内部类 

1.2.1 如何获取静态内部类的对象

​1.2.2 静态内部类中可以有静态的成员变量和成员方法

1.2.3 静态内部类方法中不能访问外部类中的非静态成员

1.2.4 外部类中,不能直接访问静态内部类中的成员,如果要访问必须先要创建内部类的对象

1.2.5 实例内部类也受public、private等访问限定符的约束

1.2.6 代码 

1.3 局部内部类

1.3.1 局部内部类只能在所定义的方法体内部使用 

1.3.2 不能被public、static等修饰符修饰

1.3.3 代码 

1.4 匿名内部类

2. 对象的打印


final定义常量

final - 定义常量

常量是在程序编译的时候确定的,一旦初始化,就不能进行修改了,只能初始化一次。

JavaSE - 内部类_第1张图片

一般定义常量使用 static final ,static 表示只有一份,final表示是常量,不能被修改。 

1. 内部类

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服 务,那么整个内部的完整结构最好使用内部类。内部类也是封装的一种体现。

分类:

  1. 实例内部类(又叫构造内部类、非静态内部类)
  2. 静态内部类
  3. 局部内部类
  4. 匿名内部类 

1.1 实例内部类

1.1.1 如何获取实例内部类的对象

先对外部类进行实例化,再对实例内部类进行实例化

 1.1.2 实例内部类中不能有静态的成员变量

JavaSE - 内部类_第2张图片

非要定义,只能是被 static final 修饰的常量。

JavaSE - 内部类_第3张图片

(1)因为静态成员变量在外部类(OuterClass)加载时就会被执行,而InnerClass实例化需要外部类对象的引用(outerClass),要先有外部类对象。静态成员会先于InnerClass执行,所以静态的成员变量不能在实例内部类中。

(2)在static后加上final并且赋值了,就不报错可以运行了。因为加上final再赋值,此代码就相当于一个常量,常量在编译时就确定了它的值

1.1.3 实例内部类方法中可以直接访问外部类中的任何成员

1)在实例内部类方法中访问同名的成员时,优先访问自己的(就近原则

JavaSE - 内部类_第4张图片

2)如果非要访问外部类同名的成员,该怎么办呢?

法一:在实例内部类方法中实例化外部类对象,用 外部类对象的引用.同名成员 来访问

JavaSE - 内部类_第5张图片

法二:在实例内部类方法中,拿到外部类的this(外部类对象的引用)用 外部类名称.this.同名成员 来访问

 JavaSE - 内部类_第6张图片

1.1.4 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象

JavaSE - 内部类_第7张图片

 JavaSE - 内部类_第8张图片

  1.1.5 实例内部类也受public、private等访问限定符的约束

 JavaSE - 内部类_第9张图片

1.1.6 代码

//实例内部类
class OuterClass{
    public int data1 = 1;
    int data2 = 2;
    public static int data3 = 3;
    public void test(){
        System.out.println("OutClass:test()");
       // System.out.println(data4); error
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.data4);
    }
    class InnerClass{
        public int data1 = 111;
        public int data4 = 4;
        int data5 = 5;
        public static final  int data6 = 6;

        public  void func(){
            System.out.println("InnerClass:func()");
            System.out.println(data1);
            System.out.println(OuterClass.this.data1);
          /*  OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.data1);*/ //也可以
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        //OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass(); 也可以
     OuterClass outerClass = new OuterClass();
     OuterClass.InnerClass innerClass = outerClass.new InnerClass();
     innerClass.func();
    }
}

1.2 静态内部类 

1.2.1 如何获取静态内部类的对象

不需要先创建外部类对象,就能获取静态内部类对象(静态的,是属于类的)

1.2.2 静态内部类中可以有静态的成员变量和成员方法

JavaSE - 内部类_第10张图片

静态的是属于类的,在外部类加载时都会被执行。

1.2.3 静态内部类方法中不能访问外部类中的非静态成员

因为外部类中的非静态成员需要先实例化外部类对象,通过外部类对象的引用才能访问

JavaSE - 内部类_第11张图片

 JavaSE - 内部类_第12张图片

1.2.4 外部类中,不能直接访问静态内部类中的成员,如果要访问必须先要创建内部类的对象

JavaSE - 内部类_第13张图片

JavaSE - 内部类_第14张图片

1.2.5 实例内部类也受public、private等访问限定符的约束

 JavaSE - 内部类_第15张图片

1.2.6 代码 

//静态内部类
class OuterClass2{
    public int data1 = 1;
    int data2 = 2;
    public static int data3 = 3;
    public void  test(){
        System.out.println("OuterClass2:test()");
        InnerClass2 innerClass2 = new InnerClass2();
        System.out.println(innerClass2.data4);
    }
    static class InnerClass2{
        public int data4 = 4;
        int data5 = 5;
        public static int data6 = 6;
        public void func(){
            System.out.println("InnerClass2:func()");
            OuterClass2 outerClass2 = new OuterClass2();
            System.out.println(outerClass2.data1);
            System.out.println(outerClass2.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
}
public class Test2 {
    public static void main(String[] args) {
        OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();
        innerClass2.func();
    }
}

1.3 局部内部类

定义在外部类的方法体中,只能在其定义的位置使用。几乎不被使用

1.3.1 局部内部类只能在所定义的方法体内部使用 

JavaSE - 内部类_第16张图片

 JavaSE - 内部类_第17张图片

1.3.2 不能被public、static等修饰符修饰

 JavaSE - 内部类_第18张图片

1.3.3 代码 

//局部内部类
public class Test3 {
    public void test(){
        class Inner{
            public void func(){
                System.out.println("Inner:func");

            }
        }
        Inner inner = new Inner();
        inner.func();

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

1.4 匿名内部类

后续来补充

2. 对象的打印

重写toString

为啥要重写toString?重写toString为什么就能实现打印了呢?

我的以下博客中有详细介绍:

JavaSE - 调用和重写Object类中的toString方法、equals方法以及理解Arrays类中的toString方法

@Override - 注解,帮你检查 你重新写的 对不对

JavaSE - 内部类_第19张图片 

你可能感兴趣的:(JavaSE,java,开发语言)