JavaSE - 内部类

文章详细阐述了Java中的内部类,包括实例内部类、静态内部类、局部内部类和匿名内部类的特性,如实例内部类不能有静态变量,静态内部类可以直接访问外部类的静态成员,以及如何获取各类内部类的对象。同时,提到了final关键字用于定义常量,常量在编译时即确定且不可修改。文章还讨论了如何在内部类中访问外部类的成员以及外部类如何访问内部类成员的问题。
摘要由CSDN通过智能技术生成

目录

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 - 定义常量

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

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

1. 内部类

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

分类:

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

1.1 实例内部类

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

 

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 静态内部类中可以有静态的成员变量和成员方法

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

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

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

 

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

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

 

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 局部内部类只能在所定义的方法体内部使用 

 

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

 

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 匿名内部类

new Test2(); —— 匿名对象
new Test2(){}; —— 匿名内部类

创建一个匿名内部类对象,并调用重写的func方法: 

 

 用引用接收了一下匿名内部类对象,引用调用了func方法。

 

2. 对象的打印

重写toString

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值