【Java】内部类Object类

news2025/2/22 0:06:09

目录

1.内部类

1.1实例内部类

1.2静态内部类

1.3局部内部类

1.4匿名内部类 

2.Object类 

2.1getClass方法 

2.2equals方法

2.3hashcode方法


1.内部类

定义:一个类定义在另一个类或一个方法的内部,前者称为内部类,后者称为外部类。

分类:实例内部类,静态内部类,局部内部类,匿名内部类。

1.1实例内部类

注意:1> 外部类中的任何成员都可以在实力内部类中直接访问(private也可以);

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

3> 访问成员时优先内部类,要想访问外部类同名的成员,必须通过外部类类名.this.同名成员来访问;

4> 实力内部类对象必须在先有外部类对象的前提下创建(这也是其缺点之一);

5> 外部类若想访问内部类的成员必须创建内部类对象。

class OuterClass {
    public int data1 = 1;
    private int data2 = 2;
    private static int data3 = 3;
    //实例内部类:类里面,方法外面
    class InnerClass {
        public int data1 = 10;
        public int data4 = 4;
        private int data5 = 5;
        //public static int data6 = 6;//实力内部类中不能定义静态变量
                                      //原因:此变量不依赖对象,但是InnerClass类依赖对象
        public static final int data7 = 7;//加上final即可,此时该变量为常量,在编译时就已确定
        public void testInner() {
            System.out.println("testInner");
            System.out.println(data1);//优先访问内部类成员
            System.out.println(OuterClass.this.data1);//利用外部类名和this访问外部类成员
            System.out.println(data5);                //说明实例内部类存在外部类的this
        }
    }
    public void testOut() {
        //外部类若想访问内部类的成员必须创建内部类对象
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.data5);//5
    }
}
public class Main {
    public static void main(String[] args) {
        //实例化实例内部类对象
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        OuterClass.InnerClass innerClas2 = new OuterClass().new InnerClass();//将上面两行代码合二为一
        innerClas2.testInner();
    }

}

1.2静态内部类

注意:1> 创建内部类对象时不需要先创建外部类对象;

2> 在静态内部类中只能访问外部类中的静态成员。

class OuterClass {
    public int data1 = 1;
    private int data2 = 2;
    private static int data3 = 3;
    //静态内部类
    static class InnerClass {
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;//可定义静态成员变量
        public void testInner() {
            System.out.println("testInner");
            System.out.println(data3);//可以访问外部类的静态成员
            //System.out.println(data1);//无法访问外部类非静态成员
            //System.out.println(OuterClass.this.data2);//使用外部类名.this也不可以
            //解决方法:new一个外部类对象
            OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.data1);
            System.out.println(outerClass.data2);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        //实例化静态内部类
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();//不需要创建外部类对象,注意和实例内部类的区别
        innerClass.testInner();
    }
}

1.3局部内部类

注意:1> 只能在所定义的方法体内部使用;

2> 不能被public、static等修饰符修饰;

class OuterClass {
    public void test() {
        //局部内部类:方法里面
        class InnerClass {
            public int data1 = 1;
        }
        //只能在所定义的方法体内部使用
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.data1);
    }
}

1.4匿名内部类 

语法奇奇怪怪QAQ……但是之后会很常用,只能死记啦 o.O 

class Student implements Comparable<Student> {
    @Override
    public int compareTo(Student o) {
        return 0;
    }
}
interface Shape {
    void draw();
}
public class Test {
    public static void main(String[] args) {
        Comparable<Student> comparable = new Student();
        //匿名内部类:相当于这里有一个类实现了Comparable接口并重写了compareTo方法
        new Comparable<Student>() {
            @Override
            public int compareTo(Student o) {
                return 0;
            }
        }; //注意这里的分号
        int a = 10;
        new Shape() {
            @Override
            public void draw() {
                //a = 20;//在匿名内部类中,访问的变量不能改变
                System.out.println(a);
            }
        }.draw(); //调用draw方法
    }
}

2.Object类 

定义:Object是Java默认提供的一个类,是参数的最高同一类型。除了Object类,所有的类都是存在继承关系的。默认所有类继承Object父类。

疑问:之前我们学过,一个类只能继承一个类,这里的意思是只能同时继承一个类。

例如:Dog类继承Animal类,而Animal类又默认继承Object类,所以Dog类间接继承了Object类,没有违背一个类只能继承一个类这一说明。

//使用Object类接收所有类的对象

class Student {
    public int age;
    public Student(int age) {
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Object object1 = new Student(1);//Object可接收所有类的对象
    }
}

 

2.1getClass方法 

public class Test {
    public static void main(String[] args) {
        Student student = new Student(10);
        Class<?> c = student.getClass();//Class<?> 这里涉及到了泛型,在之后的数据结构中会讲解
        System.out.println(c);//class Demo2.Student —— 在Demo2包下的Student类中
    }
}

2.2equals方法

进入Object的equals方法后,我们发现代码仍是使用地址比较,所以若想比较数据大小,必须要重写equals方法:

import java.util.Objects;
class Student {
    public int age;
    public Student(int age) {
        this.age = age;
    }
    @Override //根据自身需求重写equals方法
    public boolean equals(Object obj) {
        Student student = (Student) obj;
        return age == student.age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student student1 = new Student(10);
        Student student2 = new Student(10);
        System.out.println(student1==student2);//比较地址,false
        //System.out.println(student1.equals(student2));//父类Object中的equals仍是比较地址,false
        System.out.println(student1.equals(student2));//重写equals后比较年龄大小,true
    }
}

2.3hashcode方法

定义:此方法帮我们算了一个具体的对象位置,用来确定对象在内存中存储的位置是否相同。一般在散列表中才有用,其他情况下无用。

import java.util.Objects;

class Student {
    public int age;
    public Student(int age) {
        this.age = age;
    }
    @Override //使用Generate生成
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age;
    }
    @Override //使用Generate生成
    public int hashCode() {
        return Objects.hash(age);
    }
}
public class Test {
    public static void main(String[] args) {
        Student student1 = new Student(10);
        Student student2 = new Student(10);//没重写hashCode:不一样
        //System.out.println(student1.hashCode());//460141958
        //System.out.println(student2.hashCode());//1163157884
                                                //重写hashCode后:一样
        System.out.println(student1.hashCode());//41
        System.out.println(student2.hashCode());//41

    }
}

狂补ing……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JWT渗透与防御

JWT渗透与防御 什么是JWTJWT漏洞介绍工具使用 身份认证(Authentication)又称鉴权&#xff0c;是指通过一定的手段&#xff0c;完成对用户身份的确认。认证的方式&#xff1a;sessioncookie、JWT、Token session认证的局限性 session认证机制需要配合cookie才能实现。由于cookie…

238页9万字大数据治理与服务平台建设及数据服务实施方案(word)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 1 项目解决方案 1.1 建设类业务技术方案 1.1.1 业务需求分析 根据对招标要求的理解&#xff0c;建设业务需求主要包括如下几个方面&#xff1a; &#xff08;1&#xff…

网站遭遇XSS注入如何排查及解决

首先要明白什么是XSS注入 存储型 XSS 的攻击步骤&#xff1a; 攻击者将恶意代码提交到目标网站的数据库中。用户打开目标网站时&#xff0c;网站服务端将恶意代码从数据库取出&#xff0c;拼接在 HTML 中返回给浏览器。用户浏览器接收到响应后解析执行&#xff0c;混在其中的…

Docker部署spring boot项目

在docker部署时首先要保证一般部署能够访问。 docker命令部署spring boot项目 目前主流的java框架为spring&#xff0c;软件包为jar包&#xff0c;只需以jar为基础构建容器环境。打包为jar后只需要jvm就可以运行&#xff0c;因此需要以jdk为镜像构建容器。 基于命令构建jdk环…

MySQL面试八股文:索引篇

索引的定义 索引是数据库中用来加速数据查询的一种数据结构。它可以将数据表中的某一列或多列进行排序&#xff0c;以便快速查找数据&#xff0c;减少数据库的扫描次数&#xff0c;提高查询速度。 索引的优缺点 索引的优点是可以大幅度提高数据查询的速度&#xff0c;尤其是…

( 数组和矩阵) 565. 数组嵌套 ——【Leetcode每日一题】

❓565. 数组嵌套 难度&#xff1a;中等 索引从 0 开始长度为N的数组 A&#xff0c;包含 0 到 N - 1 的所有整数。找到最大的集合 S并返回其大小&#xff0c;其中 S[i] {A[i], A[A[i]], A[A[A[i]]], ... } 且遵守以下的规则。 假设选择索引为 i 的元素 A[i] 为 S 的第一个元…

【Java|golang】1003. 检查替换后的词是否有效

给你一个字符串 s &#xff0c;请你判断它是否 有效 。 字符串 s 有效 需要满足&#xff1a;假设开始有一个空字符串 t “” &#xff0c;你可以执行 任意次 下述操作将 t 转换为 s &#xff1a; 将字符串 “abc” 插入到 t 中的任意位置。形式上&#xff0c;t 变为 tleft “…

【软考高项笔记】第1章 信息化发展1.3 现代化创新发展

1.3 现代化创新发展 1.3.1 农业农村现代化 采棉机&#xff0c;传感器检查温度湿度 乡村振兴战略 建设基础设施 发展智慧农业 建设数据乡村1.3.2 两化融合与智能制造&#xff08;工业&#xff09; 信息化 工业化 发展战略 坚持自主可控&#xff0c;安全高效&#xff0c;推进产业…

VESC操作入门——双轮毂电机控制和CAN通信

目录 一、VESC驱动轮毂电机1.1、硬件准备1.2、硬件接线1.3、校准电机1.4、主操作界面 二、CAN通信2.1、硬件连接2.2、代码说明2.3、发送指令 三、双轮毂电机3.1、校准第二个电机参数3.2、硬件连接3.3、CAN总线发送指令 四、把VESC做为USB转CAN模块 ODrive、VESC和SimpleFOC 教程…

【星戈瑞】Sulfo-Cyanine5 mal 磺酸跟水溶性生物标记试剂

水溶性Sulfo-Cyanine5 mal是一种用于生物标记和荧光成像的荧光染料。它的化学名称是Cyanine5 maleimide&#xff0c;分子式为C29H27ClN2O4S&#xff0c;分子量为576.05。Cyanine5 mal属于Cyanine染料家族&#xff0c;具有强烈的吸收和发射光谱&#xff0c;适用于生物分子的标记…

( 数组和矩阵) 769. 最多能完成排序的块 ——【Leetcode每日一题】

❓769. 最多能完成排序的块 难度&#xff1a;中等 给定一个长度为 n 的整数数组 arr &#xff0c;它表示在 [0, n - 1] 范围内的整数的排列。 我们将 arr 分割成若干 块 (即分区)&#xff0c;并对每个块单独排序。将它们连接起来后&#xff0c;使得连接的结果和按升序排序后…

云服务器vCPU和CPU有什么区别?

云服务器的vCPU和物理服务器的CPU有什么区别&#xff1f;阿里云百科以阿里云服务器ECS为例&#xff0c; 阿里云服务器vCPU和CPU是什么意思&#xff1f;CPU和vCPU有什么区别&#xff1f;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;CPU是中央处理…

推荐算法实战项目:FNN 原理以及案例实战(附完整 Python 代码)

本文要介绍的是FNN模型&#xff0c;出自于张伟楠老师于2016年发表的论文《Deep Learning over Multi-field Categorical Data》。 论文提出了两种深度学习模型&#xff0c;分别叫做FNN&#xff08;Factorisation Machine supported Neural Network&#xff09;和SNN&#xff0…

如何利用 Kotlin 特性封装 DataStore

Jetpack DataStore是一种数据存储解决方案&#xff0c;由于使用了 Kotlin 协程或者 RxJava 以异步、一致的事务方式存储数据&#xff0c;用法相较于其它存储方案 (SharedPreferences、MMKV) 会更加特别&#xff0c;所以目前网上都没有什么比较好的 DataStore 封装。 个人了解了…

(十)Shapefile文件创建——创建Shapefile和dBASE

&#xff08;十&#xff09; Shapefile文件创建——创建Shapefile和dBASE ArcCatalog 可以创建新的 Shapefile 和 dBASE表&#xff0c;并可进行属性项及索引的操作定义 Shapefile 的坐标系统。当在目录中改变 Shapefile 的结构和特性 (Properties)时必须使用 ArcMap 来更新或重…

动态规划 --- 01背包

动态规划 — 01背包 一直到现在都非常害怕动态规划&#xff0c;因为基本上自己都无法想出dp递推式&#xff0c;太难受了 T.T 今天再一次遇到了需要写01背包的情况&#xff0c;根据自己学习的一点点经历&#xff0c;再稍微总结一下01背包吧&#xff0c;虽然是个被认为dp入门的…

自学Python必须知道的优秀社区

国内学习Python网站&#xff1a; 知乎学习平台&#xff1a;Python - 基础入门 - 知学堂黑马程序员视频库&#xff1a;大数据学习路线2023版-黑马程序员大数据学习路线图菜鸟教程&#xff1a;菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01;极客学院&#xff1a;极…

香港服务器租用攻略:如何优化用户体验?

服务器是网站、应用程序和其他在线内容的核心&#xff0c;对于在线业务来说是至关重要的。如今&#xff0c;随着互联网的普及和数字化转型&#xff0c;越来越多的企业选择在香港租用服务器&#xff0c;以满足其业务需求。但是&#xff0c;租用服务器并不仅仅是选择一个服务商并…

让chatGPT给我写一个CSS,我太蠢了

前言 CSS这东西&#xff0c;让AI写的确有点难度&#xff0c;毕竟它写出来的东西&#xff0c;没办法直接预览&#xff0c;这是其次。重要的是CSS这东西怎么描述&#xff0c;不好描述啊&#xff0c;比如我让他给我制作一个这样的效果出来&#xff0c;没办法描述&#xff0c;所以…

AcWIng1085. 不要62(数位DP)

文章目录 一、问题二、分析三、代码 一、问题 二、分析 这道题涉及的算法是数位DP。如果大家不懂数位DP的话&#xff0c;可以先去看作者之前的文章&#xff1a;第五十章 动态规划——数位DP模型 假设一个数 n n n&#xff0c;我们先求出从 1 1 1到 n n n当中&#xff0c;所有…