初步学会JavaSE内部类知识

初步学会JavaSE内部类知识,第1张

🎐

本篇主要介绍Java中的类与对象中 的内部类


👩🏻‍🏫作者: 初入编程的菜鸟哒哒
📚系列文章目录:

一、TvT——JavaSE(1)–Java的数据类型与变量
二、TvT——JavaSE(2)–Java的运算符
三、TvT——JavaSE(3)–Java的逻辑控制
四、TvT——JavaSE(4)–Java方法的使用
五、你真的学会了JavaSE中数组的定义与使用吗?
六、Java中的类与对象来袭
七、类与对象有关static成员的知识你真的了解吗?
八、有关代码块的知识你真的了解吗?


📜刷题笔记:
📖TvT——C语言进阶の刷题【1】:指针进阶
📖面试高频题の环形链表 环形链表Ⅱ 全解析


文章目录
  • 前言
  • 内部类
  • 🔊1.实例内部类:
    • 🎼1.1 实例内部类当中不可以定义静态的成员变量。
    • 🎼1.2 实例内部类当中不可以定义静态的成员方法
    • 🎼1.3 如何实例化 实例内部类:
    • 🎼1.4 实例内部类成员变量与外部类成员变量重名问题
  • 🔊2.静态内部类
    • 🎼2.1 如何定义一个静态内部类
    • 🎼2.1 如何拿到静态内部类的对象
    • 🎼2.2 静态内部类如何访问外部类的成员
  • 🔊3. 局部内部类
  • 🔊4. 匿名内部类
  • 总结

前言

大家记得联系上一篇博客一起学习。
Java中的类与对象来袭


内部类

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。在Java中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。
内部类也是封装的一种体现。


class superClass {
    class downClass {

    }
}

这个代码superClass就是外部类,downClass就是superClass的内部类。

内部类有很多种:

  1. 实例内部类
  2. 静态内部类
  3. 本地内部类(了解)
  4. 匿名内部类 (这个后面学完接口再介绍)
🔊1.实例内部类:

这个downClass就是实例内部类:

class superClass {
    class downClass {

    }
}
🎼1.1 实例内部类当中不可以定义静态的成员变量。


如定义,那么这个静态的成员应该是被final 修饰的。❓ 那为什么不能定义?
因为内部类的调用是依赖于外部类对象才能调用,而静态的不依赖于对象。
下面的不可以定义静态成员方法也是一个道理。

🎼1.2 实例内部类当中不可以定义静态的成员方法

🎼1.3 如何实例化 实例内部类:
public class Tset2 {
    superClass aClass = new superClass() ;
    superClass.downClass Class = aClass.new downClass();
}
外部类类名.内部类 变量名 = 外部类引用.new内部类();

或者:

   superClass.downClass Class = new superClass().new downClass();

那我可不可以在内部类中访问外部类的成员变量呢?
是可以的。

🎼1.4 实例内部类成员变量与外部类成员变量重名问题
class superClass {
    public int age1 = 1;
    private int age2 = 2;
    public static int age3 = 3;
    /**
     实例内部类
    */
    class downClass {
        public int age1 = 111;
        public int age4 = 4;
        private int age5 = 5;
        public final static int AGE6 = 6;

        public downClass(){
            System.out.println("实例内部类的构造方法");
        }
        public void func1(){
            System.out.println("实例内部类的普通方法");
            System.out.println(age1);
            System.out.println(age2);
            System.out.println(age3);
            System.out.println(age4);
            System.out.println(age5);
        }

    }
}
public class Tset2 {
   public static void main(String[] args) {
       superClass.downClass Class = new superClass().new downClass();
       Class.func1();
   }
}

此时内部类的age1就与外部类的age1重名了,那func1()里面打印出来的age1是什么呢?
答案是内部类的age1

那这种情况怎么在内部类里面调用外部类的age1呢?
很简单,只需要superClass.this.age1这样写就ok。


一个类生成一个字节码文件。
内部类字节码文件的命名格式为:外部类$内部类

实例内部类的注意事项:

  1. 外部类中的任何成员都可以被在实例内部类方法中直接访问
  2. 实例内部类所处的位置与外部类成员位置相同,因此也受publicprivate等访问限定符的约束
  3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名 称.this.同名成员 来访问
  4. 实例内部类对象必须在先有外部类对象前提下才能创建
  5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
  6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。


🔊2.静态内部类 🎼2.1 如何定义一个静态内部类
class Home {
    /**
     * 静态内部类:
     */
    static class Room {
    
    }
}
🎼2.1 如何拿到静态内部类的对象

只需要:

Home.Room room = new Home.Room();
class Home {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;

    /**
     * 静态内部类:
     * 1、如何拿到静态内部类的对象?
     * Home.Room room = new Home.Room();
     */
    static class Room {
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;
        public Room() {
            System.out.println("静态内部类的构造方法!");
        }
    }

}

public class TestDemo {
    public static void main(String[] args) {
        Home.Room room = new Home.Room();
    }
}

🎼2.2 静态内部类如何访问外部类的成员

静态内部类不能直接访问外部类的非静态的数据成员,因为静态内部类不依赖于实例对象。

如果一定要访问:
那就创建一个实例对象就可以了

或者:

this.home = home;给当前引用赋值一个对象。

注意事项:

  1. 在静态内部类中只能访问外部类中的静态成员
  2. 创建静态内部类对象时,不需要先创建外部类对象
🔊3. 局部内部类

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少,此处简单了解下语法格式。

public class OutClass { 
    int a = 10;
public void method(){ 
    int b = 10; 
    // 局部内部类:定义在方法体内部 
    // 不能被public、static等访问限定符修饰
    class InnerClass{
        public void methodInnerClass(){ 
            System.out.println(a); 
            System.out.println(b); 
        }
    }
 // 只能在该方法体内部使用,其他位置都不能用 
     InnerClass innerClass = new InnerClass(); 
     innerClass.methodInnerClass(); 
 }

注意事项:

  1. 局部内部类只能在所定义的方法体内部使用
  2. 不能被publicstatic等修饰符修饰
  3. 编译器也有自己独立的字节码文件,命名格式:
    外部类名字$内部类名字.class
  4. 几乎不会使用
🔊4. 匿名内部类

匿名对象:

匿名对象没有名字,并且只能使用一次

匿名内部类:

总结

你可以叫我哒哒呀
本篇到此结束
“莫愁千里路,自有到来风。”
我们顶峰相见!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/917298.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存