iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >【JavaSE】内部类
  • 564
分享到

【JavaSE】内部类

java开发语言内部类 2023-09-14 15:09:41 564人浏览 安东尼
摘要

文章目录 内部类概念局部内部类匿名内部类(重点重点!!! )成员内部类静态内部类 内部类概念 可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的

文章目录

内部类概念

可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件。

public class OutClass {//外部类class InnerClass{ //内部类}}

上面的代码中,OutClass是外部类,InnerClass就是内部类。它与普通外部类最大的不同,在于其实例对象不能单独存在,必须依附于一个外部类的实例对象。

局部内部类

局部内部类是定义在外部类的局部位置,通常在方法里。它拥有外部类中所有元素的访问权限。不能添加访问修饰符,因为它就相当于是一个局部变量,但是可以使用final修饰。作用域仅仅只能在定义它的方法或代码块中。

class Outer{ //外部类    private int a = 1;//私有属性    private void fun2(){ //私有方法        System.out.println("Outer fun2()");    }        public void fun1(){         System.out.println("Outer fun1()");                final class Inner{ //局部内部类            private int a = 2;            public void funInner(){                System.out.println(a); // 1 外部变量名重名 就近原则                //Outer.this本质上就是外部类的对象,即哪个对象调用了fun1,Outer.this就指向哪个对象                System.out.println(Outer.this.a); // 2                fun2();            }        }        Inner inner = new Inner();        inner.funInner();    }}
public class InnerClass {    public static void main(String[] args) {        Outer outer = new Outer();        outer.fun1();    }}

如果外部类和局部内部类成员重名时,默认遵循就近原则,如果想要访问外部类成员可以使用 外部类名.this.成员名

匿名内部类(重点重点!!! )

匿名内部类就是指没有类名的内部类,必须在创建时使用 new 语句来声明。通常情况下,如果一个方法的参数是接口类型,且该接口只需要实现一次,那么我们就可以通过匿名内部类的形式来进行定义。

基于接口的匿名内部类实例:

class Outer1 {    private int a = 10;    public void method() {        //基于接口的匿名内部类        IA person = new IA() {            @Override            public void eat() {                System.out.println("正在吃大餐");            }        };        //查看person的运行类型        System.out.println("person的运行类型:" + person.getClass()); // Outer1$1        person.eat();    }}//接口interface IA {    void eat();}class Person implements IA {    @Override    public void eat() {        System.out.println("吃");    }}public class AnonInter {    public static void main(String[] args) {        Outer1 outer1 = new Outer1();        outer1.method();    }}
IA person = new IA() {@Overridepublic void eat() {System.out.println("正在吃大餐");}};//上面这段代码其实就相当于class Outer1$1 implements IA {@Overridepublic void eat() {System.out.println("正在吃大餐");}}

jdk底层在创建匿名内部类 Outer1$1 时,立即创建了 Outer1$1 实例,并且把地址返回给了person,匿名内部类只能使用一次就不能再使用了。

基于类的匿名内部类抽象内部类实例:

class Outer2 {    public void method() {        //编译类型:Animal        //运行类型:Outer2$1        Animal animal = new Animal("小白"){ //基于类的匿名内部类            @Override            public void eat() {                System.out.println("匿名内部类重写了eat()");;            }        };        animal.eat();        System.out.println(animal.getClass()); //animal的运行类型 Outer2$1                //编译类型:Robot        //运行类型:Outer2$2        Robot robot = new Robot(){ //基于抽象类的匿名内部类            @Override            void run() {                System.out.println("正在奔跑");            }        };        robot.run();        System.out.println(robot.getClass());// robot的运行类型 Outer2$2    }}class Animal implements IC {    String name;    public Animal(String name) {        this.name = name;    }    public void eat(){        System.out.println("Animal 在吃东西");    }    @Override    public void run() {        System.out.println("重写的run()");    }}abstract class Robot { //抽象类    abstract void run();}interface IC { //接口    void run();}//测试public class InterClass {    public static void main(String[] args) {        Outer2 outer2 = new Outer2();        outer2.method();    }}

匿名内部类细节
匿名内部类既是一个类的定义,同时也是一个对象,从语法上看,它即有定义类的特征,也有创建对象的特征。

public class AnonClassDatil {    public static void main(String[] args) {        Outer3 outer3 = new Outer3();        outer3.fun();    }}class Outer3 {    public void fun(){        Car car = new Car(){ // 运行类型 Outer3$1            @Override            public void speed() {                System.out.println("重写了speed()");;            }        };        car.speed(); //动态绑定        //也可以直接调用        new Car(){            @Override            public void speed() {                System.out.println("直接调用speed()");            }        }.speed();    }}class Car {    public void speed() {        System.out.println("Car speed()");    }}

请看下面的代码

public class InnerExcise {    public static void main(String[] args) {        fun(new IQ() { //当做实参直接传递 简洁高效            @Override            public void show() {                System.out.println("正在学习Java内部类");            }        });    }    public static void fun(IQ iq) { //静态方法 形参是接口类型        iq.show();    }}interface IQ {    void show();}

练习:
有一个铃声接口Bell,里面有一个ring方法,有一个手机类 CellPhone,具有闹钟的功能alarmClock,参数是Bell类型,测试手机类的闹钟功能,通过匿名内部类作为参数,打印 “起床了要迟到了”,再传入另一个匿名内部类,打印 “已经迟到了”。

public class InnerExcise1 {    public static void main(String[] args) {        CallPhone callPhone = new CallPhone();        callPhone.alarmClock(new Bell() { //传递的是实现了Bell接口的匿名内部类            @Override            public void ring() {                System.out.println("起床了要迟到了");            }        });        callPhone.alarmClock(new Bell() {            @Override            public void ring() {                System.out.println("已经迟到了");            }        });    }}interface Bell {    void ring();}class CallPhone {    public void alarmClock(Bell bell) {        bell.ring(); // 动态绑定    }}

成员内部类

成员内部类是定义在外部类的成员位置,并且没有static修饰,可以访问外部类的所以成员,包括私有成员。可以添加任意访问修饰符,因为它本质上就是一个成员。简而言之,成员内部类就是指没有被static修饰的内部类,也可以称为非静态内部类。

public class InnerExcise2 {    public static void main(String[] args) {        Outer5 outer5 = new Outer5();        outer5.fun();    }}class Outer5 {    private int a = 10;    private class Inner { // 可以添加任意访问修饰符        public void say() {            System.out.println(a); //可以访问外部类的所有成员,包括私有成员        }    }    public void fun() {        Inner inner = new Inner();        inner.say();    }}
public class InnerExcise2 {    public static void main(String[] args) {        Outer5 outer5 = new Outer5();        outer5.fun();        //外部其他类 使用成员内部类的几种方式        // 第一种 outer5.new Inner() 相当于是把new Inner()当成一个成员        Outer5.Inner outer51 = outer5.new Inner();         outer51.say();        Outer5.Inner outer52 = outer5.shawOuter5();        outer52.say();    }}class Outer5 {    private int a = 10;    public class Inner { // 可以添加任意访问修饰符        public void say() {            System.out.println(a); //可以访问外部类的所有成员,包括私有成员        }    }    //第二种 定义一个方法 返回一个Inner对象    public Inner shawOuter5() {        return new Inner();    }    public void fun() {        Inner inner = new Inner();        inner.say();    }}

如果有重名的成员,会遵守就近原则,如果要访问外部类成员,访问方法和上面的一样,外部类名.this.成员名。

静态内部类

静态内部类和成员内部类的定义类似,但要使用static修饰,所以称为静态内部类。静态内部类不再依附于Outer的实例,而是一个完全独立的类,因此无法引用Outer.this的方式调用。但它可以访问Outer类的private静态字段和静态方法,如果我们把静态内部类移到Outer类之外,就失去了访问private的权限。

public class StaticInnerClass {    public static void main(String[] args) {        Outer6 outer6 = new Outer6();        outer6.fun1();        //外部其他类访问静态内部类        //静态内部类可以直接通过类名访问        Outer6.Fun fun1 = new Outer6.Fun();        fun1.show();        //通过定义一个方法返回静态内部类        Outer6.Fun fun2 = outer6.getFun();        fun2.show();    }}class Outer6 {    private static int a = 99;    private static String str = "java";        static class Fun {        public static int a = 999;        public void show() {            System.out.println(str);            System.out.println(a); //同名成员遵循就近原则            System.out.println(Outer6.a); //通过 外部类名.成员名访问        }    }    public void fun1() {        Fun fun = new Fun();        fun.show();    }    public Fun getFun() {        return new Fun();    }}

静态内部类中只能访问静态外部类的静态属性和方法

来源地址:https://blog.csdn.net/qq_58032742/article/details/132490956

--结束END--

本文标题: 【JavaSE】内部类

本文链接: https://www.lsjlt.com/news/407465.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【JavaSE】内部类
    文章目录 内部类概念局部内部类匿名内部类(重点重点!!! )成员内部类静态内部类 内部类概念 可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的...
    99+
    2023-09-14
    java 开发语言 内部类
  • 解析JavaSe的内部类
    目录内部类1. 内部类简介2. 非静态内部类3. 静态内部类4. 匿名内部类总结内部类 1. 内部类简介 (1) 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包...
    99+
    2022-11-13
  • JavaSE学习之内部类及常用API
    目录1.内部类1.1内部类概述1.2成员内部类1.3局部内部类1.4匿名内部类1.5匿名内部类在开发中的使用2.常用API2.1Math2.2System2.3Object2.4Ar...
    99+
    2022-11-12
  • JavaSE中内部类及常用API有哪些
    这篇文章将为大家详细讲解有关JavaSE中内部类及常用API有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.内部类1.1 内部类概述内部类:就是在一个类中定义一个类。例如:在一个类A内部定义一个类...
    99+
    2023-06-22
  • JAVASE---String类
    String类的重要性 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常...
    99+
    2023-10-09
    java 开发语言
  • 【JavaSE】String类
    两种创建String对象的区别 String s1 = "hello";String s2 = new String("hello"); s1是先查看常量池是否有 “hello” 数据空间,如果有就直...
    99+
    2023-09-07
    java 开发语言 String
  • Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)
    内部类是什么? 字面意思,在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。 内部类是类的第五大成员→【提示:类的五大...
    99+
    2023-10-26
    jvm
  • 【javaSE】 抽象类
    目录 抽象类概念 抽象类语法 抽象类特性 1. 抽象类不能直接实例化对象 2. 抽象方法不能是 private 的 3. 抽象方法不能被final和static修饰 4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法 5. 抽象类...
    99+
    2023-09-01
    java 开发语言 抽象类
  • java内部类之成员内部类、局部内部类和匿名内部类用法及说明
    目录内部类概念分类成员内部类使用成员内部类间接方式访问内部类直接方式访问内部类外部类和内部类变量重名问题局部内部类修饰内部类的权限匿名内部类测试类 一、匿名内部内应用总结内部类概念 ...
    99+
    2022-12-23
    java成员内部类 java局部内部类 java匿名内部类 java内部类
  • 怎么使用Java内部类、成员内部类、静态内部类和方法内部类
    这篇文章主要讲解了“怎么使用Java内部类、成员内部类、静态内部类和方法内部类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Java内部类、成员内部类、静态内部类和方法内部类”吧!&...
    99+
    2023-06-15
  • Java内部类与匿名内部类
    目录一、内部类什么是内部类成员内部类访问特点二、匿名内部类前提格式使用方式一、内部类 什么是内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。 成员...
    99+
    2022-11-13
  • java内部类,为什么需要内部类?
    为什么需要内部类? 解决了多继承的问题,继承具体或抽象类。 一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。 内部...
    99+
    2022-10-18
  • 如何理解Java内部类中的局部内部类
    这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或...
    99+
    2023-06-05
  • Java 内部类
    文章目录 1、初识内部类 2、非静态内部类(实例内部类) 3、静态内部类(重点) 4、内部类的使用 5、局部内部类 6、匿名内部类 ...
    99+
    2023-09-16
    java
  • java外部类与内部类简介
     一、内部类 内部类就是将一个类A定义在类B里边,里边的那个类A称为内部类,外边的类B称为外部类 成员内部类定义格式: class 外部类{ class 内部类{ } } ...
    99+
    2022-11-12
  • JAVASE---抽象类和接口
    抽象类 抽象类的概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类语法 在Java中,一个类如果被 abst...
    99+
    2023-09-21
    java 开发语言
  • javaSE的Arrays类怎么用
    本篇内容主要讲解“javaSE的Arrays类怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javaSE的Arrays类怎么用”吧!在JDK的java.util包中定义的Arrays类提供...
    99+
    2023-06-17
  • 如何理解Java内部类中的匿名内部类
    如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名...
    99+
    2023-06-05
  • 如何理解Java内部类中的成员内部类
    如何理解Java内部类中的成员内部类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的...
    99+
    2023-06-05
  • java外部类与内部类怎么理解
    本篇内容主要讲解“java外部类与内部类怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java外部类与内部类怎么理解”吧! 一、内部类内部类就是将一个类A定义在类B里边,里边的...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作