首页 > 编程语言 >Java基础13

Java基础13

时间:2024-09-07 20:51:54浏览次数:9  
标签:13 Java 内部 eat 基础 class Person Bird public

内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为 内部类 ,类B则称为 外部类。 

内部类的声明理由:

当一个事物A的内部,有一部分需要一个完整的结构B进行描述,而这个内部结构B只为外部事物A提供服务,并不会在其他地方用到,那么整个内部的完整结构B最好使用内部类。

遵循 高内聚、低耦合 的面向对象开发原则。

举例: Thread类内部声明了State类,表示线程的生命周期。

      HashMap类中声明了Node类,表示封装的key和Value

分类:(参考变量的分类)

> 成员内部类:直接声明在外部类的里面

  > 使用static修饰的: 静态的成员内部类

  > 不使用static修饰的:非静态的成员内部类

> 局部内部类:声明在方法内、构造器内、代码块内的内部类

  > 匿名的局部内部类

  > 非匿名的局部内部类

class Person{ // 外部类
    // 静态的成员内部类
    static  class Dog{

    }

    // 非静态的成员内部类
    class Bird{

    }

    public void method(){
        // 局部内部类
        class InnerClass1{

        }
    }

    public Person(){
        // 局部内部类
        class InnerClass1{

        }
    }

    {
        // 局部内部类
        class InnerClass1{
            
        }
    }
}

成员内部类的理解

> 从类的角度看:

  - 内部可以声明属性、方法、构造器、代码块、内部类等结构

  - 此内部类可以声明父类,可以实现接口

  - 可以使用final修饰

  - 可以使用abstract修饰

> 从外部类的成员的角度看:

  - 在内部可以调用外部类的结构。比如:属性、方法等

  - 除了使用public、缺省权限修饰之外,还可以用private、protected修饰

  - 可以使用static修饰

创建成员内部类的实例

public class OuterClassTest {
    public static void main(String[] args) {
        //1.创建Person的静态的成员内部类的实例
        Person.Dog dog = new Person.Dog();
        dog.eat();
        //2.创建Person的非静态的成员内部类的实例
//    Person.Bird bird = new Person.Bird();  错误写法
        Person p1 = new Person();
        Person.Bird bird = p1.new Bird();
        bird.eat();

    }
}

class Person{ // 外部类
    // 静态的成员内部类
    static  class Dog{
        public void eat(){
            System.out.println("吃骨头!");
        }
    }

    // 非静态的成员内部类
    class Bird{
        public void eat(){
            System.out.println("鸟吃虫!");
        }
    }
}

在成员内部类中调用外部类的结构

public class OuterClassTest {
    public static void main(String[] args) {
        //1.创建Person的静态的成员内部类的实例
        Person.Dog dog = new Person.Dog();
        dog.eat();
        //2.创建Person的非静态的成员内部类的实例
//    Person.Bird bird = new Person.Bird();  错误写法
        Person p1 = new Person();
        Person.Bird bird = p1.new Bird();
        bird.eat();
        bird.show("黄鹂");
        bird.show1();
    }
}

class Person{ // 外部类
    String name = "Tom";
    int age = 20;
    // 静态的成员内部类
    static  class Dog{
        public void eat(){
            System.out.println("吃骨头!");
        }
    }

    // 非静态的成员内部类
    class Bird{
        String name = "啄木鸟";
        public void eat(){
            System.out.println("鸟吃虫!");
        }
        public void show(String name){
            System.out.println("age = " + age);  // 20
            System.out.println("name = " +name);  // 黄鹂  show 方法的形参
            System.out.println("name = " + this.name);  // 啄木鸟 (谁调用这个方法就是谁)
            System.out.println("name = " + Person.this.name);  // Tom
        }
        public void show1 (){
            eat();  // 鸟吃虫!
            this.eat();  // 鸟吃虫!
            Person.this.eat();  // 人吃饭!
        }
    }
    public void eat(){
        System.out.println("人吃饭!");
    }
}

局部内部类的使用

public class OuterClassTest {
    // 说明:局部内部类的使用
    public void method1(){
        // 局部内部类
        class A{
            // 可以声明属性、方法等
        }
    }

    //开发中的场景
    public Comparable getInstance(){  //返回一个实现了Comparable的对象
        // 提供了实现Comparable接口的类
        // 方式1: 提供了接口的实现类的匿名对象
        class MyComparable implements Comparable{
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        }
        return  new MyComparable();
    }

    public Comparable getInstance1(){
        // 方式2:提供了接口的匿名实现类的对象
        Comparable c = new Comparable() {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };
        return c;
    }

    public Comparable getInstance2(){
        // 方式3:提供了接口的匿名实现类的匿名对象
        return new Comparable() {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };
    }

}

 

标签:13,Java,内部,eat,基础,class,Person,Bird,public
From: https://www.cnblogs.com/gjwqz/p/18402130

相关文章

  • Java多线程中常见死锁问题及解决方案
    在编写Java多线程代码的时候,很难避免会出现线程安全问题,在线程安全问题中也有一个很常见的现象就是死锁现象。今天我们就来聊一聊Java中的死锁问题,以及如何避免死锁问题。本次知识点讲解建立在大家已经知道“锁”......
  • Java反序列化漏洞-TemplatesImpl利用链分析
    目录一、前言二、正文1.寻找利用链2.构造POC2.1生成字节码2.2加载字节码1)getTransletInstance2)defineTransletClasses2.3创建实例3.完整POC三、参考文章一、前言java.lang.ClassLoader#defineClassdefineClass可以加载字节码,但由于defineClass的作用域是protected,所以攻......
  • 基于Node.js+vue基于JavaWeb的在线英语学习管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着全球化进程的加速和互联网技术的飞速发展,英语作为国际通用语言的重要性日益凸显。然而,传统英语学习方式受限于时间、地点及教学资源等因素,难以满足广大......
  • C++ 模板基础知识——可变参数模板
    目录C++模板基础知识——可变参数模板1.可变参函数模板1.1基本含义1.2利用constexprif优化递归函数1.3关于constexprif的进一步理解1.4重载2.折叠表达式2.1一元左折(UnaryLeftFold)2.2一元右折(UnaryRightFold)2.3二元左折(BinaryLeftFold)2.4二元右折......
  • 图神经网络基础(1)
    1.什么是图?        我们最熟悉的社交网络就是一个最典型的图       通常用图指代一种广义的抽象结构,用来表示一堆实体和它们之间的关系。实体被叫作图的节点,而实体和实体之间的关系构成了图的边。—个图G={γ,g}包含一个节点集合γ和一个边的集合g。以社......
  • Linux基础操作
    目录1:XShell下的复制粘贴2:全屏3:进入自己的用户4:用root账户,创建普通用户5:输错时可以ctrlc换行 指令可以携带选项 文件属性​编辑​编辑6:文件介绍和类型7:ls指令(ls/home查看自己的创建用户)8:pwd命令9:cd指令10:touch指令11:mkdir指令(重要)12:tree的创......
  • 【Java】爬取澳门区划信息
    官网地址:https://macaostreets.iam.gov.mo/zh_mo/freguesiaindex.html大区部分是在页面展示的 点击发现并没有请求网络,所以数据是js中存在的 找到了展示街道方法,这一段:使用大区id匹配上述变量的functionshowStreets(freguesia){varfreguesiaStre......
  • ComfyUI 基础教程(三) —— 应用 Controlnet 精准控制图像生成
    一、前言你是否有见过下面类似这样的图片:看起来平平无奇,当你站远点看,或者把眼睛眯成一条缝了看,你会发现,这个图中藏有一些特别的元素。这就是利用了Ai绘画中的ControlNet,实现对图片的相对更精准控制。上一篇文章讲述了文生图的基本工作流和最基础的核心插件用法。通过提示......
  • 网络编程基础
    五种IO模型计算机编程中,IO模型是描述程序与输入/输出操作之间交互方式的抽象概念。不同的IO模型可以影响程序的性能、可扩展性和资源利用效率。我们常见有五种IO模型:阻塞式IO、非阻塞式IO、IO多路复用、信号驱动IO、异步IO。阻塞式IOlistenfd=socket();//打开......
  • C++继承基础
    虚函数默认实参C++默认实参是靠编译器实现的,因此默认实参不参与动态绑定,默认实参有静态类型决定。访问控制每个类分别控制自己的成员初始化过程,还分别控制其成员对于派生类来说是否可访问,友元不继承。成员:protected:派生类可见、自己、friend可见public:所有可见private:自己......