- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章了解java中对象基础Object类由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面.
所以在Java中有一句常说的话,一切皆对象,这话并不离谱.
结论验证 。
既然Object作为所有类的父级别的类,则不需要在显式的添加继承关系,Each01编译期就会提示移除冗余.
1
2
3
4
5
6
7
|
public
class
Each01
extends
Object {
public
static
void
main(String[] args) {
System.out.println(
new
Each01().hashCode()+
";"
+
new
ObjEa02().hashCode());
}
}
class
ObjEa02 {}
class
ObjEa03
extends
ObjEa02{}
|
这里Each01与ObjEa02对象实例都有Object类中的hashCode方法,这里对既有结论的验证.
编译文件 。
再从JVM编译层面看下字节码文件,是如何加载,使用javap -c命令查看编译后的文件,注意Jdk版本1.8; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
javap -c Each01.
class
Compiled from
"Each01.java"
public
class
com.base.object.each.Each01 {
public
com.base.object.each.Each01();
Code:
0
: aload_0
1
: invokespecial #
1
// Method java/lang/Object."<init>":()V
4
:
return
}
javap -c ObjEa02.
class
Compiled from
"Each01.java"
class
com.base.object.each.ObjEa02 {
com.base.object.each.ObjEa02();
Code:
0
: aload_0
1
: invokespecial #
1
// Method java/lang/Object."<init>":()V
4
:
return
}
javap -c ObjEa03.
class
Compiled from
"Each01.java"
class
com.base.object.each.ObjEa03
extends
com.base.object.each.ObjEa02 {
com.base.object.each.ObjEa03();
Code:
0
: aload_0
1
: invokespecial #
1
// Method com/base/object/each/ObjEa02."<init>":()V
4
:
return
}
|
invokespecial命令:可以查看Jvm的官方文档中的指令说明,调用实例化方法,和父类的初始化方法调用等,这里通过三个类的层级关系,再次说明Object超类不需要显式继承,即使显式声明但编译后源码依旧会清除冗余.
通常把下面过程称为:创建一个object对象; 。
1
|
Object object =
new
Object() ;
|
细节描述:声明对象引用object;通过new关键字创建对象并基于默认构造方法初始化;将对象引用object指向创建的对象.
这一点可以基于Jvm运行流程去理解,所以当对象一旦失去全部引用时,会被标记为垃圾对象,在垃圾收集器运行时清理.
接受任意数据类型对象的引用 。
既然Object作为Java中所有对象的超类,则根据继承关系的特点,以及向上转型机制,Object可以接受任意数据类型对象的引用,例如在集合容器或者传参过程,不确定对象类型时可以使用Object:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
class
Each02 {
public
static
void
main(String[] args) {
// 向上转型
Object obj01 =
new
Each02Obj01(
"java"
) ;
System.out.println(obj01);
// 向下转型
Each02Obj01 each02Obj01 = (Each02Obj01)obj01;
System.out.println(
"name="
+each02Obj01.getName());
}
}
class
Each02Obj01 {
private
String name ;
public
Each02Obj01(String name) {
this
.name = name; }
@Override
public
String toString() {
return
"Each02Obj01{"
+
"name='"
+ name +'}';
}
public
String getName() {
return
name; }
}
|
这里要强调一下这个向上转型的过程:
Object obj01 = new Each02Obj01("java") ; 通过上面流程分析,这里创建一个父类引用obj01,并指向子类Each02Obj01对象,所以在输出的时候,调用的是子类的toString方法.
在程序运行时获取对象的实例类,进而可以获取详细的结构信息并进行操作:
1
|
public
final
native
Class<?> getClass();
|
该方法在泛型,反射,动态代理等机制中有很多场景应用.
返回对象的字符串描述形式,Object提供的是类名与无符号十六进制的哈希值组合表示,为了能返回一个信息明确的字符串,子类通常会覆盖该方法:
1
2
3
|
public
String toString() {
return
getClass().getName()+
"@"
+Integer.toHexString(hashCode());
}
|
在Java中,打印对象的时候,会执行String.valueOf转换为字符串,该方法的底层依旧是对象的toString方法:
1
2
3
4
5
6
|
public
void
println(Object x) {
String s = String.valueOf(x);
}
public
static
String valueOf(Object obj) {
return
(obj ==
null
) ?
"null"
: obj.toString();
}
|
1
2
3
4
|
public
native
int
hashCode();
public
boolean
equals(Object obj) {
return
(
this
== obj);
}
|
equals判断方法需要考量实际的场景与策略,例如常见的公民注册后分配的身份ID是不能修改的,但是名字可以修改,那么就可能存在这样的场景:
1
2
3
4
5
6
|
EachUser eachUser01 =
new
EachUser(
1
,
"A"
) ;
EachUser eachUser02 =
new
EachUser(
1
,
"B"
) ;
class
EachUser {
private
Integer cardId ;
private
String name ;
}
|
从程序本身看,这确实是创建两个对象,但是放在场景下,这的确是描述同一个人,所以这时候可以在equals方法中定义比较规则,如果ID相同则视为同一个对象:
1
2
3
4
5
6
7
8
|
@Override
public
boolean
equals(Object obj) {
if
(obj !=
null
){
EachUser compareObj = (EachUser)obj ;
return
this
.cardId.intValue()==compareObj.cardId ;
}
return
Boolean.FALSE ;
}
|
这里还要注意值类型和引用类型的区别,如果出现null比较情况,要返回false.
通常在子类中会同时覆盖这两个方法,这样做法在集合容器的设计上已经体现的淋漓尽致.
1
2
3
|
public
final
native
void
wait(
long
timeout)
throws
InterruptedException;
public
final
native
void
notify();
public
final
native
void
notifyAll();
|
注意这里:native关键字修饰的方法,即调用的是原生函数,也就是常说的基于C/C++实现的本地方法,以此提高和系统层面的交互效率降低交互复杂程度.
返回当前对象的拷贝:
1
|
protected
native
Object clone()
throws
CloneNotSupportedException;
|
关于该方法的细节规则极度复杂,要注意下面几个核心点:
对象必须实现Cloneable接口才可以被克隆; 数据类型:值类型,String类型,引用类型; 深浅拷贝的区别和与之对应的实现流程; 在复杂的包装类型中,组合的不同变量类型; 。
当垃圾收集器确认该对象上没有引用时,会调用finalize方法,即清理内存释放资源:
1
|
protected
void
finalize()
throws
Throwable { }
|
通常子类不会覆盖该方法,除非在子类中有一些其他必要的资源清理动作.
在下面main方法执行结束之后,无法再访问Each05Obj01的实例对象,因为对象的引用each05丢失:
1
2
3
4
5
6
|
public
class
Each05 {
public
static
void
main(String[] args) {
Each05Obj01 each05 =
new
Each05Obj01 (
99
) ;
System.out.println(each05);
}
}
|
这里就会存在一个问题,引用丢失导致对象无法访问,但是对象在此时可能还是存在的,并没有释放内存的占用.
Java通过new创建的对象会在堆中开辟内存空间存储,当对象失去所有引用时会被标记为垃圾对象,进而被回收; 。
这里涉及下面几个关键点:
这里存在一个很难理解的概念,即对象不存在引用的判断,也就是常说的可达性分析算法:基于对象到根对象的引用链是否可达来判断对象是否可以被回收;GC-Roots根引用集合,也可以变相理解为存活对象的集合。(详见JVM系列) 。
通过Object对象的分析,结合Java方方面面的机制和设计,可以去意会一些所谓的编程思想.
GitEE·地址 https://gitee.com/cicadasmile/java-base-parent Wiki·地址 https://gitee.com/cicadasmile/butte-java-note/wikis 。
到此这篇关于了解java中对象基础Object类的文章就介绍到这了,更多相关java object类内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/cicada-smile/p/15213101.html 。
最后此篇关于了解java中对象基础Object类的文章就讲到这里了,如果你想了解更多关于了解java中对象基础Object类的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!