1w+ 字总结 Java 常用类,整理太全了,建议收藏..(1)

简介: 1w+ 字总结 Java 常用类,整理太全了,建议收藏..(1)

内部类


「概念」 :在一个类内部再定义一个完整的类。


一般情况下类与类之间是相互独立的,内部类的意思就是打破这种独立思想,让一个类成为另一个类的内部信息,和成员变量、成员方法同等级别。


「内部类的好处:」


把一个类写在外面和写在里面最终达到的结果都一样,那我们为什么还要使用内部类,岂不是多此一举吗?


「采用内部类这种技术,可以隐藏细节和内部结构,封装性更好,让程序的结构更加合理!如果类很多且都暴露在外面,那么类与类之间的调用就会十分繁琐!」


内部类的分类:


1.成员内部类(非静态内部类)


参考代码如下:


package NeiBuLei;
public class OuterClass {
    //成员变量
    private String OuterName;
    //成员方法
    public void display(){
        System.out.println("这是外部类方法!");
        System.out.println(OuterName);
    }
    //内部类
    public class InnerClass{
        //成员变量
        private String InnerNme;
        //构造方法
        public InnerClass() {
            InnerNme = "Inner Class";
        }
        //成员方法
        public void display(){
            System.out.println("这是内部类方法!");
            System.out.println(InnerNme);
        }
    }
    // 主方法
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.display();//这是外部类方法!null
        // 这个类是内部类,已经不是独立的类了,因此不能像外部类一样直接创建!
        //InnerClass innerClass = new InnerClass(); 行不通
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();// 同成员方法/变量 只是加了个前缀
        innerClass.display();// 这是内部类方法!
    }
}


输出结果:


这是外部类方法!null 这是内部类方法!Inner Class


「总结:成员内部类(非静态内部类)的使用就是将内部类作为外部类的的一个成员变量/成员方法来使用,所以必须依赖于外部类的对象才能调用,用法和成员变量/成员方法一致!」


2.局部内部类


局部内部类:基本的内部类还可以在一个方法体中定义。


package NeiBuLei;
public class OuterClass {
    //成员变量
    private String OuterName;
    //成员方法
    public void display(){
        class InnerClass {
            public void print(){
                System.out.println("这是一个局部内部类方法!");
            }
        }
        InnerClass innerClass = new InnerClass();
        innerClass.print();
    }
    // 主方法
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.display();
    }
}


静态内部类


静态内部类的构造不需要依赖于外部类对象,类中的静态组件都不需要依赖于任何对象,可以直接通过「类本身」 进行构造。


package NeiBuLei;
public class OuterClass {
    //成员变量
    private String OuterName;
    //成员方法
    public void display(){
        System.out.println("这是外部类方法!");
        System.out.println(OuterName);
    }
    //静态内部类
    public static class InnerClass{
        private String InnerName;
        public InnerClass() {
            InnerName = "Inner Class";
        }
        //成员方法
        public void display(){
            System.out.println("这是静态内部类方法!");
            System.out.println(InnerName);
        }
    }
    // 主方法
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.display();
        // 静态内部类的构造不依赖与外部类,可以直接通过类本身进行构造!
        InnerClass innerClass = new InnerClass();
        innerClass.display();
    }
}


输出结果:


这是外部类方法!null 这是静态内部类方法!Inner Class


4.匿名内部类


匿名内部类:没有名字的内部类。


匿名内部类「主要应用与接口的实现!」


接口:


package NeiBuLei;
public interface MyInterface {
    public void test();
}


实现类:


package NeiBuLei;
public class MyImplement implements MyInterface{
    @Override
    public void test() {
        System.out.println("test");
    }
}


匿名内部类的使用:


package NeiBuLei;
public class MyImplement implements MyInterface{
    @Override
    public void test() {
        System.out.println("test");
    }
}


「匿名内部类的好处:」


我们定义接口之后,「它的实现类不需要去单独创建一个文件去写它的实现」 ,我们可以把这个实现类的操作写到我们调用的地方就可以了!写起来更加简洁、方便。


「匿名内部类的缺点:」


耦合度太高了!


Object类


匿名内部类的缺点


Object类常用方法:


1.equals方法

「==与equals的对比【面试题】+ jdk查看原码」


==是一个比较运算符


==:既可以判断基本类型,又可以判断引用类型

==:如果判断的是「基本类型」 ,「判断的是值是否相等」 。


//==: 如果判断的是基本类型,判断的是 值 是否相等
int x1 = 10;
int x2 = 10;
double x3 = 10.0;
System.out.println(x1 == x2);//true
System.out.println(x1 == x3);//true


==:如果判断的是「引用类型」 ,「判断的是地址是否相等,即判断是不是同一个对象」


package Equals;
public class Test01 {
    public static void main(String[] args) {
        //==: 如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一个对象
        A a = new A();
        A b = a;
        A c = b;
        System.out.println(a==c);// ? true
        System.out.println(b==c);// true
        B obj = a;
        System.out.println(obj==c);// true
    }
}
class B{}
class A extends B{}



equals方法是Object类中的方法,「只能判断引用类型」 。


idea查看Jdk原码:鼠标光标放在要查看的方法上,直接输入ctrl + b
查看某个类所有方法:ctrl + F12


默认判断的是地址是否相等,「子类(Object类是所有类的父类)往往重写该方法,用于判断内容是否相等」 。


/*
Object类 equals()方法原码
//默认判断地址是否一样
    public boolean equals(Object obj) {
        return (this == obj);
    }


子类往往重写该方法,用于判断内容是否相等  String类中的equals()方法原码(重写了父类equals()方法)


public boolean equals(Object anObject) {
        if (this == anObject) { // 如果是同一个对象(地址相同)
            return true; // 返回true
        }
        if (anObject instanceof String) { // 判断类型
            String anotherString = (String)anObject; // 向下转型
            int n = value.length;
            if (n == anotherString.value.length) { // 如果长度相同
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) { // 比较每一个字符
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true; // 如果两个字符串每一个字符都相同,则返回true
            }
        }
        return false;
    }
 */


在看个例子


image.png


【小练习】


写出输出结果:


package Equals;
public class EqualsTest01 {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "tom";
        Person p2 = new Person();
        p2.name = "tom";
        System.out.println(p1 == p2);// 引用类型——判断是否为同一个对象(地址)
        System.out.println(p1.name.equals(p2.name));// p.name是String类型,重写了equals()方法——判断内容是否一样
        System.out.println(p1.equals(p2));//p1,p2属于Person类,该类并没有重写equals()方法(继承父类equals()方法,即判断地址)
        String s1 = new String("abc");
        String s2 = new String("abc");
        System.out.println(s1.equals(s2));
        System.out.println(s1 == s2);
    }
}
class Person{
    public String name;
}


输出结果:


false true false true false


2.hashCode方法


1.png


小结:(可以当作地址来看但它本质上不是地址)


提高具有哈希结构的容器的效率

两个引用,如果指向的是同一个对象,则哈希值肯定一样

两个引用,如果指向的是不同对象,则哈希值是不一样的

哈希值主要根据地址号来!不能将哈希值完全等价于地址

在后面的集合中hashCode如果需要的话,也会重写


package hashCode;
public class HashCode {
    public static void main(String[] args) {
        AA aa = new AA();
        AA aa2 = new AA();
        AA aa3 = aa;
        System.out.println("aa.hashCode()="+ aa.hashCode());
        System.out.println("aa2.hashCode()="+ aa2.hashCode());
        System.out.println("aa3.hashCode()="+ aa3.hashCode());
    }
}
class AA{}


输出结果:


aa.hashCode()=460141958 aa2.hashCode()=1163157884 aa3.hashCode()=460141958


3.toString方法


toString方法


5.png


基本介绍:


默认返回:全类名 + @ + 哈希值的十六进制


/*
    Object toString()原码
    //(1)getClass().getName() 类的全类名(包名+类名)
    //(2)Integer.toHexString(hashCode()) 将hashCode的值转成16进制字符串
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
 */


6png.png


「子类往往重写toString方法,用于返回对象的属性信息(快捷键:alt + insert),当然我们也可以自己定制。」


5.png


当我们输出一个对象时,toString()方法会被默认调用


4.png


4.finzlize方法


2.png


finzlize方法:当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。


当对象被回收时,系统自动调用该对象的finzlize方法。子类可以重写该方法,做一些释放资源的操作


什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会时候垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finzlize方法。


1.png


垃圾回收机制的调用,是由系统来决定(即有自己的GC算法),也可以通过System.gc()主动触发垃圾回收机制。


注:在实际开发中,几乎不会用finzlize方法,更多的是为了应付面试


相关文章
|
5月前
|
Java 编译器 API
Java 密封类:精细化控制继承关系
Java 密封类:精细化控制继承关系
380 83
|
3月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
264 101
|
3月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
300 100
|
6月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
251 36
|
4月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
444 143
|
2月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
115 4
|
2月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
206 5
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
196 1
|
2月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
247 1
|
2月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
199 1