java 判断object类型_Java 类继承机制

封装、继承、多态是面向对象的三大特征,“继承”最主要的目的是为了实现代码的可复用性。通过父类与子类的继承关系,子类继承了父类的成员函数和成员变量,提高了代码的重复利用率。同时,子类也可以扩展自己特有的成员,丰富功能。
在Java中,类与类之间通过extends 关键字来定义继承关系。Java规定,类之间只能是单继承的关系,子类只能继承一个父类,但是可以实现多个接口。

public class Base {private String name="base";public String getName(){return this.name;}public Base(){}public Base(String name){this.name=name}
}public class Child extends Base{public String getName(){return "child";}}

Object

Object是Java中规定的一切类的起源,任何类都需要继承Object,在object 中规定了以下11个方法:

  • toString()
  • equals(Object object)
  • hashCode()
  • getClass()
  • notify ()
  • notifyAll()
  • wait()
  • wait(long timeout)
  • wait(long timeout,int nanos)

这11个方法是所有对象都拥有的成员,我们可以继承并进行重写,以实现自己的机制。对这上述11个类,其着重功能点不同,可以按照功能点进行分组如下。

输出字符串

toString()方法的作用是返回该对象的文本描述,默认实现是使用类名@16进制哈希码的形式。比如声明了Point 类,实例化该类的一个对象Point pt=new Point() pt.toString()输出的就为 Point@76f9aa66。

对象间相等性的判断

equals()
hashCode()
在java 中,存在两种不同的变量类型,基本数据类型和对象类型。联系到底层的存储机制,二者的区别在于,基本类型都存储在栈中,对象类型存储到堆中。Java提供了8中基础类型,而同时对于每种基础类型,又以对象的方式提供相应的包装类型。具体如下:

  • byte----Byte
  • short----Short
  • int----Integer
  • long----Long
  • double----Double
  • float----Float
  • char----Char
  • boolean----Boolean

在判断这两种类型的变量是否相等的问题上,我们应该使用的机制也不同。通常情况下,我们使用 === 来进行比较,在基础类型中,这没有问题,比较的依据是内容相等,则变量等价。但是对于对象类型的变量,这比较的是变量的内存地址,这就意味着,除非是同一个对象,否则不可能相等。在object中,equals 的本质就是==,但是例如Integer、String等类型重写了equals方法,变成了内容的比较。

继承下的一些机制

变量初始化

子类初始化的过程中,先进行父类的初始化,可通过super来调用父类相应的构造方法,没有使用super的情况下,将调用父类的默认构造方法。如果声明了一个子类变量,其实例化顺序如下:

  1. 类初始化
  • 父类初始化
    • 开辟类变量内存空间并赋值
    • 执行静态代码段
  • 子类初始化
    • 开辟类变量内存空间并赋值
    • 执行静态代码段
  1. 变量初始化
  • 父类变量开辟空间并赋值
  • 执行父类构造函数
  • 子类变量开辟空间并赋值
  • 子类构造函数
    注意,在父类构造方法中不要调用可重写的方法,因为一旦子类进行了重写,调用父类构造方法的时候就会调用子类的方法。而且,此时子类构造方法中,如果引用了子类变量,此时子类变量还未进行赋值操作,为null。
public class Base {private String name="base";public String getName(){return this.name;}public Base(){printName();}public void printName(){System.out.println(name);}public Base(String name){this.name=name;}
}public class Child extends Base{private  String name="child";public String getName(){return "child";}@Overridepublic void  printName() {System.out.println(name);}}public class main extends GeodataApplicationTest {@Testpublic void extendTest() {Child child = new Child();}}

上述代码输出结果为:
开始测试-----------------
null
测试结束-----------------

静态绑定与动态绑定

子类对象可以赋值给父类引用变量,这叫多态,实际执行的调用的是子类的方法,这叫动态绑定。与之相对的是静态绑定,变量绑定到变量的类型。静态绑定在程序编译阶段即可决定,动态绑定需要在运行时决定。

重载和重写

子类继承父类的public方法,如果在子类中同时对该方法进行了重载,在调用时,会同等看待这两种不同来源的重载方法,依据参数类型进行比较,调用符合度较高的方法。

父子类型转换

子类对象可以赋值给父类型的变量,这样称之为向上转换,但是父类对象不可赋值给子类对象的变量,通过强制转换也不行,也就是不可进行向下转换。

继承实现的机制

Java是静态语言,需要经过编译的过程,经过编译后将原来.java格式的源代码文件转换为.class的文件。JVM通过类加载机制,将.class文件加载到内存中,形成类的数据结构。
在类的数据结构中,会记录父类与子类的关系。

c45538259ef2b681bebfd2ecd5a3715e.png

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

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

相关文章

一个情怀引发的生产事故(续)

接上一篇博文,用Roslyn动态编译C#语句片段,情怀了一把,但内存会飙升,执行速度也奇慢,这条路走不通,回归正道,说起脚本,Lua是常用的手段之一,那就看看NLua怎么样&#xff…

c++的unique函数

在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为un…

用户登录查全表好还是用用户名好_外贸人/货代人不要为海运难过了:请看如何查运价和调配舱位解决缺箱!...

最近很多外贸人/货代人都被海运伤透了心,不仅价格上涨,还经常没舱位或缺柜子!整个人的心态都不好了。其实呢运价上涨这个大环境趋势,我们也无法改变。但是没舱位和缺柜子是属于流动性的,只要不死盯一家船公司还是可以解…

BCVP开发者说第4期:Remember.Core

沉静岁月,淡忘流年1项目简介Remember.Core一个轻量的 Web 应用框架, 具有优雅、高效、简洁、富于表达力等优点。采用 前后端分离 设计,是崇尚开发效率的全栈框架简洁友好 - 统一的设计规范,精心打磨的操作界面回应你的期待。易扩展 - 一套完整…

c++的assert函数

assert宏的原型定义在<assert.h>中&#xff0c;其作用是如果它的条件返回错误&#xff0c;则终止程序执行&#xff0c;原型定义&#xff1a; #include <assert.h> void assert( int expression ); assert的作用是现计算表达式 expression &#xff0c;如果其值为假…

c++十进制转二进制_二进制与十进制如何互相转换?

正整数的十进制转换二进制将一个十进制数除以二&#xff0c;得到的商再除以二&#xff0c;依此类推直到商等于一或零时为止&#xff0c;倒取除得的余数&#xff0c;即换算为二进制数的结果。只需记住要点&#xff1a;除二取余&#xff0c;倒序排列。由于计算机内部表示数的字节…

如何在 C# 中使用 AutoMapper

译文链接&#xff1a;https://www.infoworld.com/article/3192900/how-to-work-with-automapper-in-csharp.htmlAutoMapper 是一个非常流行的 object-to-object 映射库&#xff0c;它的目的就是帮助你实现不同类型对象之间的映射&#xff0c;举一个例子&#xff0c;在 DDD 开发…

c++STL的反向迭代器

反向迭代器 反向迭代器是一种反向遍历容器的迭代器。也就是&#xff0c;从最后一个元素到第一个元素遍历容器。反向迭代器将自增&#xff08;和自减&#xff09;的含义反过来了&#xff1a;对于反向迭代 器&#xff0c; 运算将访问前一个元素&#xff0c;而 – 运算则访问下一…

matlab eval函数_matlab自动给变量命名

在某些特定场景中&#xff0c;我们需要在一个循环中生成一系列的数据&#xff0c;并把这些数据保存到特定的变量中&#xff0c;这个时候我们就需要实现自动给变量命名&#xff0c;同时赋给变量数值。下面提供2种方法。方法1通过eval函数实现&#xff0c;举个例子clear%%%%%%%%%…

c++的STL中的map(哈希表)与unordered_map

map: unordered_map: map&#xff1a; map内部实现了一个红黑树&#xff0c;该结构具有自动排序的功能&#xff0c;因此map内部的所有元素都是有序的 unordered_map:unordered_map内部实现了一个哈希表&#xff0c;因此其元素的排列顺序是杂乱的&#xff0c;无序的 Map是STL的…

java转python推荐算法_java和python实现一个加权SlopeOne推荐算法

1 importjava.util.HashMap;2 importjava.util.Map;3 importjava.util.List;4 importjava.util.ArrayList;5 importjava.util.Comparator;6 importjava.util.Collections;7 8 /** 9 * Created by on 2016/12/8.ShiYan10 * 一.计算所有物品对的偏差11 * 二.利用偏差进行预测12 *…

IdentityServer4系列 | 简化模式

一、前言从上一篇关于资源密码凭证模式中&#xff0c;通过使用client_id和client_secret以及用户名密码通过应用Client(客户端)直接获取&#xff0c;从而请求获取受保护的资源&#xff0c;但是这种方式存在client可能存了用户密码这不安全性问题&#xff0c;所以需要做到client…

char截取字符串_字符串的排列(滑动窗口)

题目&#xff1a;给定两个字符串 s1 和 s2&#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。换句话说&#xff0c;第一个字符串的排列之一是第二个字符串的子串。示例1&#xff1a;输入: s1 "ab" s2 "eidbaooo"输出: True解释: s2 包含 s1 的排列之…

c++中的全排列函数next_permutation()

全排列函数next_permutation() prev_permutation函数&#xff08;按降序排序&#xff09; 计算序列全排列的函数&#xff1a;next_permutation&#xff08;start,end&#xff09;&#xff0c;此函数求的是当前排列的下一个排列&#xff0c;这里的“下一个”&#xff0c;我们可…

学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片

第一部分&#xff1a;Consul 基础1&#xff0c;Consul 介绍官网文档描述&#xff1a;Consul 是一个网络工具&#xff0c;提供功能齐全的服务网格和服务发现。它可以做什么&#xff1a;自动化网络配置&#xff0c;发现服务并启用跨任何云或运行时的安全连接。那么&#xff0c;我…

python能做哪些客户端_Python 实现简单的客户端认证

问题 你想在分布式系统中实现一个简单的客户端连接认证功能&#xff0c;又不想像SSL那样的复杂。 解决方案 可以利用 hmac 模块实现一个连接握手&#xff0c;从而实现一个简单而高效的认证过程。下面是代码示例&#xff1a; import hmac import os def client_authenticate(con…

多线程并发如何高效实现生产者/消费者?

【导读】无需引入第三方消息队列组件&#xff0c;我们如何利用内置C#语法高效实现生产者/消费者对数据进行处理呢&#xff1f;在.NET Core共享框架&#xff08;Share Framework&#xff09;引入了通道&#xff08;Channel&#xff09;&#xff0c;也就是说无需额外通过NuGet包安…

c++牛客网面试题05. 替换空格

class Solution{public:string replaceSpace(string s){int count0,len s.size();//统计空格的个数for(char c : s){if(c )count;} s.resize(len 2 * count);//修改字符串的长度for(int i len-1, j s.size()-1;i<j;i--,j--) {if(s[i]! )s[j]s[i];else{s[j]0;s[j-1]2;s[j-…

js-cookie 无法设置cookie_php操作 cookie

1&#xff0c;设置cookie<?phpsetcookie(key);setcookie(key1,value1);setcookie(key2,value2,time()1*24*60*60);setcookie(key4, value4, time() 1 * 24 * 60 * 60, , , false, true); //一旦cookie的httponly为真&#xff0c;那么只能在服务端获取&#xff0c;js无法操…

.Net orm 开源项目 FreeSql 2.0.0

写在开头2018年11月头脑发热到今天&#xff0c;一晃已经两年&#xff0c;当初从舒服区走向一个巨大的坑&#xff0c;回头一看后背一凉。两年时间从无到有&#xff0c;经历数不清的日夜奋斗&#xff08;有人问花了多长时间投入&#xff0c;答案&#xff1a;全职x2 两年无休息&a…