5.2-全栈Java笔记:面向对象的特征(一)继承 | 下

上节我们聊到「Java面向对象的特征:继承」这节我们继续聊一下继承的应用。

Object类

Object类基本特性

Object类是所有Java类的根基类,也就意味着所有的JAVA对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。

【示例1Object


public class Person {

...

}

//等价于:

public class Person extends   Object {

...

}

toString方法

Object类中定义有public String toString()方法,其返回值是 String 类型。Object类中toString的源码为:


public   String toString()   {

return  getClass().getName() + "@" +

Integer.toHexString(hashCode());

}

根据如上源码得知,默认会返回“类名[email protected]+16进制的hashcode”。

在打印输出或者字符串连接对象时,会自动调用该对象的toString()方法

【示例2toString()方法测试和重写toString()方法


class   Person {

String name;

int age;

@Override

public   String toString() {

return name+",年龄:"+age;

}

}

public class   Test {

public static void   main(String[] args) {

Person p=new   Person();

p.age=20;

p.name="李东";

System.out.println("info:"+p);

Test t = new Test();

System.out.println(t);

}

}

示例2 重写toString方法

==和equals方法

“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等是同一个对象。

Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为id相同的人就是同一个人、学籍系统中认为学号相同的就是同一个人。

Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true 否则返回 false。但是,我们可以根据我们自己的要求重写equals方法。

JDK提供的一些类,如String、Date、包装类等,重写了Object的equals方法,调用这些类的equals方法, x.equals (y) ,当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回 true 否则返回 false。

【示例3equals方法测试和自定义类重写equals方法


public class   TestEquals {

public static void   main(String[] args) {

Person p1 = new   Person(123,"高淇");

Person p2 = new   Person(123,"高小七");

System.out.println(p1==p2);     //false,不是同一个对象

System.out.println(p1.equals(p2)); //true,id相同则认为两个对象内容相同

String s1 = new   String("上学");

String s2 = new   String("上学");

System.out.println(s1==s2);       //false,   两个字符串不是同一个对象

System.out.println(s1.equals(s2)); //true,  两个字符串内容相同

}

}

class   Person {

int id;

String name;

public   Person(int id,String name) {

this.id=id;

this.name=name;

}

public boolean   equals(Object obj) {

if(obj   == null){

return false;

}else {

if(obj   instanceof Person) {

Person c = (Person)obj;

if(c.id==this.id) {

return true;

}

}

}

return false;

}

}

super关键字

super:可以通过super来访问直接父类中被子类覆盖的方法或属性。 super仅仅表示一种继承关系,不是直接父类对象的引用。

【示例4super关键字的使用


public class TestSuper01 {

public static void main(String[] args) {

new ChildClass().f();

}

}

class FatherClass {

public int value;

public void f(){

value = 100;

System.out.println   ("FatherClass.value="+value);

}

}

class ChildClass extends FatherClass {

public int value;

public void f() {

super.f();

value = 200;

System.out.println("ChildClass.value="+value);

System.out.println(value);

System.out.println(super.value);

}

}

示例4 运行效果图

继承树追溯

·属性/方法查找顺序:(比如:查找变量h)

1. 查找当前类中有没有属性h

2.依次上溯每个父类,查看每个父类中是否有h,直到Object

3.如果没找到,则出现编译错误。

4.上面步骤,只要找到h变量,则这个过程终止。

 

·构造方法调用顺序:

构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。

注:静态初始化块调用顺序,与构造方法调用顺序一样,不在重复。

【示例5】 构造方法向上追溯执行测试


public class   TestSuper02 {

public static void   main(String[] args) {

System.out.println("开始创建一个ChildClass对象......");

new   ChildClass();

}

}

class   FatherClass {

public   FatherClass() {

System.out.println("创建FatherClass");

}

}

class   ChildClass extends   FatherClass {

public   ChildClass() {

System.out.println("创建ChildClass");

}

}

示例5 运行效果图



「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。

 笔记包含从浅入深的六大部分:

A-Java入门阶段

C-手刃移动前端和Web前端

D-J2EE从了解到实战

E-Java高级框架精解

B-数据库从入

F-Linux和Hadoop

门到精通

时间: 2025-01-01 03:21:08

5.2-全栈Java笔记:面向对象的特征(一)继承 | 下的相关文章

5.1-全栈Java笔记:面向对象的特征(一)继承 | 上

JAVA面向对象进阶 本章重点针对面向对象的三大特征:继承.封装.多态,进行详细的讲解.很多概念对于初学者来说,更多的是先进行语法性质的了解,不要期望,通过本章学习就"搞透面向对象".本章只是面向对象的起点,后面所有的章节说白了都是面向对象这一章的应用. 老鸟建议 建议大家,学习本章,莫停留!学完以后,迅速开展后面的章节.可以说这么说,以后所有的编程都是"面向对象"的应用而已! 继承(extend) 继承的实现 继承让我们更加容易实现类的扩展. 比如,我们定义了人类

4.3-全栈Java笔记:面向对象的内存分析

面向对象的内存分析 为了让大家对于面向对象编程有更深入的了解,我们要对程序的执行过程中,内存到底发生了什么变化,进行剖析,让大家做到"心中有数",通过更加形象的方式理解程序的执行方式. 老鸟建议:       本节是为了让初学者更深入了解程序底层执行情况,为了完整的体现内存分析流程,会有些新的名词,比如:线程.Class对象.大家暂时可以不求甚解的了解,后期学了这两个概念再回头来看我们这篇内存分析,肯定收获会更大. Java虚拟机的内存可以分为三个区域:栈stack.堆heap.方法区

5.3-全栈Java笔记:面向对象特征(二)封装、多态

封装(encapsulation) 封装的作用和含义 我要看电视,只需要按一下开关和换台就可以了.有必要了解电视机内部的结构吗?有必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只给我们暴露简单的接口,比如:电源开关.具体怎么内部实现的,我们不需要操心. 需要让用户知道的暴露出来,不需要让用户了解的全部隐藏起来.这就是封装. 我们程序设计要追求"高内聚,低耦合". 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉:低耦合:仅暴露少量的方法给外部使用,

5.4-全栈Java笔记:面向对象进阶之对象的转型 | FINAL关键字 |抽象方法和抽象类

对象的转型(casting) 引用变量只能调用它编译类型的方法,不能调用它运行类型的方法.这时,我们就需要进行类型的强制转换! [示例1]对象的转型 public class   TestCasting { public static void   main(String[] args) { Object obj = new   String("北京");  //向上可以自动转型 //obj.charAt(0)      //无法调用.编译器认为obj是Object类型而不是Strin

10.2-全栈Java笔记:最全面的IO技术(二)

上节我们聊到「IO技术概念及入门」这节我们继续聊一下IO技术的分类. Java中流的概念细分 按流的方向分类: 输入流:数据流向是数据源到程序(InputStream.Reader结尾的流) 输出流:数据流向是程序到目的地(OutPutStream.Writer结尾的流) 按处理的数据单元: 字节流:按照字节读取数据(InputStream.OutputStream)命名上以stream结尾的流一般是字节流. 字符流:按照字符读取数据(Reader.Writer).命名上以Reader/Writ

10.1-全栈Java笔记:最全面的IO技术(一)

IO技术 对于任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能.程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件.数据库.其他程序.网络.IO设备等等. 外部系统比较复杂多变,那么我们有必要通过某种手段进行抽象.屏蔽外部的差异,从而实现更加便捷的编程. 输入(Input)指的是:可以让程序从外部系统获得数据(核心含义是"读",读取外部数据).常见的应用: 1) 读取硬盘上的文件内容到程序.例如:播放器打开一个视频文件.word打

4.1-全栈Java笔记:对象的进化史

面向对象和面向过程的区别 面向过程编程思想思考问题时,我们首先思考"怎么按步骤实现?"并将步骤对应成方法,一步一步,最终完成. 这个适合简单任务,不需要过多协作的情况下.比如,如何开车?我们很容易就列出实现步骤: 1. 发动车 2. 挂挡 3.踩油门 4. 走,你 面向过程适合简单.不需要协作的事务. 如果,我们需要思考"如何造车?",你就会发现列出1234这样的步骤,是不可能的.那是因为,造车太复杂,需要很多协作才能完成. 面向对象(Object)编程,更契合人的

13.4-全栈Java笔记:打飞机游戏实战项目|offScreenImage|GameObject|Plane

双缓冲技术解决闪烁问题 上节,我们实现了动画效果,但是发现窗口会不停的闪烁,体验度非常差.在实际开发中,绘制图形是非常复杂的,绘图可能需要几秒甚至更长时间,也经常发生闪烁现象, 为了解决这个问题,我们通常使用"双缓冲技术". 1)"双缓冲技术"的绘图过程如下: a. 在内存中创建与画布一致的缓冲区 b. 在缓冲区画图 c. 将缓冲区位图拷贝到当前画布上 e. 释放内存缓冲区 双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性

4.2-全栈Java笔记:对象和类的概念及定义

对象和类的概念 我们人认识世界,其实就是面向对象的.大家眼里都是一个个对象,要不怎么老说搞对象搞对象啊.比如现在让大家认识一下"天使"这个新事物,天使大家没见过吧,怎么样认识呢?最好的办法就是,给你们面前摆4个天使,带翅膀的美女,让大家看,看完以后,即使我不说,大家下一次是不是就都认识天使了. 但是,看完10个天使后,我们总要总结一下,什么样的东东才算天使?天使是无数的,总有没见过的!所以必须总结抽象,便于认识未知事物!总结的过程就是抽象的过程. 小时候,我们学自然数时怎么定义的?像1