首页 > 其他分享 >内部类

内部类

时间:2025-01-19 22:11:48浏览次数:1  
标签:内部 void public static new class

内部类

概念

内部类的概念:将一个类定义在另一个类中

内部类的分类

  • 按定义的位置来分

    1. 成员内部内,类定义在了成员位置 (类中方法外称为成员位置,无static修饰的内部类)
    2. 静态内部类,类定义在了成员位置 (类中方法外称为成员位置,有static修饰的内部类)
    3. 局部内部类,类定义在方法内
    4. 匿名内部类,没有名字的内部类,可以在方法中,也可以在类中方法外。

    成员内部类的细节

    编写成员内部类的注意点:

    1. 成员内部类可以被一些修饰符所修饰,比如: private,默认,protected,public,static等
    2. 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。
    3. 创建内部类对象时,对象中有一个隐含的Outer.this记录外部类对象的地址值。

例子

class B{
    //成员内部类
//    class A{
//
//
//    }

    public void fun1(){
        //局部内部类
        class A{
        }
    }

}
class Demo1{
    int a = 10; // 成员变量

    public void fun1(){
        int b = 20; // 局部变量
    }
}

public class InnerClassDemo1 {
    public static void main(String[] args) {

    }
}

成员内部类可以使用外部内中的任意权限修饰符修饰的成员变量

例子
/**
 *  使用static关键字修饰成员内部类
 */
class Outer1{
    static int a = 10;
    private static int b = 20;

    //成员内部类
    static class Inner1{
        int c = 20;
        public void show1(){
            System.out.println(a); // 成员内部类可以使用外部内中的任意权限修饰符修饰的成员变量
            System.out.println(b);
            c = 100;
            System.out.println(c);
        }
    }

}
//class Outer1{
//    int a = 10;
//    private int b = 20;
//
//    //成员内部类
//    private class Inner1{
//        int c = 20;
//        public void show1(){
//            System.out.println(a); // 成员内部类可以使用外部内中的任意权限修饰符修饰的成员变量
//            System.out.println(b);
//            c = 100;
//            System.out.println(c);
//        }
//    }
//
//    public void fun1(){
//        Inner1 inner1 = new Inner1();
//        inner1.show1();
//    }
//
//}

静态成员内部类

1.格式:直接在定义内部类的时候加上static关键字
  public class A{
      static class B{
          
      }
  }

2.注意:
  a.内部类可以定义属性,方法,构造等
  b.静态内部类可以被final或者abstract修饰
    被final修饰之后,不能被继承
    被abstract修饰之后,不能new
  c.静态内部类不能调用外部的非静态成员
  d.内部类还可以被四种权限修饰符修饰
      
3.调用静态内部类成员:
  外部类.内部类 对象名 = new 外部类.内部类()
public class Person {
    public void eat(){
        System.out.println("人要干饭");
    }

    static class Heart{
        public void jump(){
            System.out.println("心脏哐哐哐跳");
        }
    }
}
public class Test01 {
    public static void main(String[] args) {
       // 外部类.内部类 对象名 = new 外部类.内部类()
        Person.Heart heart = new Person.Heart();
        heart.jump();
    }
}

非静态成员内部类

1.格式:直接在定义内部类的时候加上static关键字
  public class A{
      class B{
          
      }
  }

2.注意:
  a.内部类可以定义属性,方法,构造等
  b.静态内部类可以被final或者abstract修饰
    被final修饰之后,不能被继承
    被abstract修饰之后,不能new
  c.静态内部类不能调用外部的非静态成员
  d.内部类还可以被四种权限修饰符修饰
      
3.调用非静态内部类成员:
  外部类.内部类 对象名 = new 外部类().new 内部类()

例子

public class Person {
    public void eat(){
        System.out.println("人要干饭");
    }

    class Heart{
        public void jump(){
            System.out.println("心脏哐哐哐跳");
        }
    }
}
public class Test01 {
    public static void main(String[] args) {
       // 外部类.内部类 对象名 = new 外部类().new 内部类()
        Person.Heart heart = new Person(). new Heart();
        heart.jump();
    }
}

局部内部类

定义:

  • 局部内部类是定义在方法或作用域内部的类。它就像是方法内部的一个局部变量,只不过这个 “变量” 是一个类。

例子

public class Person {
    public void eat(){
        class Heart{
            public void jump(){
                System.out.println("杨浩东真帅");
            }
        }

        new Heart().jump();
    }
}
public class Person {
    public void eat(){
        class Heart{
            public void jump(){
                System.out.println("心脏哐哐哐的跳");
            }
        }

        new Heart().jump();
    }
}

抽象类作为方法参数和返回值

1.抽象类作为方法参数传递,传递实参时,传递的是其子类对象

2.抽象类作为方法返回值类型返回时,实际返回的是其子类对象

public abstract class Animal {
    public abstract void eat();
}
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }
}
public class Test02 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        method01(dog);
        System.out.println("=================");
        Animal animal = method02();//Animal animal = new Dog()
        animal.eat();
    }

    public static void method01(Animal animal){//Animal animal = dog
        animal.eat();
    }

    public static Animal method02(){
        return new Dog();
    }
}

匿名内部类

定义

所谓的匿名内部类,可以理解为没有显式声明出类名的内部类

匿名内部类
     语句定义格式:
         new 类|抽象类|接口(){
             方法的重写;
         }
     由JVM自己底层造了一个类去继承或者实现我们的类或者接口,我们只需要关注方法的重写逻辑就可以了,然后JVM把这个没有名字的类
     造一个对应的对象。

特点

  1. 定义一个没有名字的内部类
  2. 这个类实现了父类,或者父类接口
  3. 匿名内部类会创建这个没有名字的类的对象

例子

abstract class Demo3{
    public abstract void fun1();
}
//class Demo3Zi2 extends Demo3{
//    @Override
//    public void fun1() {
//        System.out.println("张成阳真帅!");
//    }
//}
//
//class Demo3Zi extends Demo3{
//    @Override
//    public void fun1() {
//        System.out.println("好好学习,天天向上!");
//    }
//}

class Demo3Test{
    public void show1(Demo3 demo3){
        demo3.fun1();
    }
}

public class NiMingClassDemo1 {
    public static void main(String[] args) {
        Demo3Test demo3Test = new Demo3Test();
//        demo3Test.show1(new Demo3Zi());
//        demo3Test.show1(new Demo3Zi2());

        demo3Test.show1(new Demo3() {
            @Override
            public void fun1() {
                System.out.println("好好学习,天天向上!");
            }
        });
    }
}

1.什么时候使用匿名内部类:

​ 当简单调用一次接口中的方法,我们就可以使用匿名内部类

2.将一种格式代表实现类对象或者子类对象来看待,来学习

3.匿名内部类会编译生成的,咱们不要管,我们只需要利用咱们讲的格式去new对象,调用重写的方法即可

匿名内部类复杂用法_当参数传递

public interface USB {
    void open();
}
public class Test01 {
    public static void main(String[] args) {
        method01(new USB() {
            @Override
            public void open() {
                System.out.println("usb打开了");
            }
        });
    }
    public static void method01(USB usb){
        usb.open();
    }
}

匿名内部类复杂用法_当返回值返回

public interface USB {
    void open();
}
public class Test02 {
    public static void main(String[] args) {
        USB usb = method01();
        usb.open();

    }

    public static USB method01(){
        return new USB() {
            @Override
            public void open() {
                System.out.println("USB打开了");
            }
        };
    }
}

标签:内部,void,public,static,new,class
From: https://www.cnblogs.com/03270925yhd/p/18680325

相关文章

  • Java初学者笔记-03、代码块内部类函数式编程
    代码块静态代码块static{}类加载时自动执行,类只会加载一次,静态代码块只会执行一次,往往用来对类的静态资源的初始化。实例代码块{},每次创建对象时执行,用来完成对象的初始化的。内部类一个类定义在另一个类内部,叫做内部类。使用场景:当一个类的内部,包含了一个完整的事物,且......
  • Java初学者笔记-03、代码块内部类函数式编程
    代码块静态代码块static{}类加载时自动执行,类只会加载一次,静态代码块只会执行一次,往往用来对类的静态资源的初始化。实例代码块{},每次创建对象时执行,用来完成对象的初始化的。内部类一个类定义在另一个类内部,叫做内部类。使用场景:当一个类的内部,包含了一个完整的事物,且......
  • vim内部输入中文乱码
    在Vim中输入中文时遇到乱码问题,通常是由于字符编码设置不正确或终端配置不当引起的。确保Vim和操作系统都使用相同的UTF-8编码。检查系统环境变量:确认您的系统设置了正确的LANG或LC_ALL环境变量为UTF-8。可以在命令行中运行echo$LANG来查看当前的语言环境。如果它不是以.utf8......
  • 如何解决 HTTP 500 内部服务器错误?
    HTTP500内部服务器错误通常是由于服务器端的代码问题或配置错误引起的。为了更好地诊断和解决问题,首先需要获取详细的错误信息。以下是解决HTTP500错误的步骤:1.启用详细错误信息服务器通常会屏蔽详细的错误信息,以防止泄露敏感数据。可以通过修改配置文件来显示详细的错误......
  • STM32单片机芯片与内部75 USB虚拟串口 标准库 HAL库 配置实现
    目录一、标准库工程1、USB初始化2、USB中断配置3、中断服务函数与回调接收4、USB连接5、时钟配置6、数据发送二、HAL库工程1、USB初始化2、中断服务函数与回调接收4、USB连接5、时钟配置6、数据发送一、标准库工程1、USB初始化    由官方进行适配。v......
  • STM32单片机芯片与内部74 USB 简介 控制器 通用寄存器 端点寄存器 缓冲区描述表
    目录一、USB简介二、STM32USB控制器三、通用寄存器1、USB控制寄存器(USB_CNTR)2、USB中断状态寄存器(USB_ISTR)3、USB帧编号寄存器(USB_FNR)5、USB设备地址寄存器(USB_DADDR)6、USB分组缓冲区描述表地址寄存器(USB_BTABLE)四、端点寄存器1、USB端点n寄存器(USB_EP......
  • 解锁餐饮新篇:精准搭建内部知识库,赋能高效运营
    在当今竞争激烈的餐饮行业中,提升运营效率和服务质量已成为企业脱颖而出的关键。随着餐饮业务的不断扩展,内部信息管理和知识传承成为了一大挑战。如何构建一个高效、精准的内部知识库,成为解锁餐饮新篇章的重要一环。本文将探讨如何借助智能化工具,如HelpLook,实现这一目标,为餐饮企业......
  • 拖动上传组件内部自定义组件,保留拖动上传
    遇到拖动上传组件内部自定义组件,保留拖动上传,其他上传方式取消(点击上传,有焦点回车上传)保留内容自定义组件1.这里举例vue2+antdesignvue1.x(上传组件)+elementui2.12.0(内部组件输入框)保留拖动上传,可支持输入。<a-upload-draggername="file":multiple="false"accept="imag......
  • (java)内部类&lamada&方法引用
    前言:本部分内容关联性很强,尤其是了解由匿名内部类=>lamada表达式=>方法引用的递进关系,后续的内容中,方法引用可能用的不多,见到认识即可,但是匿名内部类和lamada表达式是非常通用的表达方式。1.内部类当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可......
  • Java进阶__抽象、内部类
    抽象类和抽象方法抽象方法使用abstract关键字修饰的没有方法体的方法称为抽象方法。抽象方法必须在子类中被实现,否则子类也需要声明为抽象类。包含抽象方法的类称为抽象类。抽象类不能被实例化,不能通过new关键字创建对象。抽象类的特点抽象类可以包含属性、方法以及......