[java核心外篇]__Object类与对象类型的转型
- 前言
我们在之前的学习中提过很多次了,java是面向对象的,java的基础可以说是建立在类和对象上面的.然后我们又学到了类的继承,发现了在java类库中,类的继承是极为普遍的,一个类继承另一个类,就像是一个家族树一样蔓延开来,今天就说一下,这个树的顶端,也就是一切类的开始,Object类.另外在学习下应继承机制而导致对象的两种特性.
- Object类
Object类是JAVA语言一切类的开始,所有的类都直接或间接的继承自它,当我们定义一个类时,如果不声明继承关系,那么它就默认的继承Object类,因为它可以说是java语言一切类的父类,所以继承它就是默认的情况,使得我们在定义类的时候并不用通过extends指明和它的继承关系.但是我们又可以使用和重写它的一些基本的方法.
- Object类中主要包括clone(),finalze(),equals(),toString()等方法.其中equlas方法和toString方法经常会被我们用到,并且会碰到重写toString方法的情况.

- 我们在IdEA中通过定义两个类,我们可以就可以发现这一现象,最后打开Object类看看,可以看到其构成十分简单,只有少数基本的方法,虽然很多我们都没有用过,或许也不知道其作用.

这里需要注意到的是,Object类中的方法并不是都能够被重写的,因为其中有getClass(),notify(),notifyAll(),wait()等方法是被inal修饰符修饰的.我们知道被final修饰的变量是常量,所以被final修饰的方法也是一个"常量"方法,其内容是不可变的,也就意味着不能够被重写.
- 其中getClass方法会返回对象执行的class实例,然后使用该实例调用getName方法可以获得类的名称.
我们试试看:
通过其方法的说明,我们可以这样使用它,打印出实例化对象所对应的类的类名.
System.out.println(sty_classfeature.getClass().getName());

- toString方法,相比我们已经很熟悉了,它能够将对象的内容作为字符串类型返回.所以我们通常使用该方法来进行对象的输出.同时我们也可以对它进行重写.
我们可以看看Object类中的toString方法:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
发现我们只能看得懂前半段,知道会返回一个对象对应的类名,@后面的应该是一个Int型的数据.经过查找一番,知道了后半段的意义:
在Object类中定义toString()方法的时候返回对象的哈希code码(对象地址字符串)
试试看:
// toString 方法
System.out.println(sty_classfeature.toString());

现在我们知道了Object类的toString方法返回的值是这样的结构了,但显然,这和我们平时使用的toString方法不同啊,我们印象中的toString方法,应该是返回对象的一些属性值的,可以做出输出来使用的,是在哪里经常遇到的呢,看下面这段代码:
public class sty_entity {
private String name;
private int age;
private char sex;
@Override
public String toString() {
return "sty_entity{" + "name='" + name + '\'' + ", age=" + age + ", sex=" + sex + '}';
}
}

对的没错,就是在我们构建实体类时会使用到的toString方法,然而其实这里使用的就是重写的toString方法,然后我们在其他类中实例化对象调用toString方法时,就可以返回将各属性以String类型返回了.
- 对象的类型转换
对象的类型转换在java编程中也会经常遇到,包括有向上转型和向下转型.
- 向上转型
向上转型就是将子类的对象赋值个父类,成为父类的一个实例化对象,这个其实是十分好理解的,我们前面了解到继承,知道了子类其实继承了父类的属性和行为,那么子类的对象自然也可以看做是一个(特殊的)父类的对象.就比如我们经常说的,正方形是一个特殊的平行四边形.
我们可以来看看这个例子:
public class sty_Typeconversion {
public void main(String[] args) { //定义主方法
square square = new square(); // 实例化正方形对象
square.draw(square); // 调用父类方法,以子类对象作为父类对象传参数,向上转型.
}
}
// 定义四边形类
class quadrilateral{
public void draw(quadrilateral q){
System.out.println("绘制四边形");
}
}
// 定义子类正方形继承四边形类
class square extends quadrilateral {
}
这里的我们子类没有重写父类方法draw,直接调用父类方法,而其参数必须是一个父类类型的参数,这里就把子类类型的对象当做了父类类型的参数使用,就是向上转型.
- 向下转型
向下转型,就名字而言就明白了,它应该是和向上转型相反,将父类的对象作为子类对象来使用,那么我们联想继承的特性,就知道,这样做事有问题的,因为子类可以是父类的特例,子类可以有父类所没有的属性和行为.而这也是向下转型的弊端,当子类具有独特属性和行为时,使用向下转型就必然会导致他们的缺失.
quadrilateral q = new square(); // 将子类对象赋值给父类类型对象.
// square s = q; // 直接将父类对象转换为子类对象是不行的,就像数据的类型转换一样,
square s = (square) q; // 只能通过强制类型转换来向下转型
我们可以发现对象的类型转换,向上向下转型,和数据类型的转换有异曲同工之妙.向上转型就相当于低精度转向高精度,不会带来任何隐患和问题,向下转型就像低精度向高精度的转换,会有属性,行为的缺失.必须使用强制类型转换才行,否则报错.
- 最后补充一点知识:
我们可以通过instanceof关键字判断一个对象是否是某个类的实例化对象,其两个参数,object instenceof Exampleclass. 其返回值为boolean型.
System.out.println(s instanceof square);
更新时间:
2019-4-14
22:24
[java核心外篇]__Object类与对象类型的转型的更多相关文章
- Java中直接输出一个类的对象
例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...
- python的类和对象——番外篇(类的静态字段)
什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...
- java总结第三次//类和对象2、3
四.类和对象2 主要内容:Java类的继承.方法的重写.覆盖.访问控制.super 关键字.多态性及其应用 1.继承 要求:Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以派 ...
- Java中类的创建及类与对象的关系
//import java.util.Scanner; //创建一个类 class Person{ //属性和方法的定义不是必须的 //属性 String name ; int age ; //方法 ...
- JAVA基础第三章-类与对象、抽象类、接口
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- Java面向对象 第1节 类和对象
一.Java 对象和类 面向对象语言三大特性:封装.继承.多态: 对象:描述客观事物的一个实体: 类:类是封装对象的属性和方法的载体,反过来说具有相同属性和行为的一类实体被称为类:类行为:方法:属性: ...
- java开发中的常见类和对象-建议阅读时间3分钟
1.Dao 数据访问对象 此对象用于访问数据库.实现类一般用于用于操作数据库! 一般操作修改,添加,删除数据库操作的步骤很相似,就写了一个公共类DAO类 ,修改,添加,删除数据库操作时 直接调用公共类 ...
- Java面向对象(一)类和对象
面向过程和面向对象的区别 面向过程,强调的是功能行为,是将实现一个功能的步骤编写在一个函数中,以函数为最小单位. 面向对象,是将需要的功能封装进一个对象中,使一个对象具有很多的功能特征,以类/对象为最 ...
- Java(100-113)【类与对象、封装、构造方法】
1.对象的创建以及使用 Student stu =new Student(); 根据一个类创建一个对象 导包.创建.使用 2.手机练习 有main才能run Phone.java package cn ...
随机推荐
- CodeForces - 939A,解题报告
题意:给出一个n个点有向图,问是否存在三个点,这三个点构成一个回路.n<=5000 模拟即可. 注意是必须三个点 多了居然不行. import java.util.*; public class ...
- easy-ui treegrid 实现分页 并且添加自定义checkbox
首先第一点easy-ui treegrid 对分页没有好的实现, 因为在分页的过程中是按照 根节点来分页的 后台只能先按照 根节点做分页查询 再将子节点关联进去, 这样才能将treegrid 按 ...
- CODEFORCES ROUND #761 ANALYSES BY TEAM:RED & BLACK
A. Dasha and Stairs Problems: 一个按照1,2,3……编号的楼梯,给定踩过的编号为奇数奇数和偶数的楼梯数量a和b,问是否可以有区间[l, r]符合奇数编号有a个,偶数编号有 ...
- python 基础 ------字符串的调用详解(1)
Python 字符串的的调用方法~~~ 废话不多说直接奔主题 >>>>>>>>>>>>>>>>> ...
- 解决在静态页面上使用动态参数,造成spider多次和重复抓取的问题
我们在使用百度统计中的SEO建议检查网站时,总是发现“静态页参数”一项被扣了18分,扣分原因是“在静态页面上使用动态参数,会造成spider多次和重复抓取”.一般来说静态页面上使用少量的动态参数的话并 ...
- C#项目学习记录
1, Visual Studio Code 添加VS 2017的开发人员命令提示符---C#编译环境 2, C#编译器和CLI的安装 注意:自己的电脑上配置环境变量时,配置在系统变量的Path中 ...
- Python之路系列笔记
备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Python之路(一)——Python 初识 Python之路(二)——基础语法 Python之路(三)——函数 P ...
- apache kylin的单节点及多节点安装
Kylin的使用安装文档Kylin简介Kylin是什么Apache Kylin是一个开源的分布式分析引擎,最初由eBay开发贡献至开源社区.它提供Hadoop之上的SQL查询接口及多维分析(OLAP) ...
- 关于SQL2008R2连接服务器出错问题
在安装SQL2008R2后,在公司里用VS2013测试可以连接,可是回到寝室却出了问题,当打开SSMS连接服务器的时候会提示: “在与SQL Server建立连接时出现与网络相关的或特定于实例的错误. ...
- verilog HDL-参数型数据对像 与‘define
参数新数据对象是用来定义常量的,它可以提升verilog hdl代码的可读性和维护性. verilog hdl支持参数有两种,普通参数和局部参数.普通参数在模块例化时可以从新赋值,局部参数在模块例化时 ...