- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我开始在 Ethereum blockchain 上了解如何开发智能合约以及如何写 web-script用于与智能合约交互(购买、销售、统计......)我得出了该怎么做的结论。我想知道我是否正确理解
我正在 UIView 中使用 CATransform3DMakeRotation,并且我正在尝试进行 45º,变换就像向后放置一样: 这是我拥有的“代码”,但显然没有这样做。 CATransform3
我目前正在测试 WebRTC 的功能,但我有一些脑逻辑问题。 WebRTC 究竟是什么? 我只读了“STUN”、“P2P”和其他...但是在技术方面什么是正确的 WebRTC(见下一个) 我需要什么
我在看 DelayedInit在 Scala in Depth ... 注释是我对代码的理解。 下面的 trait 接受一个非严格计算的参数(由于 => ),并返回 Unit .它的行为类似于构造函数
谁能给我指出一个用图片和简单的代码片段解释 WCF 的资源。我厌倦了谷歌搜索并在所有搜索结果中找到相同的“ABC”文章。 最佳答案 WCF 是一项非常复杂的技术,在我看来,它的文档记录非常少。启动和运
我期待以下 GetArgs.hs打印出传递给它的参数。 import System.Environment main = do args main 3 4 3 :39:1: Coul
private int vbo; private int ibo; vbo = glGenBuffers(); ibo = glGenBuffers(); glBindBuffer(GL_ARRAY_
我正在尝试一个 for 循环。我添加了一个 if 语句以在循环达到 30 时停止循环。 我见过i <= 10将运行 11 次,因为循环在达到 10 次时仍会运行。 如果有设置 i 的 if 语句,为什
我正在尝试了解 WSGI 的功能并需要一些帮助。 到目前为止,我知道它是一种服务器和应用程序之间的中间件,用于将不同的应用程序框架(位于服务器端)与应用程序连接,前提是相关框架具有 WSGI 适配器。
我是 Javascript 的新手,我正在尝试绕过 while 循环。我了解它们的目的,我想我了解它们的工作原理,但我在使用它们时遇到了麻烦。 我希望 while 值自身重复,直到两个随机数相互匹配。
我刚刚偶然发现Fabric并且文档并没有真正说明它是如何工作的。 我有根据的猜测是您需要在客户端和服务器端都安装它。 Python 代码存储在客户端,并在命令运行时通过 Fabric 的有线协议(pr
我想了解 ConditionalWeakTable .和有什么区别 class ClassA { static readonly ConditionalWeakTable OtherClass
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我还没有成功找到任何可以引导我理解 UIPickerView 和 UIPickerView 模型的好例子。有什么建议吗? 最佳答案 为什么不使用默认的 Apple 文档示例?这是来自苹果文档的名为 U
我在看foldM为了获得关于如何使用它的直觉。 foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a 在这个简单的例子中,我只返回 [Just
答案What are _mm_prefetch() locality hints?详细说明提示的含义。 我的问题是:我想要哪一个? 我正在处理一个被重复调用数十亿次的函数,其中包含一些 int 参数。
我一直在读这个article了解 gcroot 模板。我明白 gcroot provides handles into the garbage collected heap 然后 the handle
提供了一个用例: 流处理架构;事件进入 Kafka,然后由带有 MongoDB 接收器的作业进行处理。 数据库名称:myWebsite集合:用户 并且作业接收 users 集合中的 user 记录。
你好 我想更详细地了解 NFS 文件系统。我偶然发现了《NFS 图解》这本书,不幸的是它只能作为谷歌图书提供,所以有些页面丢失了。有人可能有另一个很好的资源,这将是在较低级别上了解 NFS 的良好开始
我无法理解这个问题,哪个更随机? rand() 或: rand() * rand() 我发现这是一个真正的脑筋急转弯,你能帮我吗? 编辑: 凭直觉,我知道数学答案是它们同样随机,但我忍不住认为,如果您
我是一名优秀的程序员,十分优秀!