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学习笔记--继承和多态(中)的更多相关文章

  1. Java学习笔记--继承和多态(下)

    1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...

  2. Java学习笔记--继承和多态(上)

    1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...

  3. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  4. Java学习笔记——继承、接口、多态

    浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...

  5. Java学习笔记---继承和super的用法

    自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了. 不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了. 继 ...

  6. Java学习笔记(十一)面向对象---多态

    多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接受自己的子类对象. 代码体现 abstract class Animal { public abstract void eat(); } ...

  7. java学习笔记 --- 继承

    继承 (1)定义:把多个类中相同的成员给提取出来定义到一个独立的类中.然后让这多个类和该独立的类产生一个关系,    这多个类就具备了这些内容.这个关系叫继承.  (2)Java中如何表示继承呢?格式 ...

  8. Java学习笔记 抽象类 接口 多态

    instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...

  9. 【Java学习笔记之八】JavaBean中布尔类型使用注意事项

    JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类. JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolea ...

随机推荐

  1. Python lib库docker-py和docker的区别

    1)两者的安装方式 pip install docker A Python library for the Docker Engine API pip install docker-py A Pyth ...

  2. UIApplication直接应用

    /************ 当程序载入后执行,应用程序启动入口 *****************************/ - (BOOL)application:(UIApplication *) ...

  3. 循环队列(Joseplus Problem)

    #include <iostream> #include <stdio.h> using namespace std; ]; ; void Enqueue(int x) { ) ...

  4. 对接ebay,订单系统开发

    要求,从ebay 下载的 csv文件,导入销售订单的系统,成为自己的订单. 首先,上传文件. 第二步,将上传的csv读入系统的一个变量 根据','来分割成一个数组 $str = file_get_co ...

  5. loj #2044. 「CQOI2016」手机号码

    #2044. 「CQOI2016」手机号码 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  6. sql开发技巧总结-2

    ---恢复内容开始--- 1.如何进行行列转换 需求: 列转换成行 select a.`user_name`,sum(b.kills) from user1 a join user_kills b o ...

  7. CSS之字体样式

    css字体样式 font-size:字号大小 font-size属性用于设置字号,该属性的值可以使用相对长度单位,也可以使用绝对长度单位.其中,相对长度单位比较常用,推荐使用像素单位px,绝对单位使用 ...

  8. DB2存储过程标准

    CREATE OR REPLACE PROCEDURE "FCT"."PROC_FCT_DSB_SERIES"(IN ACCOUNTING_DATE DATE) ...

  9. luogu4449 于神之怒加强版(莫比乌斯反演)

    link 给定n,m,k,计算\(\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^k\)对1000000007取模的结果 多组数据,T<=2000,1<=N,M,K&l ...

  10. git ssh密钥的使用

    //配置邮箱,用户名, git config --global user.name git config --global user.email git config --global --list ...