• 前言

    我们在之前的学习中提过很多次了,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类与对象类型的转型的更多相关文章

  1. Java中直接输出一个类的对象

    例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...

  2. python的类和对象——番外篇(类的静态字段)

    什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...

  3. java总结第三次//类和对象2、3

    四.类和对象2 主要内容:Java类的继承.方法的重写.覆盖.访问控制.super 关键字.多态性及其应用 1.继承 要求:Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以派 ...

  4. Java中类的创建及类与对象的关系

    //import java.util.Scanner; //创建一个类 class Person{ //属性和方法的定义不是必须的 //属性 String name ; int age ; //方法 ...

  5. JAVA基础第三章-类与对象、抽象类、接口

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  6. Java面向对象 第1节 类和对象

    一.Java 对象和类 面向对象语言三大特性:封装.继承.多态: 对象:描述客观事物的一个实体: 类:类是封装对象的属性和方法的载体,反过来说具有相同属性和行为的一类实体被称为类:类行为:方法:属性: ...

  7. java开发中的常见类和对象-建议阅读时间3分钟

    1.Dao 数据访问对象 此对象用于访问数据库.实现类一般用于用于操作数据库! 一般操作修改,添加,删除数据库操作的步骤很相似,就写了一个公共类DAO类 ,修改,添加,删除数据库操作时 直接调用公共类 ...

  8. Java面向对象(一)类和对象

    面向过程和面向对象的区别 面向过程,强调的是功能行为,是将实现一个功能的步骤编写在一个函数中,以函数为最小单位. 面向对象,是将需要的功能封装进一个对象中,使一个对象具有很多的功能特征,以类/对象为最 ...

  9. Java(100-113)【类与对象、封装、构造方法】

    1.对象的创建以及使用 Student stu =new Student(); 根据一个类创建一个对象 导包.创建.使用 2.手机练习 有main才能run Phone.java package cn ...

随机推荐

  1. CodeForces - 939A,解题报告

    题意:给出一个n个点有向图,问是否存在三个点,这三个点构成一个回路.n<=5000 模拟即可. 注意是必须三个点 多了居然不行. import java.util.*; public class ...

  2. easy-ui treegrid 实现分页 并且添加自定义checkbox

    首先第一点easy-ui  treegrid 对分页没有好的实现, 因为在分页的过程中是按照 根节点来分页的  后台只能先按照 根节点做分页查询  再将子节点关联进去, 这样才能将treegrid 按 ...

  3. CODEFORCES ROUND #761 ANALYSES BY TEAM:RED & BLACK

    A. Dasha and Stairs Problems: 一个按照1,2,3……编号的楼梯,给定踩过的编号为奇数奇数和偶数的楼梯数量a和b,问是否可以有区间[l, r]符合奇数编号有a个,偶数编号有 ...

  4. python 基础 ------字符串的调用详解(1)

    Python 字符串的的调用方法~~~ 废话不多说直接奔主题 >>>>>>>>>>>>>>>>> ...

  5. 解决在静态页面上使用动态参数,造成spider多次和重复抓取的问题

    我们在使用百度统计中的SEO建议检查网站时,总是发现“静态页参数”一项被扣了18分,扣分原因是“在静态页面上使用动态参数,会造成spider多次和重复抓取”.一般来说静态页面上使用少量的动态参数的话并 ...

  6. C#项目学习记录

    1,   Visual Studio Code 添加VS 2017的开发人员命令提示符---C#编译环境 2,  C#编译器和CLI的安装 注意:自己的电脑上配置环境变量时,配置在系统变量的Path中 ...

  7. Python之路系列笔记

    备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Python之路(一)——Python 初识 Python之路(二)——基础语法 Python之路(三)——函数 P ...

  8. apache kylin的单节点及多节点安装

    Kylin的使用安装文档Kylin简介Kylin是什么Apache Kylin是一个开源的分布式分析引擎,最初由eBay开发贡献至开源社区.它提供Hadoop之上的SQL查询接口及多维分析(OLAP) ...

  9. 关于SQL2008R2连接服务器出错问题

    在安装SQL2008R2后,在公司里用VS2013测试可以连接,可是回到寝室却出了问题,当打开SSMS连接服务器的时候会提示: “在与SQL Server建立连接时出现与网络相关的或特定于实例的错误. ...

  10. verilog HDL-参数型数据对像 与‘define

    参数新数据对象是用来定义常量的,它可以提升verilog hdl代码的可读性和维护性. verilog hdl支持参数有两种,普通参数和局部参数.普通参数在模块例化时可以从新赋值,局部参数在模块例化时 ...