【JavaSE】内部类讲解(二)

简介: 【JavaSE】内部类讲解

四、静态内部类

被 static 修饰的内部成员类称为静态内部类

class Out{
    //静态内部类
    static class Inner{
    }
}

(1)静态内部类的成员变量和方法的构建

跟实例内部类类似,静态内部类也可以创建成员变量和方法,唯一不同的是,静态内部类可以创建静态的方法静态的成员变量!!

静态内部类中的静态成员变量可以不被 final 修饰

class Out{
    //静态内部类
    static class Inner{
        public int data1 = 1;
        private int data2 = 2;
        public static int data3 = 3;
        public void Inner(){
            System.out.println("静态内部类的构造方法");
        }
        public void func1(){
            System.out.println("静态内部类的普通方法");
        }
        public static void func2(){
            System.out.println("静态内部类的静态方法");
        }
    }
}

(2)静态内部类在实外创建

由于静态内部类是静态的,不依赖与外部类实例化对象,所以实例化就不需要创建外部类对象!!

外部类.内部类 变量名 = new 外部类.内部类;
class Out{
    //静态内部类
    static class Inner{
        public void Inner(){
            System.out.println("静态内部类的构造方法");
        }
        public void func1(){
            System.out.println("静态内部类的普通方法");
        }
        public static void func2(){
            System.out.println("静态内部类的静态方法");
        }
    }
}
public class Demo2 {
    public static void main(String[] args) {
        Out.Inner inner = new Out.Inner();
        inner.func1();
    }
}

注意:在外部类中,实例化静态内部类也是直接用类名实例化!

(3)在静态内部类中访问外部类成员变量

注意:在静态内部类中不能直接方法外部类中非静态的成员变量

class Out{
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;
    //静态内部类
    static class Inner{
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;
        public void Inner(){
            System.out.println("静态内部类的构造方法");
        }
        public void func1(){
            System.out.println("静态内部类的普通方法");
            System.out.println("外部类中静态成员变量 data3:"+data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
}

 ① 在静态内部类中访问外部类非静态的成员变量

   因为静态内部类是静态的,不依赖于外部类对象,所以我们要想在静态内部类中访问,就要构建一个外部类对象。

class Out{
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;
    //静态内部类
    static class Inner{
        public void Inner(){
            System.out.println("静态内部类的构造方法");
        }
        public void func1(){
            Out out = new Out();
            System.out.println("外部类非静态成员变量 data1:"+out.data1);
            System.out.println("外部类非静态成员变量 data2:"+out.data2);
        }
    }
}

(4)总结


五、局部内部类

局部内部类是在方法内部定义的内部类

public class Demo3 {
    public void Func(){
        /**
         * 局部内部类
         * 不能被 public static 修饰
         */
        class Inner{
        }
    }
    public static void main(String[] args) {
    }
}

注意:


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


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


     ③ 因为局部内部类局限性很大,所以平时很少用  

六、匿名内部类        

       匿名类是一个没有类名的特殊内部类,也叫匿名内部类,适合于只使用一次的类。创建匿名内部类是须继承一个已有的父类或则实现一个接口。

new 父类名/接口名(){
    //类体
};

(1)静态内部类在实外创建

       因为匿名内部类既是一个类的定义,同时它本身也是一个对象,在类外创建是可以使用该继承的父类名或实现的接口名接收!

父类名/接口名 变量名 = new 父类名/接口名(){
    //类体
};

① 继承父类实现内部类

匿名内部类继承的父类可以是 普通类 也可以是 抽象类!

class B{
    public void func2(){
    };
}
abstract class C{
    abstract void func3();
}
public class Demo1 {
    public static void main(String[] args) {
       B b = new B(){
         public void func2(){
             System.out.println("继承普通类的匿名内部类"); 
         };
       };
        C c = new C() {
            @Override
            void func3() {
                System.out.println("继承抽象的匿名内部类");
            }
        };
        b.func2();
        c.func3();
    }
}

② 实现接口创建内部类

interface A{
    public abstract void func1();
}
public class Demo1 {
    public static void main(String[] args) {
        A a = new A() {
            @Override
            public void func1() {
                System.out.println("实现接口的匿名内部类");
            }
        };
        a.func1();
    }
}

      这里创建内部类的过程类似于,一个类实现了A接口,这不过这个类是没有名字的。

(2)匿名内部类的成员变量和方法的构建

      匿名内部类由于本身没有名字,所以就不存在构造方法,同时也不能包含静态的成员!!但是普通的成员直接可以创建

A a = new A() {
            public int data1 = 1;
            @Override
            public void func1() {
                System.out.println("实现接口的匿名内部类");
            }
            public void func2(){
                System.out.println("匿名内部类的普通方法");
            }
        };

注意:匿名内部类中可以有许多方法,但是在类外只能调用重写的方法!!


简而言之就是,与 继承的父类 或 实现的接口中方法 同名的,匿名内部类才能调用

(3)匿名内部类访问外部类的成员变量和局部变量

 在匿名内部类中,可以直接访问外部类的静态成员变量和局部变量!


 非静态成员变量需要构建外部类实例才能访问

interface A{
    void func();
}
public class Out {
    public static int data1 = 1;
    public int data2 = 2;
    private int data3 = 3;
    public static void main(String[] args) {
        String name ="威威";
        A a = new A() {
           @Override
           public void func() {
               System.out.println(name);
               System.out.println(data1);
               Out out = new Out();
               System.out.println(out.data2);
               System.out.println(out.data3);
           }
       };
       a.func();
    }
}

注意:外部其他类不能访问匿名内部类,因为匿名内部类实际上就是一个局部变量!!

(4)总结

以上就是内部类的讲解,有错误的地方希望大家能批评指正,别忘了点赞👍+收藏⭐️哦

相关文章
|
Python
wxPython StaticText控件背景色透明
wxPython StaticText控件背景色透明
248 0
|
传感器 数据采集 供应链
港口智能化,我们这样做!
港口智能化,我们这样做!
570 0
港口智能化,我们这样做!
|
9月前
|
存储 资源调度 Java
计算机基础(1)——计算机体系结构和组成
计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。 在过去的几十年里,计算机科学经历了令人瞩目的飞速发展。经历了电子管、晶体管、集成电路的世代发展,体积越来越小、性能越来越强,为人类带来了巨大的便利和变革,下面我们来回顾计算机的发展历程。
2776 2
计算机基础(1)——计算机体系结构和组成
网络数据包收发流程(三):e1000网卡和DMA
一、硬件布局每个网卡(MAC)都有自己的专用DMA Engine,如上图的 TSEC 和 e1000 网卡intel82546。上图中的红色线就是以太网数据流,DMA与DDR打交道需要其他模块的协助,如TSEC,PCI controller以太网数据在 TSECDDR  PCI_Co...
5754 1
|
6月前
|
JSON API 数据格式
深入研究:1688商品评论API详解
本文介绍如何通过第三方数据服务平台获取1688商品评论数据。由于1688官方未提供通用评论API,商家和研究人员可借助第三方接口分析消费者反馈、优化产品与服务。使用时需注册账号获取API Key,并通过必要参数(如商品ID、页码等)调用接口,返回JSON格式的评论数据。文中提供了Python示例代码,利用`requests`库发送请求,帮助用户快速上手,注意根据实际平台调整API地址和参数。
221 12
|
C++
【洛谷 B2025】输出字符菱形 题解(raw string literal)
使用`*`构建一个斜置的、对角线长度为5的菱形。无输入要求。输出示例:`*`、`***`、`*****`、`***`、` *`。代码实现使用C++,直接打印预定义字符串完成。
243 0
|
Web App开发 缓存 网络协议
get和post的区别!
get和post的区别!
|
数据安全/隐私保护
spring-boot-starter-data-elasticsearch es带x-pack后台配置
spring-boot-starter-data-elasticsearch es带x-pack后台配置
196 0
|
IDE Linux Go
Golang安装和配置指南:从零开始的高效开发之旅
Golang安装和配置指南:从零开始的高效开发之旅