Java内部类,常用API

本文详细介绍了Java中的内部类,包括静态内部类、成员内部类、局部内部类和匿名内部类,并探讨了它们的特点和使用场景。此外,还讲解了常用的API,如Object类的toString和equals方法,Objects工具类以及StringBuilder类的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 内部类,常用api

一.内部类

1.内部类概述

  • 内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。

public class People{
// *内部类
* public class Heart{}
}

内部类的使用场景

场景:当一个事物的内部,还有一个部分需要一个完整的结构进行描述时。

基本作用

  • 内部类通常可以方便访问外部类的成员,包括私有的成员。

  • 内部类提供了更好的封装性,内部类本身就可以用private ,protectecd等修饰,封装性可以做更多控制。

2.内部类:静态内部类

有static修饰,属于外部类本身。

它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已。

public class Outer{

​ // 静态成员内部类
​ public static class Inner{}
}

静态内部类创建对象的格式:

格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造器;
范例:Outer.Inner in = new Outer.Inner();

3.内部类:成员内部类

无static修饰,属于外部类的对象。

JDK16之前,成员内部类中不能定义静态成员,JDK 16开始也可以定义静态成员了。

public class Outer {
// *成员内部类
* public class Inner {}
}

成员内部类创建对象的格式:

格式:外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();
范例:Outer.Inner in = new Outer().new Inner();

4.内部类:局部内部类

局部内部类放在方法、代码块、构造器等执行体中。

局部内部类的类文件名为: 外部类$N内部类.class。

5.内部类:匿名内部类概述★

匿名内部类:

本质上是一个没有名字的局部内部类。

作用:方便创建子类对象,最终目的是为了简化代码编写。

格式:

new 类|抽象类名|或者接口名() {
重写方法;
};

Employee a = new Employee() {public void work() {}};
a. work();

特点总结:

  • 匿名内部类是一个没有名字的内部类,同时也代表一个对象。

  • 匿名内部类产生的对象类型,相当于是当前new的那个的类型的子类类型。

public class Test {
    public static void main(String[] args) {
        Animal a = new Animal(){
            @Override
            public void run() {
                System.out.println("老虎会吃人~~~");
            }
        };
        a.run();
    }
}
//    class Tiger extends Animal{
//        @Override
//        public void run() {
//            System.out.println("老虎会吃人~~~");
//        }
//    }
 abstract class Animal{
        public abstract void run();
}

6.匿名内部类常见使用形式

/**
 掌握匿名内部类的使用形式(语法)
 */
public class Test2 {
    public static void main(String[] args) {
        Swimming s = new Swimming() {
            @Override
            public void swim() {
                System.out.println("学生开始游泳~~~");
            }
        };
        go(s);
        System.out.println("-----------------------");

        go(new Swimming() {
            @Override
            public void swim() {
                System.out.println("老师开始游泳~~~");
            }
        });
    }

    public static void go(Swimming s){
        System.out.println("开始~~");
        s.swim();
        System.out.println("结束~~");
    }
}

interface Swimming{
    void swim();
}

匿名内部类可以作为一个对象,直接传输给方法。

/**
 通过GUI编程 理解匿名内部类的真实使用场景
 */
public class Test3 {
    public static void main(String[] args) {
        //1.创建接口
        JFrame win = new JFrame("登陆界面");
        JPanel panel = new JPanel();
        win.add(panel);

        //2.创建一个按钮对象
        JButton btn = new JButton("登陆");

        //匿名内部类的使用
        /*btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(win,"点一下吧~");
            }
        });*/

        //最终简化形式
        btn.addActionListener( e -> JOptionPane.showMessageDialog(win,"别点了~"));

        //3.把按钮对象添加到窗口上显示
        panel.add(btn);

        //4.展示窗口
        win.setSize(400,300);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
}

匿名内部类通常是在开发中调用别人的方法时,别人需要我们写的时候才会定义出来使用。

匿名内部类还可以实现进一步的简化代码

二.常用API

1.API概述

  • API(Application Programming interface) 应用程序编程接口。

  • 简单来说:就是Java帮我们已经写好的一些方法,我们直接拿过来用就可以了

2.Object类:toString方法

Object类的作用:

  • 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。

  • Object作为所有类的父类,提供了很多常用的方法给每个子类对象拿来使用。

Object类的常用方法:

方法名说明
public String toString()默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址
public boolean equals(Object o)默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false

Object的toString方法:

方法名说明
public String toString()默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址

toString存在的意义

父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息

public class Student {
    private String name;
    private char sex;
    private int age;

    public Student() {}

    public Student(String name, char sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public char getSex() {return sex;}

    public void setSex(char sex) {this.sex = sex;}

    public int getAge() {return age;}

    public void setAge(int age) {this.age = age;}

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                '}';
    }
}
public class Test {
    public static void main(String[] args) {
        Student s = new Student("张飞",'男',22);
        System.out.println(s);
    }
}

3.Object类:equals方法

Object的equals方法:

方法名说明
public boolean equals(Object o)默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false

equals存在的意义:

  • 为了被子类重写,以便子类自己来定制比较规则(比如比较对象内容)。
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return sex == student.sex && age == student.age && Objects.equals(name, student.name);
}
Student s1 = new Student("张飞",'男',22);
Student s2 = new Student("张飞",'男',22);
Student s3 = new Student("张飞",'男',23);
System.out.println(s1);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));

4.Objects

Objects是一个工具类,提供了一些方法去完成一些功能。

官方在进行字符串比较时,没有用字符串对象的的equals方法,而是选择了Objects的equals方法来比较。

使用Objects的equals方法在进行对象的比较会更安全。

Objects的常见方法:

方法名说明
public static boolean equals(Object a, Object b)比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常。再进行equals比较
public static boolean isNull(Object obj)判断变量是否为null ,为null返回true ,反之

对象进行内容比较的时候建议使用Objects提供的equals方法,比较的结果是一样的,但是更安全。

5.StringBuilder

StringBuilder概述:

  • StringBuilder是一个可变的字符串的操作类,我们可以把它看成是一个对象容器。

  • 使用StringBuilder的核心作用:操作字符串的性能比String要更高(如拼接、修改等)。

StringBuilder 构造器

名称说明
public StringBuilder()创建一个空白的可变的字符串对象,不包含任何内容
public StringBuilder(String str)创建一个指定字符串内容的可变字符串对象

StringBuilder常用方法

方法名称说明
public StringBuilder append(任意类型)添加数据并返回StringBuilder对象本身
public StringBuilder reverse()将对象的内容反转
public int length()返回对象内容长度
public String toString()通过toString()就可以实现把StringBuilder转换为String

StringBuilder:内容是可变的、拼接字符串性能好、代码优雅。

String :内容是不可变的、拼接字符串性能差。

注意事项:

  • 定义字符串使用String

  • 拼接、修改等操作字符串使用StringBuilder

案例:

//打印整型数组内容
//        需求:
//        设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:
//        “该数组内容为:[11, 22, 33, 44, 55]”
//        分析:
//        1、定义一个方法,要求该方法能够接收数组,并输出数组内容。 ---> 需要参数吗?需要返回值类型申明吗?
//        2、定义一个静态初始化的数组,调用该方法,并传入该数组。
public class Test {
    public static void main(String[] args) {
        int [] arr = null;
        int [] arr1 = {11,22,33};
        int [] arr2 = {};
        System.out.println(toString(arr));
        System.out.println(toString(arr1));
        System.out.println(toString(arr2));
    }
//1.定义方法接受任意整型数组,返回数组内容格式
    public static String toString(int[] arr){
        if (arr != null){
            //2.开始拼接
            StringBuilder sb = new StringBuilder("[");
            for (int i = 0; i < arr.length; i++) {
                sb.append(arr[i]).append(i == arr.length - 1 ? "" : ",");
            }
            sb.append("]");
            return sb.toString();
        }else {
            return null;
        }
    }
}

6.math

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值