Java learning_Day4(下)

本人学习视频用的是马士兵的,也在这里献上

<链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA>

提取码:fobs

内容

  • Object 类
  • 对象转型(casting)
  • 动态绑定和多态(polymorphism)
  • 抽象类

Object 类

  • Object类是所有Java类的根基类
  • 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类

public class Person {
...
}

等价于

public class Person extends Object {
...
}

toString() 方法

  • Object 类中有定义 public String toString() 方法,其返回值是 String 类型,描述当前对象的有关信息。
  • 在进行String与其他类型数据的连接操作时(如:System.out.println("info" + person)),将自动调用该对象类的 toString()方法。
  • 可以根据需要在用户自定义类型中重写 toString() 方法。

equals 方法

  • public boolean equals(Object obj) 方法,提供定义对象是否"相等"的逻辑。
  • Object 的 equals. 方法定义为: x.equals(y) 当 x 和 y 是哦、同一个对象的引用时返回 true 否则返回 false
  • JDK提供的一些类,如String,Date等,重写了Object的equals方法,调用这些类的equals方法, x.equals(y),当 x 和 y 所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回 true 否则返回 false。
  • 可以根据需要在用户自定义类型中重写 equals 方法。

对象转型(casting)

  • 一个基类的引用类型变量可以“指向”其子类的对象。
  • 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。
  • 可以使用引用变量 instanceof 类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。
  • 子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。

以下面程序为例

class Animal {
public String name;
Animal(String name) {
this.name = name;
}
} class Cat extends Animal {
public String eyesColor;
Cat(String name, String color) {
super(name);
eyesColor = color;
}
} class Dog extends Animal {
public String furColor;
Dog(String name, String color) {
super(name);
furColor = color;
}
} public class TestCasting { public static void main(String[] args) {
Animal a = new Animal("name");
Cat c = new Cat("cat name", "blue");
Dog d = new Dog("dog name", "black"); System.out.println(a instanceof Animal); //true
System.out.println(c instanceof Animal); //true
System.out.println(d instanceof Animal); //true
System.out.println(a instanceof Cat); //false Animal a1 = new Dog("dog name", "yellow"); //向上转型
System.out.println(a1.name ); //true
System.out.println(a1 instanceof Animal); //true
System.out.println(a1 instanceof Dog); //true Animal a2 = new Animal("name");
Dog d1 = (Dog)a2; //向下转型,!error
a2 = new Dog("dog name", "yellow");
System.out.println(d1.furColor);
}
}

输出结果

true
true
true
false
dog name
true
true
Exception in thread "main" java.lang.ClassCastException: class Animal cannot be cast to class Dog (Animal and Dog are in unnamed module of loader 'app')

对程序段进行分析

程序段 Animal a1 = new Dog("dog name", "yellow"); 即是向上转型,将父类对象 Animal 转换成子类对象 Dog。转型成功,编译器顺利执行。

而在程序段

Animal a2 = new Animal("name");
Dog d1 = (Dog)a2; //向下转型,!error
a2 = new Dog("dog name", "yellow");
System.out.println(d1.furColor);

此处即是向下转型,在语句 Dog d1 = (Dog)a2; 中,父类对象 Animal 无法直接转换为子类对象 Dog。因为此时 父类对象 Animal 还没有完全拥有子类对象 Dog 的所有属性,必须改为:

Animal a2 = new Animal("name");
a2 = new Dog("dog name", "yellow");
Dog d1 = (Dog)a2; //必须强制转换
System.out.println(d1.furColor); //yellow

此时,向下转型才能编译成功。

动态绑定和多态(polymorphism)

  • 动态绑定是指在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  • 动态绑定的条件:
    1. 要有继承
    2. 子类重写父类方法
    3. 父类引用指向子类对象

以下面程序为例

class Animal {
private String name; Animal(String name) {
this.name = name;
} public void enjoy(){
System.out.println("叫声......");
}
} class Cat extends Animal {
private String eyesColor; Cat(String n,String c) {
super(n);
eyesColor = c;
} public void enjoy() {
System.out.println("猫叫声......");
}
} class Dog extends Animal {
private String furColor; Dog(String n,String c) {
super(n);
furColor = c;
} public void enjoy() {
System.out.println("狗叫声......");
}
} class Lady {
private String name;
private Animal pet; Lady(String name, Animal pet) {
this.name = name;
this.pet = pet;
} public void myPetEnjoy(){
pet.enjoy();
}
} public class TestPoly { public static void main(String args[]){
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
Lady l1 = new Lady("l1",c);
Lady l2 = new Lady("l2",d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
}

输出

猫叫声......
狗叫声......

在上述程序中,程序段

Lady(String name, Animal pet) {
this.name = name;
this.pet = pet;
}

说明Lady类对象拥有类型为 Animal 的 pet,但是输出结果不是 Animal的方法 "叫声......",而是分别输出了其子类对象的方法,这其实就是多态机制的一种体现,在程序执行期间,Lady l1 对象拥有的 pet 为 Cat,因而调用 Cat 的方法;Lady l2 对象拥有的 pet 为 Dog,因而调用 Dog 的方法。

抽象类

  • abstract 关键字来修饰一个类时,这个类叫做抽象类;用 abstract 来修饰一个方法时,该方法叫做抽象方法。
  • 含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
  • 抽象类不能被实例化。
  • 抽象方法只需要声明,不需要实现。

以下面程序为例

abstract class Animal {
private String name; Animal(String name) {
this.name = name;
} public abstract void enjoy();
} class Cat extends Animal {
private String eyesColor; Cat(String n,String c) {
super(n);
eyesColor = c;
} public void enjoy() {
System.out.println("猫叫声......");
}
} class Dog extends Animal {
private String furColor; Dog(String n,String c) {
super(n);
furColor = c;
} public void enjoy() {
System.out.println("狗叫声......");
}
} class Lady {
private String name;
private Animal pet;
Lady(String name,Animal pet) {
this.name = name;
this.pet = pet;
} public void myPetEnjoy() {
pet.enjoy();
}
} public class TestAbstract { public static void main(String args[]){
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
Lady l1 = new Lady("l1",c);
Lady l2 = new Lady("l2",d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
}

父类 Animal 没有去实现 enjoy 方法,而是选择将其声明为 abstract 方法,同时将类本身修饰为 abstract 类,让其子类实现它的方法。

参考资料

Java转型(向上或向下转型)|CSDN

https://blog.csdn.net/shanghui815/article/details/6088588

Java_Day4(下)的更多相关文章

  1. JavaDay3(上)

    Java learning_Day3(上) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA> ...

  2. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  3. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  4. IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法

    直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...

  5. Ubuntu下使用nvm

    写在前面:刚写着写着博客就跨年了,希望新的一年大家万事如意,一切向"前"看! 安装 wget -qO- https://raw.githubusercontent.com/crea ...

  6. Cmder--Windows下命令行利器

    cmder cmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令. 安装包 安装包链接 下载后,直接解压即用. 修改命令提示符λ为 ...

  7. NodeJs在Linux下使用的各种问题

    环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...

  8. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

  9. [APUE]UNIX进程的环境(下)

    一.共享库 共享库使得可执行文件中不再需要包含常用的库函数,而只需在所有进程都可存取的存储区中保存这种库例程的一个副本.程序第一次执行的时候或第一次调用某个库函数的时候,用动态链接方法将程序与共享库函 ...

随机推荐

  1. if-else连用时的陷阱

    近日,在实现<The C  Programing Language>上的一个练习题时,写出了下面一段代码 ; i<=right; i++) { ) ) swap(v, i, ++la ...

  2. 手把手教你快速使用数据可视化BI软件创建互联网用户数据分析大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以互联网用户数据分析大屏为 ...

  3. Oracle Linux下安装Oracle11gR2

    Linux上Oracle11g R2安装及配置 一. 安装环境准备 1.  环境说明 Linux服务器系统:Oracle Linux Release 6 Update 2 (64bit),先安装好. ...

  4. Python和Anoconda和Pycharm安装教程

    简介 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发. ...

  5. 探究Redis两种持久化方式下的数据恢复

    对长期奋战在一线的后端开发人员来说,都知道redis有两种持久化方式RDB和AOF,虽说大家都知道这两种方式大概运作方式,但想必有实操的人不会太多. 这里是自己实操两种持久化方式的一点点记录. 先看以 ...

  6. Leetcode 与树(TreeNode )相关的题解测试工具函数总结

    最近在剑指Offer上刷了一些题目,发现涉及到数据结构类的题目,如果想在本地IDE进行测试,除了完成题目要求的算法外,还需要写一些辅助函数,比如树的创建,遍历等,由于这些函数平时用到的地方比较多,并且 ...

  7. Auto-Encoder(自编码器)原理

    1.无监督学习 无监督学习和监督学习是机器学习的两个方向,监督学习主要适用于已经标注好的数据集(如mnist分类问题),无监督学习则是希望计算机完成复杂的标注任务,简单的解释就是——教机器自己学习,它 ...

  8. MySQL基础篇(02):从五个维度出发,审视表结构设计

    本文源码:GitHub·点这里 || GitEE·点这里 一.数据场景 1.表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的 ...

  9. Linux下搭建asp.net运行环境

    最近有个项目,是在Windows平台下开发的,需要把 asp.net web应用移植到 CentOS下,甚是头疼: 翻阅资料,发现Jexus是个可行的方案,下面是官方对Jexus的定义: 什么是Jex ...

  10. html font后面跟多种字体

    例子 body,div,dl,dt,dd,li,h1,h2,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td { margin: 0; pa ...