Java学习笔记--继承和多态(中)
1.通过继承来开发超类(superclass)
2.使用super 关键词唤起超类的构造方法
3.在超类中覆盖方法
4.区分override和overload
5.在Object类中探索toString()类
6.发现多态性和动态绑定
7.描述解释为什么向下转型是必须的
8.在Object类中探索equals 方法
9.存储,取回,实现ArrayLis的对象
10.使用ArrayList类实现Stack
11.超类中使用数据和方法,protected
12.使用final模块来禁止类和方法的覆盖
5.在Object类中探索toString()类
Java中的每个类都是从java.lang.Object类中扩展出来,定义类的时候如果没有特别规定是继承来的,那么默认父类是Object。例如
public class ClassName 和 public classClassName extends Object
这两个语句是一样的,String类,StringBuilder类都来是来自与Object类,学习toString()方法
public String toString()
toString的返回值是描述对象的字符串。默认情况下,返回的字符串由一系列对象的类名,通常我们在使用的时候需要将toString改写。
笔记:也可以使用对象来唤起 System.out.println(Object)或者 System.out.println(Object)
6.发现多态性和动态绑定
面向对象的三个特性:封装、继承和多态。
介绍两个有用的术语:派生类subtype和超类supertype。子类定义的类型是subtype,例如原本研究圆是几何体。Circle is a geometry。所以说GeomericObject类是父类,Circle是子类,所以Circle是GeomericObject的subtype。GeomericObject是Circle的supertype。
继承关系使得子类从父类中继承一些父类的特征并且加入新的特性,子类是某种特殊的父类,子类的所有实例也可以算是父类的实例,反之不成。也就是我们理解的圆是几何图形但是几何图形不是圆。
动态绑定
超类中定义方法,然后在子类中进行覆盖,就像前面的toString()方法在Object类中已经定义了,在GeometricObject中再写一个方法方法进行覆盖,按照如下的代码:
Object O = new GeometricObject;
System.out.println(o.toString());
上面的例子中o调用的方法是哪个的toString()。为了研究这个问题,可以想到两个方面。比如说我们日常生活中,常常会声明“xxx是xxx,做出某某声明,但是实际上的是???”
出现某些事情影响到某机构,然后会有官方声明。所以就是两个方面,声明xxx,实际上xxx,Java中的思想,就是declare type和actual type就是声明类型和实际类型,变量必须声明一个类型变量的类型叫做它的声明类型,上面例子中的O的类型就是Object,如果遇到实际类型,实际类型根据变量的类进行参考,因此O的实际的类型是GeometricObject类,这就是动态绑定。(动态系统?声明一个类,然后具体由它的子类极性实现,生成的对象根据具体情况下的子类进行生成,此时对象和子类绑定起来)以后在遇到很多对象都是由不同的子类生成的,这些对象分别绑定了它的类:

7.描述解释为什么向下转型是必须的
前面用的例子用比较专业的术语而言就是转型,将某种xxx类型转为下一类型,将某个变量从最初的类型转为实际的类型。将某个对象转为实际使用时候的对象。就像前面写的语句: Object o = new student();就是隐式类型转换,在C语言中也有这种类型转换,比如我们以前遇到的 int a = (int) b;某种类型转换。同样的赋值操作,如果说是数值的赋值操作 a=b;进行类比 有没有对象的类似赋值的操作 student b = o; 此时就出错了。很像前面提到的"XXX是XXX"的一种关系,而且这种关系不可逆。
考虑以下的例子
object myObject = new Circle();
if(myObject instanceof Circle){
System.out.println("The Circle diameter is "+((circle)myObject).getDiameter());
...
}
myObject 变量声明的时候是Object类,声明类型决定了哪种方法会在编译的时候匹配,使用myObject.getDiameter()将会造成编译错误,因为Object类并没有getDiameter方法。编译的时候编译器找不到匹配的方法,所以要告诉编译器xxx是xxX的具体实例。为了更好理解转型,可以按照一下的想法进行思考:水果:苹果和橘子, fruit --superclass , Apple --subclass, Orange --subclass,Apple 是水果,所以能够安全地使用fruit的变量,然而fruit不是水果,所以在使用的时候要隐式类型转换。
8.在Object类中探索equals 方法
Object 类中也有equals的方法:语法如下
public boolean equals(Object o);
使用的时候:
object1.equals(object2);
默认的实现为:
public boolean equals(Object obj){
return (this == obj);
}
这个实现过程检查两个形参变量是否指向相同对象,此时使用的是==,在自己写的类中也可以进行重定义。
笔记:
==符号适用与比较两个最初的数据类型,确定两个变量是否有相同的参考,equals方法是为了测试两个对象是否有相同的内容。==操作符的优先级高于equals方法,因为==是检查是否指向相同的对象。
注意:
在子类中使用 equals(SomeClassName obj)(也就是 equals(Circle c))来覆盖是常见的错误,具体使用在以后的笔记中会涉及到。
Java学习笔记--继承和多态(中)的更多相关文章
- Java学习笔记--继承和多态(下)
1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...
- Java学习笔记--继承和多态(上)
1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...
- java学习笔记-继承中super关键字
背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...
- Java学习笔记——继承、接口、多态
浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...
- Java学习笔记---继承和super的用法
自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了. 不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了. 继 ...
- Java学习笔记(十一)面向对象---多态
多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接受自己的子类对象. 代码体现 abstract class Animal { public abstract void eat(); } ...
- java学习笔记 --- 继承
继承 (1)定义:把多个类中相同的成员给提取出来定义到一个独立的类中.然后让这多个类和该独立的类产生一个关系, 这多个类就具备了这些内容.这个关系叫继承. (2)Java中如何表示继承呢?格式 ...
- Java学习笔记 抽象类 接口 多态
instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...
- 【Java学习笔记之八】JavaBean中布尔类型使用注意事项
JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类. JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolea ...
随机推荐
- 动态合并Repeater控件数据列 Ver2
前一版本<动态合并Repeater控件数据列>http://www.cnblogs.com/insus/p/3240848.html .今天Insus.NET重新演示它,为什么? 因为两点 ...
- AngularJS(三)——指令实战及自定义指令
前言 上篇介绍了一些指令的应用,本篇介绍一些常用的用法格式. 内容 指令实战 下面通过输入一个名字实现实时更新文本内容. 需要的指令有: ng-app.ng-model.ng-bind.n-init ...
- springboot jpa mongodb 整合mysql Field in required a bean of type that could not be found Failed to load ApplicationContext
1.完整报错 *************************** APPLICATION FAILED TO START *************************** Descripti ...
- linux文件系统相关资料
linux下文件系统通常是通过虚拟文件系统(VFS)蔽下层具体文件系统操作的差异,为上层的操作提供一个统一的接口.文件系统底层都是用系统IO缓存层提供的块读写接口,实现逻辑块到物理块 ...
- (Python OpenGL)【4】Uniform变量 PyOpenGL
(Python OpenGL) 原文:http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html(英文) __author__ = " ...
- P1402 酒店之王 最大流
\(\color{#0066ff}{ 题目描述 }\) XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该 ...
- 洛谷2685 [TJOI2012]桥
[TJOI2012]桥 题目大意:给定一无向图,求删除一条边后1到n最短路的最大值,以及方案数. 做法:我们先从1为起点.从n为起点跑两边dij,获得每一个点到起点1.终点n的最短距离,其实距离和边权 ...
- react 中文文档案例一 (倒计时)
1.函数试组件 import React from 'react'; import ReactDOM from 'react-dom'; function Clock(props){ return( ...
- mysql 字段类型VARCHAR转换成DECIMAL
在我们写代码的实际业务中,有时候实体类用的是String,数据库中自然是VARCHAR类型,但是如果这个实体的属性值放的是数字类型,你查询的时候又需要对它进行排序.sql怎么写呢. 别担心mysql提 ...
- 百度判断手机终端并自动跳转uaredirect.js代码及使用实例
百度siteapp下的一款跳转的产品,使用起来很方便.你可以用这款JS跳转到手机版,也可以跳转到任何你想跳转的位置. js代码如下: function uaredirect(f) { try { if ...