• 前言

    我们在之前的学习中提过很多次了,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. Atcoder Beginner Contest 070 D - Transit Tree Path

    题意:n个点,n-1条边,组成一个无向的联通图,然后给出q和k,q次询问,每次给出两个点,问这两个点之间的最短距离但必须经过k点. 思路:我当时是用优化的Dijkstra写的(当天刚学的),求出k点到 ...

  2. 一些简单的ajax的特点,方法、属性。以及ajax的创建 请求

    1.ajax的特点,基本原理,属性. ajax:页面的局部刷新 Asynchronous JavaScript And Xml JavaScript:更新局部的页面 XML:一般用于请求数据和响应数据 ...

  3. sklearn svm基本使用

    SVM基本使用 SVM在解决分类问题具有良好的效果,出名的软件包有libsvm(支持多种核函数),liblinear.此外python机器学习库scikit-learn也有svm相关算法,sklear ...

  4. 关于String类学习的一些笔记(本文参考来自程序员考拉的文章)

    String 类继承自 Object 超类,实现的接口有:Serializable.CharSequence.Comparable<String> 接口,具体如下图: 一.常用的Strin ...

  5. 基于UML网络教学管理平台模型的搭建

    一.基本信息 标题:基于UML网络教学管理平台模型的搭建 时间:2013 出版源:网络安全技术与应用 领域分类:UML:网络教学管理平台:模型 二.研究背景 问题定义:网络教学管理平台模型的搭建 难点 ...

  6. C语言fprintf, fwrite, fscanf, fread混用问题

    int main(int argc, const char * argv[]) { // insert code here... FILE * fp = fopen("test.txt&qu ...

  7. OC字典的使用

    在OC中,字符串.数组.字典是最常见的对象类型,但是在这三个当中,字典的用法相对较少,因为字典的属性和方法比较少,但是一个字典的用法比较复杂,因为在一个字典当中,既可以包含字符串,也可以包含数组,数组 ...

  8. day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义

    复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...

  9. dubbo 源码学习1 服务发布机制

    1.源码版本:2.6.1 源码demo中采用的是xml式的发布方式,在dubbo的 DubboNamespaceHandler 中定义了Spring Framework 的扩展标签,即 <dub ...

  10. 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法

    不知道你有没有遇到过这样的问题,网站访客多起来后,心里很是高兴,加上了Nginx反向代理,出问题了 原来是这么写的: Request.Url.ToString() 输出是这样的: http://www ...