java多态和继承_Java学习--继承与多态
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学习--继承与多态相关推荐
- java 判断object类型_Java学习-方法与多态的学习心得
一 1.什么是方法重写 方法的重写或方法的覆盖(overriding) 子类根据需求对从父类继承的方法进行重新编写 重写时,可以用super.方法的方式来保留父类的方法 构造方法不能被重写 2.方法重 ...
- java 继承 ppt_理论五继承_JAVA学习课件_ppt_大学课件预览_高等教育资讯网
Java 继承 例子:请确认各类之间的关系 plane military plane( 军事) passenger plane ( 客机) cargo plane ( 货物) fighter plan ...
- java多态怎么学_Java学习笔记---多态
在面向对象的程序设计中,多态是继数据抽象和继承之后的第三种基本特性: 多态通过分离做什么(基类对象)和怎么做(导出类对象),从另一角度将接口和实现分离开来.多态不但能够改善代码的组织结构和可读性,还能 ...
- java final与继承_Java 之继承和 final 关键字
继承的概述 继承的特点 super 关键字 函数覆盖 子类的实例化过程 final 关键字 1. 继承的概述 继承是类与类之间的关系. 继承的好处: 提高了代码的复用性 让类与类之间产生了关系, 给第 ...
- java多态的概念_Java基本概念:多态
一.简介 描述: 多态性是面向对象编程中的一个重要特性,主要是用来实现动态联编的.换句话说,就是程序的最终状态只有在执行过程中才被决定,而非在编译期间就决定了.这对于大型系统来说能提高系统的灵活性和扩 ...
- java的图形用户界面_Java学习之GUI(图形用户界面)
一.GUI 概述 1.概述: 1.GUI:Graphical User Interface,即图形用户界面,用于计算机与用户交互的一种方式 2.计算机与用户交互的形式:GUI和CLI GUI: Gra ...
- java基础代码实例_java学习之web基础(3):Servlet 和 Request的登录处理实例
在页面输入用户名和密码,进行权限判断. 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您: 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误. 我们这里使用 ...
- java 判断object类型_Java 类继承机制
封装.继承.多态是面向对象的三大特征,"继承"最主要的目的是为了实现代码的可复用性.通过父类与子类的继承关系,子类继承了父类的成员函数和成员变量,提高了代码的重复利用率.同时,子类 ...
- java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...
访问权限 Java 中有三个访问权限修饰符:private.protected 以及 public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段和方法)加上访问修饰符. 类可见表示其 ...
最新文章
- 详解Android Handler的使用
- 打包跳过编译_Apache Flink v1.9-SNAPSHOT 源码编译
- Android 开发工具类 36_ getSimSerial
- mysql数据库模型生成表_PowerDesigner逆向生成MYSQL数据库表结构总结
- golang实现聊天室(四)
- python3-numpy数组创建的几种方法
- 苹果手机免密支付怎么取消_超市“扫码枪”有啥神奇功能?直接扫走你的资金,不用输入密码|移动支付|手机|免密...
- SQL性能优化常见措施(Lock wait timeout exceeded)
- jquery中ajax加载js和json文件
- Lazyload 延迟加载效果(转载)
- 微型计算机控制技术小论文,微型计算机控制技术结课论文..doc
- python函数调用执行的四个步骤_如何调用python函数
- 游戏开发中的贝塞尔曲线,曲线和路径
- 有关世界上第一台计算机的知识,计算机基础知识 1、世界上第一台电子计算机诞生于 A) 1943年 B) 1946年.doc...
- java xml pull解析_Android App中使用Pull解析XML格式数据的使用示例
- 无人机航测技术的优势有哪些?
- 分享99个PHP源码,总有一款适合您
- 如何关闭苹果手机自动扣费_手机自动扣费?三招教你关闭
- 【笔试面试考点】PreparedStatement和Statement的区别与联系批量插入数据的优化
- 正则匹配数字和字母php,用php与js实现正则匹配数字和字母组合的密码
热门文章
- 发现四川科技馆在线网站修改用户设置页面的一个问题
- SAP Spartacus本地启动时的白屏问题分析
- SAP Fiori应用里出现http request错误的原因分析
- 找不到在标准的SAP C4C system字段里新增entry的办法
- 给JavaScript的单个对象定义属性和属性的元数据
- CRM campaign relationship read
- Controller FioriTest.view.LineItem couldn't be instantiated
- why my SAP UI5 filter by titleID does not work
- 如何使用async和await这对组合设计统一的取Access Token的函数
- Mockito框架学习 - how does expected annotation work