1.何时使用继承

1.1符合 *** is a ***的规则,即双方可以相互依存,亦可保持独立;

1.2可实现代码复用

即当大家的代码块具有相似或类似时,我们可以抽象出一些公共的属性及方法作为父类,子类可以 继承父类而使用这些代码片段。同时也能保持自己的独立性。

2.抽象

2.1定义:

在一段段的继承关系中,可以清晰地形成一座金字塔格式,底部的子类将会越来越强大,因为其继承了上部的多种属性及方法,而越在上部的类就越简单也即越抽象。甚至可追溯到这个父类中的方法无法满足子类,形成了一种抽象方法,含有这种抽象方法的类即为抽象类。

语法如下:

public abstract class 类名 {

}

2.2抽象的特性

抽象类由于过于抽象,将无法实现方法,也即实现也无意义,固抽象类不能实例化。

public abstract class Animal{

private String name;

public void setName(String name){

this.name = name;

}

public String getName(){

return this.name;

}

public Animal(){

}

public Animal(String name){

this.name = name;

}

public void sleep(){

}

}

如果一个方法过于抽象,不能实现,其一定要写在抽象类中,不加方法体,固:

抽象方法一定位于抽象类中;

抽象方法没有方法体;

不过,抽象类中的方法不一定都是抽象方法。

注意:

如果子类继承了抽象类,需对抽象方法做出修改,否则,此子类也必须是抽象子类。

3.final关键字

——final是java语言中的一个关键字,被译为最终的不可改变的

——final修饰的类无法被继承

——final修饰的方法无法被重写

——final修饰的变量一旦被赋值,将不可再次赋值

——final修饰的引用一旦指向某个对象之后,就不能再指向其他对象,所以被final修饰后的引用指向的对象将不会被垃圾回收机制回收。但该对象中的内存可以被修改,因为其修饰的引用是一个地址,地址不能被改变,但其对象中的内容可以改变。

——final修饰的实例变量常常与static一起使用,被称为常量,与static一起使用将有效提高运行效率。

public final class Animal{

}

public class Person extends Animal{

public void sleep(){

System.out.println("闭眼躺着睡觉...");

}

}

3.1思考

静态方法能被继承吗?

静态方法能被重写吗?

静态方法可以被继承,应该说是被默认继承了静态方法,但不能重写,应该说该静态方法被隐藏了。

分析:

1. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在"隐藏"的这种情况。

2. 多态之所以能够实现依赖于继承、接口和重写、重载(继承和重写最为关键)。有了继承和重写就可以实现父类的引用指向不同子类的对象。重写的功能是:"重写"后子类的优先级要高于父类的优先级,但是“隐藏”是没有这个优先级之分的。

3. 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。非静态方法可以被继承和重写,因此可以实现多态。

4.多态

4.1定义:

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。对拓展开放,对修改关闭。

4.2使用多态的好处:

1.消除类型之间的耦合关系

2. 可替换性

3. 可扩充性

4. 接口性

5. 灵活性

6. 简化性

4.3实现步骤:

[1] 编写父类

[2] 编写子类,子类一定要重写/实现父类的方法

[3] 运行时,父类类型 引用 子类对象 (Pet pet = new Dog())

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

4.4多态的实现形式

1.父类类型 引用 子类对象(基于此而延伸)

实例:

// 多态// 同一引用类型Pet pet = null;

// 父类引用 引用 子类对象pet = new Dog("二狗",100,0,"土狗");

// 呈现多态pet.eat();

这里的.eat()的方法,是属于Dog子类中独有的方法,父类将子类的方法引用了过来,完成多态,实现拓展性。

2.父类作为方法的形参实现多态

实例:

public void feed(Pet pet) {

System.out.println(this.getName() + "正在喂" + pet.getName());

pet.eat();

}

Pet作为宠物类的父类,在主人类中被当作了方法的形参,实现了多态。

3.父类作为方法的返回值实现多态

实例:

public Pet adoptPet(int type) {

Pet pet = null;

if(1 == type) {

pet = new Dog();

}else if(2 == type) {

pet = new Penguin();

}else if(3 == type){

pet = new Cat();

}

return pet;

}

4.5存在于多态中的类型转换

在多态实现的过程中一样存在这两种类型转换,即自动类型转换(亦称为向上类型转换)与强制类型转换(向下类型转换)。

自动类型转换:子类可以自动转换为父类。

Pet pet = null;

pet = new Dog();

同样,若想要进行强制类型转换,需要加强制类型转换符。

子类类型 引用 = (子类)父类对象

需要注意的是,如果单纯这样转换,编译不会报错,但在运行过程中将很容易发生运行错误,许多程序员在编码的过程中,很容易将子类类型转换为错误的父类类型,导致父类在调用子类特有的方法时发生找不到方法的可能。所以java为了应对这些问题,创建了 instantceof关键字。

通过instantceof关键字可以判断其转换的类型是否是我们需要的类型,可参考以下格式:

public class TestInstanceOf {

public static void main(String[] args) {

Dog dog = new Dog();

System.out.println(dog instanceof Dog); //trueSystem.out.println(dog instanceof Pet); //trueSystem.out.println(dog instanceof Object); //true}

}

public void play(Pet pet) {

if(pet instanceof Dog) {

Dog dog = (Dog) pet;

dog.catchFlyDisc();

}else if(pet instanceof Penguin) {

Penguin penguin = (Penguin) pet;

penguin.swimming();

}

}

java多态和继承_Java学习--继承与多态相关推荐

  1. java 判断object类型_Java学习-方法与多态的学习心得

    一 1.什么是方法重写 方法的重写或方法的覆盖(overriding) 子类根据需求对从父类继承的方法进行重新编写 重写时,可以用super.方法的方式来保留父类的方法 构造方法不能被重写 2.方法重 ...

  2. java 继承 ppt_理论五继承_JAVA学习课件_ppt_大学课件预览_高等教育资讯网

    Java 继承 例子:请确认各类之间的关系 plane military plane( 军事) passenger plane ( 客机) cargo plane ( 货物) fighter plan ...

  3. java多态怎么学_Java学习笔记---多态

    在面向对象的程序设计中,多态是继数据抽象和继承之后的第三种基本特性: 多态通过分离做什么(基类对象)和怎么做(导出类对象),从另一角度将接口和实现分离开来.多态不但能够改善代码的组织结构和可读性,还能 ...

  4. java final与继承_Java 之继承和 final 关键字

    继承的概述 继承的特点 super 关键字 函数覆盖 子类的实例化过程 final 关键字 1. 继承的概述 继承是类与类之间的关系. 继承的好处: 提高了代码的复用性 让类与类之间产生了关系, 给第 ...

  5. java多态的概念_Java基本概念:多态

    一.简介 描述: 多态性是面向对象编程中的一个重要特性,主要是用来实现动态联编的.换句话说,就是程序的最终状态只有在执行过程中才被决定,而非在编译期间就决定了.这对于大型系统来说能提高系统的灵活性和扩 ...

  6. java的图形用户界面_Java学习之GUI(图形用户界面)

    一.GUI 概述 1.概述: 1.GUI:Graphical User Interface,即图形用户界面,用于计算机与用户交互的一种方式 2.计算机与用户交互的形式:GUI和CLI GUI: Gra ...

  7. java基础代码实例_java学习之web基础(3):Servlet 和 Request的登录处理实例

    在页面输入用户名和密码,进行权限判断. 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您: 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误. 我们这里使用 ...

  8. java 判断object类型_Java 类继承机制

    封装.继承.多态是面向对象的三大特征,"继承"最主要的目的是为了实现代码的可复用性.通过父类与子类的继承关系,子类继承了父类的成员函数和成员变量,提高了代码的重复利用率.同时,子类 ...

  9. java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...

    访问权限 Java 中有三个访问权限修饰符:private.protected 以及 public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段和方法)加上访问修饰符. 类可见表示其 ...

最新文章

  1. 详解Android Handler的使用
  2. 打包跳过编译_Apache Flink v1.9-SNAPSHOT 源码编译
  3. Android 开发工具类 36_ getSimSerial
  4. mysql数据库模型生成表_PowerDesigner逆向生成MYSQL数据库表结构总结
  5. golang实现聊天室(四)
  6. python3-numpy数组创建的几种方法
  7. 苹果手机免密支付怎么取消_超市“扫码枪”有啥神奇功能?直接扫走你的资金,不用输入密码|移动支付|手机|免密...
  8. SQL性能优化常见措施(Lock wait timeout exceeded)
  9. jquery中ajax加载js和json文件
  10. Lazyload 延迟加载效果(转载)
  11. 微型计算机控制技术小论文,微型计算机控制技术结课论文..doc
  12. python函数调用执行的四个步骤_如何调用python函数
  13. 游戏开发中的贝塞尔曲线,曲线和路径
  14. 有关世界上第一台计算机的知识,计算机基础知识 1、世界上第一台电子计算机诞生于 A) 1943年 B) 1946年.doc...
  15. java xml pull解析_Android App中使用Pull解析XML格式数据的使用示例
  16. 无人机航测技术的优势有哪些?
  17. 分享99个PHP源码,总有一款适合您
  18. 如何关闭苹果手机自动扣费_手机自动扣费?三招教你关闭
  19. 【笔试面试考点】PreparedStatement和Statement的区别与联系批量插入数据的优化
  20. 正则匹配数字和字母php,用php与js实现正则匹配数字和字母组合的密码

热门文章

  1. 发现四川科技馆在线网站修改用户设置页面的一个问题
  2. SAP Spartacus本地启动时的白屏问题分析
  3. SAP Fiori应用里出现http request错误的原因分析
  4. 找不到在标准的SAP C4C system字段里新增entry的办法
  5. 给JavaScript的单个对象定义属性和属性的元数据
  6. CRM campaign relationship read
  7. Controller FioriTest.view.LineItem couldn't be instantiated
  8. why my SAP UI5 filter by titleID does not work
  9. 如何使用async和await这对组合设计统一的取Access Token的函数
  10. Mockito框架学习 - how does expected annotation work