首页 > 编程语言 >Java基础:内部类

Java基础:内部类

时间:2024-11-15 21:44:04浏览次数:3  
标签:Java 内部 void 基础 匿名 new public name

欢迎来到“雪碧聊技术”CSDN博客!

在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。

让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!

目录

一、什么是内部类

1、内部类的定义

2、内部类的应用场景

3、内部类有哪几种?

①成员内部类

②静态内部类

③局部内部类

④匿名内部类(重点掌握)

二、成员内部类

1、定义

2、创建对象的格式

举例:

3、成员内部类中,访问其他成员的特点

4、例题

5、总结

三、静态内部类

1、定义

2、创建对象的格式

举例:

3、静态内部类中,访问其他成员的特点

4、总结

四、局部内部类(看看就好)

五、匿名内部类(重点学习,也是后续学习的基础)

1、认识匿名内部类

①匿名内部类的特点

②匿名内部类的作用

③总结

2、常见的使用形式

①通常作为一个对象参数传递给方法

举例1:老师、学生游泳比赛

举例2:使用实现Runnable接口的方式,创建一个线程

3、应用场景

①调用别人提供的方法实现需求时,这个方法正好可以让我们传递一个匿名内部类对象。(重要)

②使用comparator接口的匿名内部类实现对数组进行排序(重要)​编辑


一、什么是内部类

1、内部类的定义

        如果一个类,定义在另一个类的内部,这个类就叫内部类。

        内部类是类的五大成分之一。(成员变量、方法、构造器、代码块、内部类)

2、内部类的应用场景

        当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

        举例:汽车里面,包含了一个完整的发动机,此时这个发动机类,就是汽车类的内部类。

3、内部类有哪几种?

①成员内部类

②静态内部类

③局部内部类

④匿名内部类(重点掌握)

二、成员内部类

1、定义

        就是类中的一个普通成员,类似我们之前学过的普通的成员变量、成员方法。

2、创建对象的格式

举例:

public class Test1 {
    public static void main(String[] args) {
        Outer.Inner i1 = new Outer().new Inner();
        i1.show();
    }
}

//外部类
class Outer{
    //成员内部类:无static修饰,属于外部类的对象持有的
    class Inner{
        private String name;
        //构造器
        public Inner(){
            System.out.println("Inner() name = "+ name);
        }
        //内部类的成员方法
        public void show(){
            System.out.println("show");
        }
        //get/set
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
}

运行结果:

3、成员内部类中,访问其他成员的特点

        ①成员内部类中,可以直接访问外部类的静态成员、实例成员

        ②成员内部类的实例方法中,可以直接拿到当前寄生的外部类对象:外部类名.this

举例:

4、例题

public class Test2 {
    public static void main(String[] args) {
        People.Heart heart = new People().new Heart();
        heart.show();
    }
}

class People{
    private int heartBeat = 100;

    //成员内部类
    public class Heart{
        private int heartBeat = 80;

        public void show(){
            int heartBeat = 200;
            //在此依次输出200,80,100
            System.out.println(heartBeat);//200
            System.out.println(this.heartBeat);//80
            System.out.println(People.this.heartBeat);//100
        }
    }
}

运行结果:

5、总结

三、静态内部类

1、定义

        有static修饰的内部类,属于内部类自己持有。

        举例:

2、创建对象的格式

举例:

public class Test3 {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner();
        inner.show();
    }
}

class Outer{

    static class Inner{
        public void show(){
            System.out.println("内部类的show()方法");
        }
    }
}

运行结果:

3、静态内部类中,访问其他成员的特点

        ①静态内部类中,可以直接访问外部类的静态成员

        ②静态内部类中,不可以直接访问外部类的实例成员

4、总结

四、局部内部类(看看就好)

五、匿名内部类(重点学习,也是后续学习的基础)

1、认识匿名内部类

        简单来说:匿名内部类,本质是一个子类,并且会立即创建出一个子类对象。

        ①匿名内部类,是一种特殊的局部内部类。

        ②所谓匿名:指的是程序员不需要为这个类声明名字,默认有个隐藏的名字。

        举例:

        注意:不要看见new就以为是在创建对象,上面是内部类的写法。

①匿名内部类的特点

        匿名内部类本质就是一个子类,并会立即创建出一个子类对象。

        举例:

        

        我们可以把上面这个内部类,理解成一个Animal类的子类对象,比如猫类对象、狗类对象。

        观察源码:

②匿名内部类的作用

        用于更方便地创建一个子类对象。

③总结

2、常见的使用形式

①通常作为一个对象参数传递给方法

举例1:老师、学生游泳比赛

public class Test4 {
    public static void main(String[] args) {
        //获取一个实现了Swim接口的类的对象
        Swim s1 = new Swim() {
            public void swimming() {
                System.out.println("学生游得快~");
            }
        };
        start(s1);

        //获取一个实现了Swim接口的类的对象
        Swim s2 = new Swim() {
            public void swimming() {
                System.out.println("老师游得快~");
            }
        };
        start(s2);
    }

    //该方法要求传入一个实现了Swim接口的类的对象(属于多态写法)
    public static void start(Swim s){
        System.out.println("开始...");
        s.swimming();
        System.out.println("结束...");
    }

}

interface Swim{
    void swimming();
}

运行结果:

开始...
学生游得快~
结束...
开始...
老师游得快~
结束...

举例2:使用实现Runnable接口的方式,创建一个线程

public class test3 {
    public static void main(String[] args) {
        //掌握:匿名内部类写法


        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println("子线程输出:"+i);
                }
            }
        }).start();
        
        //主线程任务
        for (int i = 0; i < 5; i++) {
            System.out.println("主线程输出:"+i);
        }
    }
}

运行结果:

子线程输出:0
主线程输出:0
子线程输出:1
主线程输出:1
子线程输出:2
子线程输出:3
主线程输出:2
子线程输出:4
主线程输出:3
主线程输出:4

3、应用场景

①调用别人提供的方法实现需求时,这个方法正好可以让我们传递一个匿名内部类对象。(重要)

②使用comparator接口的匿名内部类实现对数组进行排序(重要)

举例:

public class Test5 {
    public static void main(String[] args) {
        Student[] students = new Student[6];
        students[0] = new Student("张三", 18, 174, '男');
        students[1] = new Student("三丰",15, 179, '男');
        students[2] = new Student("张无忌",28, 194, '男');
        students[3] = new Student("殷素素",35, 184, '女');
        students[4] = new Student("李四",40, 177, '男');
        students[5] = new Student("王五",18, 154, '男');

        //对上述数组进行排序(根据age年龄排序)
        Arrays.sort(students, new Comparator<Student>() {
            public int compare(Student o1, Student o2) {
                /*if(o1.getAge() > o2.getAge()){
                    return 1;
                }else if(o1.getAge() < o2.getAge()){
                    return -1;
                }
                return 0;*/
                return o1.getAge() - o2.getAge();
            }
        });

        //输出排序后的数组
        for(Student s: students){
            System.out.println(s.toString());
        }

    }
}

class Student{
    private String name;//姓名
    private int age;//年龄
    private double height;//身高
    private char sex;//性别
    //构造器
    public Student(String name, int age, double height, char sex) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.sex = sex;
    }
    //get、set
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public char getSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
    //toString
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                ", sex=" + sex +
                '}';
    }
}

 

以上就是内部类的全部内容,特别要注意其中“匿名内部类”的相关知识,比较重要也很常用。

如果想了解更多的Java知识,请关注本博主~~

标签:Java,内部,void,基础,匿名,new,public,name
From: https://blog.csdn.net/qq_63981644/article/details/143791083

相关文章

  • ICEMCFD网格划分基础教程
    (1)(2)ICEMCFD基础教程(一级水平)大小:5.4G声明:带案例文件,为英文视频教程。————————————————————————目录——————————————————————————————————————————————本课程涵盖的研讨会/案例包括课程1:NACA0012具......
  • Java基础夯实——1. 6 Java泛型
    Java的泛型概念Java的泛型(Generics是一种参数化类型的机制。它允许在定义类、接口和方法时使用类型参数,这些类型参数可以在使用该类、接口或方法时被具体的类型所替换。示例://一个简单的泛型类publicclassBox<T>{privateTvalue;publicvoidsetVal......
  • 【Java的JIT技术】
    JIT(JustInTime)编译器,也称即时编译器,主要在JVM运行时期动态的做一些优化提升代码的运行速度和效率。大家都知道,jvm运行时是通过解释器将每一条class字节码指令翻译成机器指令去执行。JIT则不同,它会在jvm运行时期动态的将热点代码编译成机器指令,缓存下来.之......
  • Springboot 整合 Java DL4J 打造金融风险评估系统
    ......
  • linux运维面试题【基础篇】
    前言本篇主要分享linux运维面试过程中常见的面试题材,当时自己面试的时候就遇到3道原题,最终也是顺利通过面试,下面给大家分享一下:面试题库1、描述Linux系统的启动过程电源BIOS自检读取MBR,运行grub加载内核内核启动/sbin/init程序,进行系统初始化根据系统运行级别执行......
  • 差生打基础之for循环篇
    今天我今天我来复习(打基础)的篇目是for循环。for循环通常用于以下情景:1.数组、集合遍历;2.重复执行特定次数;3.数值累加或累乘;4.探索和过滤;5.初始化和赋值;6.图形和UI开发;7.字符串处理;8.算法实现;9.游戏开发;10.数学计算;11.模拟和仿真。/*题目要求:输入一个整数n,求从1加到n的和*/#......
  • LeetCode100之两数相加(2)--Java
    1.问题描述        给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。     ......
  • Java 21和Java 8在洛谷上的区别
    Java21默认开大内存很容易遇到所以如果换成Java8最后一个我也不知道为啥,有大佬帮忙看一下吗逆序对-洛谷importjava.util.*;publicclassMain{  staticScannercin=newScanner(System.in);  //非递归版本的归并排序,返回逆序对的数量  publics......
  • docker基础:搭建centos7(详见B站泷羽sec)
    docker的简单学习:sudoapt-getupdate                //这个命令让系统检查有没有新软件sudoapt-getinstalldocker.io       //安装Dockersudodockerversion                        //查看是否安装成功,显示dock......
  • JavaFX史上最全教程 - Shape - JavaFX路径
    JavaFX有其他内置的形状,如ArcCircleCubicCurveEllipseLinePathPolygonPolylineQuadCurveRectangleSVGPathText以下代码显示了如何创建路径。importjavafx.application.Application;importjavafx.geometry.Insets;importjavafx.scene.Group;importjavafx.scene.Scene;......