内部类和Object类

内部类

内部类的分类:实例内部类、静态内部类局部内部类匿名内部类

1.1实例内部类

java 复制代码
//外部类
public class OutClass1 {
    public int date;
    //实例内部类
    class Innerclass{
        public int ger;
        public void test(){
            System.out.println("test方法被执行了");
        }
    }
    public void func(){
        System.out.println("func方法被执行了");
    }
}

问:(1)如何实例化实例内部类对象

java 复制代码
 OutClass1 outClass1=new OutClass1();
    OutClass1.Innerclass innerclass=outClass1.new Innerclass();

需要外部类对象的引用

(2)实例内部类是可以访问外部类的成员属性的,但当实例内部类和外部类的成员属性同名时,实例内部类会优先访问自己的。那么,如何访问外部类的成员属性呢

通过外部类名称.this.同名成员在实例内部类方法里访问外部类的成员属性

注:

1.外部类中的任何成员都可以在实例内部类方法中直接访问

2.实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束

3.实例内部类对象必须在先有外部类对象的前提下才能创建

4.实例内部类的非静态方法中包含了一个指向外部类对象的引用

5.外部类中,不能直接访问实例内部类中的成员,如果要访问必须要先创建内部类的对象

1.2静态内部类

实例化静态内部类

java 复制代码
 OutClass1.Innerclass innerclass=new OutClass1.Innerclass();

**注:**1.静态内部类只能访问外部类当中的静态成员

1.3局部内部类

局部内部类一般在方法中,只能在方法当中使用,并且不能被public等修饰

java 复制代码
public class OuterClass2 {
    public int a;
    public void method(){
        class InnerClass{
            public int b=200;
            public void innerclassMethod(){
                System.out.println("内部类方法");
            }
        }
        InnerClass innerClass =new InnerClass();
        innerClass.innerclassMethod();
    }
}

1.4匿名内部类

匿名内部类通常用于创建只需要使用一次的类

java 复制代码
public class Test1 {
    public void test(){
        System.out.println("test方法执行了");
    }

    public static void main(String[] args) {
        //相当于继承了Test1类
        new Test1(){
            @Override
            public void test() {
                System.out.println("重写的test方法执行了");
            }
        }.test();
    }
}
java 复制代码
interface HA{
    void test();
}
public class Test2 {
    public static void main(String[] args) {
        //相当于有一个类实现了HA接口
        new HA(){
            public int a;

            @Override
            public void test() {
                System.out.println("重写了接口方法");
            }
        }.test();
    }
}

匿名内部类可以定义和正常类一样的变量但是和正常类一样不能直接包含执行语句

Object类

概述:Object类是Java默认提供的一个类,除了Object类之外其他所有的类都有继承关系

Object的方法:

1)toString方法

如果使用object提供的方法打印引用类型的就是"地址",重写Object提供的方法的话,就可以打印引用类型当中的内容,数据类型打印出来的都是它本身的值.

2)equals方法

在Java当中,如果基本数据类型变量,使用"=="比较变量的值是否相同.

如果引用类型变量,使用"=="比较就是他们的地址是否相同

那么,如果你想要比较对象当中的内容的值是否相同,就需要重写Object类当中的equals()方法.

问题来了,为什么要重写Object当中的这个方法呢?

da:因为Object类当中的equal方法就是比较的他们的地址所以要重写地址

java 复制代码
public boolean equals(Object obj) {
        return (this == obj);
    }

3)hasCode方法

说白了就是确定两个对象的属性在内存当中的存储位置是否在同一个位置当中

java 复制代码
package demo5;
import java.util.Objects;
class Student{
    public String name;
    public int a ;
    public Student(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", a=" + a +
                '}';
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return a == student.a && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, a);
    }
}
class Person{}
public class ObjectClass {
}
java 复制代码
package demo5;

public class Test6 {
    public static void main(String[] args) {
        Student student =new Student("张三");
        Student student2 =new Student("张三");
        Student student3 =new Student("张三");
        System.out.println(student.a);
        System.out.println(student);
        System.out.println(student2.equals(student3));
        System.out.println(student2.hashCode());
        System.out.println(student3.hashCode());
        System.out.println(student.hashCode());
    }
}
相关推荐
大头an3 小时前
Java项目打包完整指南:从JAR到Docker全方位解析
java
日月星辰Ace3 小时前
JDK 工具学习系列(二):jar 命令实用教程与常见问题
java
九转成圣3 小时前
JWT 全面解析与 Spring Boot 实战教程
java·spring boot·后端
青云交3 小时前
Java 大视界 -- Java 大数据机器学习模型在遥感图像土地利用分类中的优化与应用
java·机器学习·分布式计算·数据预处理·遥感图像·模型融合·土地利用分类
=>>漫反射=>>4 小时前
【Spring Boot Starter 设计思考:分离模式是否适用于所有场景】
java·spring boot·后端·设计规范·自动装配
Jack电子实验室4 小时前
深入理解C语言函数指针:从基础到实战应用
java·c语言·算法
小马哥编程4 小时前
【软考架构】案例分析-系统设计与建模:数据流图DFD与数据字典
java·数据库·架构·统一建模语言
sibylyue4 小时前
Spring编程式事务和声明式事务
java·数据库·mysql
伊布拉西莫4 小时前
spring-ai advisors 使用与源码分析
java·人工智能·spring