【Java】内部类Object类

目录

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.mfbz.cn/a/16728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring常用的事务传播行为

事务传播行为介绍 Spring中的7个事务传播行为: 事务行为 说明 PROPAGATION_REQUIRED 支持当前事务&#xff0c;假设当前没有事务。就新建一个事务 PROPAGATION_SUPPORTS 支持当前事务&#xff0c;假设当前没有事务&#xff0c;就以非事务方式运行 PROPAGATION_MANDATORY…

Java——线程池详细讲解

文章目录 一、线程池一、线程池基础1.1 什么是线程池1.2 为什么使用线程池1.3 线程池有哪些优势1.4 应用场景 二、线程池使用2.1 Java内置线程池 ThreadPoolExecutor2.1.1 线程池的七个参数2.1.1.1 **int corePoolSize 核心线程数量**2.1.1.2 int maximumPoolSize 最大线程数2.…

[OtterCTF 2018]之Misc篇(NSSCTF)刷题记录⑦

NSSCTF-Misc篇-[OtterCTF 2018] [OtterCTF 2018]General Info[OtterCTF 2018]Play Time[OtterCTF 2018]Silly Rick[OtterCTF 2018]What the password?[OtterCTF 2018]Name Game[OtterCTF 2018]Hide And Seek[OtterCTF 2018]Name Game 2[OtterCTF 2018]Path To Glory[OtterCTF …

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

该题对于模型的考察难度较低&#xff0c;难度在于数据的搜集以及选取与处理。 这里推荐数据查询的网站&#xff1a;中国碳核算数据库&#xff08;CEADs&#xff09; https://www.ceads.net.cn/ 国家数据 国家数据​data.stats.gov.cn/easyquery.htm?cnC01 以及各省市《统…

安陆EGS20 SDRAM仿真

目录 一. 搭建仿真平台 二. 实现SDRAM连续写入1024个数据&#xff0c;然后再连续读出&#xff0c;并比较 1. 调试过程中问题&#xff1a; 2. 顶层代码 3. 功能代码 三. SDRAMFIFO实现上述功能调试 1. 代码设计要点 2. 仿真过程问题 3. 上板运行调试 安陆反馈&#xf…

YOLOv6 4.0 使用记录: OpenCV DNN C++推理

目录 1、下载源码 2、下载权重文件 3、配置环境 4、推理 6、ONNX格式导出 权重文件为yolov6list_s.pt 权重为yolov6.pt 7、opencv DNN推理 8、个人总结 1、下载源码 下载最新的4.0版本的 2、下载权重文件 我下的是YOLOv6Lite-S 3、配置环境 cd到项目目录&#xff0c;运…

3.6 cache存储器

学习步骤&#xff1a; 我会采取以下几个步骤来学习Cache存储器&#xff1a; 确定学习目标&#xff1a;Cache存储器作为一种高速缓存存储器&#xff0c;通常用于提高计算机系统的运行效率。因此&#xff0c;我需要明确学习Cache存储器的目的&#xff0c;包括了解其原理、结构和…

一图看懂 requests 模块:用Python编写、供人类使用的HTTP库, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 requests 模块&#xff1a;用Python编写、供人类使用的HTTP库, 资料整理笔记&#xff08;大全&#xff09; 摘要模块图类关系图模块全展开【requests】统计常量str 模块3 w…

java数据结构之HashMap

目录 前言 1、初始化 1.1、初始化 1.2、插入第一条数据 2、数组 链表 2.1、插入数据&#xff1a;没有hash冲突 2.2、插入数据&#xff1a;Key不同&#xff0c;但产生hash冲突 2.3、插入数据&#xff1a;Key相同 3、数组 红黑树 3.1、链表如何转化为红黑树&#xff1f; 3.…

golang - switch

switch 的使用 switch 语句用于基于不同条件执行不同操作&#xff0c;&#xff0c;直每一个 case 分支都是唯一的&#xff0c;从上到下逐一测试到匹配为止匹配项后面也不需要再加 break switch 表达式 {case 表达式1, 表达式2, ... :语句块1case 表达式2, 表达式3, ... :语句块…

GPT:你知道这五年我怎么过的么?

时间轴 GPT 首先最初版的GPT&#xff0c;来源于论文Improving Language Understanding by Generative Pre-Training&#xff08;翻译过来就是&#xff1a;使用通用的预训练来提升语言的理解能力&#xff09;。GPT这个名字其实并没有在论文中提到过&#xff0c;后人将论文名最后…

【Unity3D小功能】Unity3D中实现轮船在水面上移动效果

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 标题是啥我写啥&#xff0c;大家好&#xff0c;今天给大家带来…

你的 Kubernetes 安全吗?最新benchmark的重要趋势解读

导语 疫情过后经济处在缓慢复苏的阶段&#xff0c;对于企业应该优先考虑数字化转型&#xff0c;因为它可以促进增长和创新。 不可避免地&#xff0c;当今的数字化转型计划依赖于云的可扩展性和灵活性。 虽然在云中启动应用程序和服务带来了许多机遇&#xff0c;但也带来了新的…

云原生Istio架构和组件介绍

目录 1 Istio 架构2 Istio组件介绍2.1 Pilot2.2 Mixer2.3 Citadel2.4 Galley2.5 Sidecar-injector2.6 Proxy(Envoy)2.7 Ingressgateway2.8 其他组件 1 Istio 架构 Istio的架构&#xff0c;分为控制平面和数据面平两部分。 - 数据平面&#xff1a;由一组智能代理&#xff08;[En…

HCIA-RS实验-路由配置-静态路由缺省路由(2)

接上文HCIA-RS实验-路由配置-静态路由&缺省路由 继续完成缺省路由&#xff1b;其他原截图就不再一一截图&#xff0c;有需要往回看一篇。 关闭上一篇的接口shutdown&#xff08;重新启动&#xff09; 上一篇在R2关闭的接口2 需要重新启动&#xff0c;输入 undo shutdown…

4月VR大数据:PICO平台应用近400款,领跑国内VR生态

Hello大家好&#xff0c;每月一期的VR内容/硬件大数据统计又和大家见面了。 想了解VR软硬件行情么&#xff1f;关注这里就对了。我们会统计Steam平台的用户及内容等数据&#xff0c;每月初准时为你推送&#xff0c;不要错过喔&#xff01; 本数据报告包含&#xff1a;Steam VR硬…

我们公司的面试,有点不一样!

我们公司的面试&#xff0c;有点不一样&#xff01; 朋友们周末愉快&#xff0c;我是鱼皮。因为我很屑&#xff0c;所以大家也可以叫我屑老板。 自从我发了自己创业的文章和视频后&#xff0c;收到了很多小伙伴们的祝福&#xff0c;真心非常感谢&#xff01; 不得不说&#…

Elasticsearch:人类语言到 Elasticsearch 查询 DSL

Elasticsearch 为开发者提供了强大的搜索功能。Elasticsearch 使用 DSL 来进行查询。对于很多从关系数据库过来的人&#xff0c;这个很显然不很适应。虽然我们可以使用 SQL 来进行查询&#xff0c;但是我们必须通过一些命令来进行转换。我们可以通过阅读文章&#xff1a; Elast…

【Java面试八股文】数据库篇

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式牛客面试题 目录 请你说说MySQL索引,以及它们的好处和坏处 请你说说MySQL的索引是什么结构,为什么不用哈希表 请你说说数据库索引的底…

Segmentation of retinal vessels based on MRANet

随手把一篇论文的创新部分抽取出来 MLF 为了更好地聚合每一层的上采样特征信息和MSR块的信息&#xff0c;在解码路径中使用了MLF块&#xff0c;这允许最大限度地重用功能&#xff0c;从而减少细节的损失。MLF块的结构如图2所示。 如图2所示&#xff0c;有两种输入:input1和inp…