JAVA学习day09 JavaSE基础——多态、抽象类、接口

1、多态

  1.1 多态概述

   多态是继封装、继承之后,Java面对对象的第三大特征。Java作为面对对象的语言,可以用来描述一个事物的多种形态。如一个Student类继承了Person类,一个Student类的对象既可以是Student,也可以是Person。
   Java中多态的代码体现在一个子类继承父类后,这个子类的对象(实例化对象)既可以给子类的变量赋值,也可以给这个子类的父类变量赋值。
   多态的目的之一就是子类重写父类方法。

   最终多态的体现为一个父类引用可以指向子类对象。

  1.2 多态的定义格式

  

    父类类型  变量名 = new  子类类型();

代码体现:

public class Person {public void eat(){}
}
public class Student extends Person {@Overridepublic void eat() {System.out.println("学生爱吃炸鸡");}
}
public class Test {public static void main(String[] args) {Student stu = new Student();Person p = new Student();stu.eat();p.eat();}
}

  1.3 多态中的成员访问特点

    ● 成员变量
     编译看左边,运行看左边;
    ● 成员方法
     编译看左边,运行看右边;
    ● 构造方法
     创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化;

看如下代码:

public class Fu {int num = 10;public void show(){System.out.println("fu show");}
}
public class Zi extends Fu {int num = 20;@Overridepublic void show() {System.out.println("zi show");}
}
public class Test {public static void main(String[] args) {Zi zi = new Zi();System.out.println(zi.num);zi.show();Fu fu = new Zi();System.out.println(fu.num);fu.show();}
}

运行结果:

图 1-1 运行结果截图

在上面的测试类中我创建了两个子类的对象,一个用多态的父类引用指向子类对象,也就是多态,另一个是子类自己的引用对象,分别用这两个对象去调用成员变量和成员方法,可以看到在访问成员变量时,编译和运行都看左边,访问成员方法时,编译看左边,运行看右边,所以fu.show() 打印出来是 zi show。

  1.4 多态的好处

   提高了代码的维护性(继承)和扩展性(多态)。

  1.5多态的弊端以及多态中的向上转型和向下转型

   ● 多态的弊端:不能访问子类特有的功能;

   ● 解决弊端:
    把父类的引用类型强制向下转型;向上转型其实就是说的多态;

看下面一段代码:

public class Animal {public void eat(){}public void sleep(){}
}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}@Overridepublic void sleep() {System.out.println("猫白天睡觉");}//子类特有的功能public void catchMouse(){System.out.println("猫抓老鼠");}
}
public class Test {public static void main(String[] args) {Animal an = new Cat();an.eat();an.sleep();// an.catchMouse(); 父类引用不能访问子类特有的功能//向下转型Cat c = (Cat) an;c.catchMouse();}
}

运行结果:

图 1-2 运行结果截图

  1.6 多态中的内存图解

2. 抽象类

  2.1 抽象类的概述

   当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
  当定义了抽象方法的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。

  2.2 抽象类和抽象方法的定义

// 抽象类
public abstract class 类名{//抽象方法public abstract 返回值类型 方法名();
}

  2.3 抽象类的特点

   (1)抽象类和抽象方法都需要被abstract 修饰;抽象方法一定要定义在抽象类中。
   (2)抽象类不能直接创建对象,但抽象类中有构造方法,这是因为子类继承抽象类时在创建对象时用于给父类中的数据进行初始化。
   (3)抽象类要实现实例化需要通过子类的实例化实现。
   (4)抽象类中有抽象方法时,继承它的子类必须重写抽象方法,否则子类也还是抽象类。

  2.5抽象类中的成员特点

   ● 抽象类的成员特点: 成员变量既可以是变量,也可以是常量。 成员方法既可以是抽象的,也可以是非抽象的。

   ● 抽象类的成员方法特性:
    抽象方法强制要求子类重写,非抽象方法子类可以继承。

  2.6 代码练习抽象类

  假如我们在开发一个系统时需要对员工(Employee)类进行设计,员工包含3个属性:姓名、工号以及工资(salary)。
经理(Manager)也是员工,除了含有员工的属性外,另为还有一个奖金(bonus)属性。
然后定义工作的方法.
请使用继承的思想设计出员工类和经理类。

public abstract class Employee {String name;double salary;int jobNumber;public abstract void work();
}
public class Manager extends Employee {int bonus;@Overridepublic void work() {System.out.println("经理在管理员工");}
}
public class Test {public static void main(String[] args) {Employee employee = new Manager();employee.name = "张三";employee.jobNumber = 700;employee.salary = 16000;Manager manager = (Manager) employee;manager.bonus = 3000;System.out.println("经理:"+employee.name+"\r\n"+"工号:"+employee.jobNumber+"\r\n"+"工资:"+employee.salary+"\r\n"+"奖金:"+((Manager) employee).bonus);employee.work();}
}

运行结果:


图 1-3 运行结果截图

3. 接口

  3.1 接口概述

   在Java中,接口可以看做是功能的集合,同样可以看作是比抽象类更抽象的类。
   在接口中,只描述了应该具备的方法,但没有具体的实现,具体的实现由接口的实现类来完成。

  3.2 接口的定义

   与定义类不同,接口定义时需要用到 interface 关键字。

//定义格式
public interface 接口名{抽象方法1;抽象方法2;......
}

   ● 接口中的方法均为公共访问的抽象方法,方法默认修饰符加了 public abstract ;
   ● 接口中无法定义普通的成员变量;接口中成员变量相当于常量,默认修饰符:public static final

  3.3 类与类 ,类与接口, 接口与接口的关系

   类与类:继承关系,只支持单继承,可以多层继承;
   类与接口:实现关系,支持单实现和多实现;并且还可以在继承一个类的同时实现多个接口;
   接口与接口:继承关系,可以单继承和多继承。

  3.4 抽象类和接口的区别
   ● 抽象类:

    成员变量:可以是变量,也可以是常量;
    成员方法:可以是抽象方法,也可以是非抽象方法;
    构造方法:有构造方法;

   ● 接口:

    成员变量:只能是常量;
    成员方法:默认修饰符 public abstract ,只能是抽象方法。

  3.5 接口案例

public interface MyInterface {public abstract void sing();public abstract void jump();public abstract void rap();public abstract void showInformation();
}
public abstract class Person {String name;int age;char sex;public Person(String name, int age, char sex ){this.name = name;this.age = age;this.sex = sex;}public abstract void eat();public abstract void sleep();
}
public class Student extends Person implements MyInterface{public Student(String name, int age, char sex) {super(name, age, sex);}@Overridepublic void eat() {System.out.println(this.name+"爱吃鸡");}@Overridepublic void sleep() {System.out.println(this.name+"睡觉很晚");}@Overridepublic void sing() {System.out.println(this.name+"会唱歌");}@Overridepublic void jump() {System.out.println(this.name+"会跳舞");}@Overridepublic void rap() {System.out.println(this.name+"会rap");}@Overridepublic void showInformation() {System.out.println("姓名:"+this.name+"\r\n"+"年龄:"+this.age+"\r\n"+"性别:"+this.sex);}
}
public class MyTest {public static void main(String[] args) {Student student = new Student("张三",21,'男');student.showInformation();student.eat();student.sleep();student.sing();student.jump();student.rap();}
}

运行结果:

图 1-4 运行结果截图

JavaSE基础——多态、抽象类、接口相关推荐

  1. 继承 多态 抽象类 接口

    面向对象编程 包 继承 组合 多态 抽象类 接口 包 包(package)是组织类的一种方式. 使用包的主要目的是保证类的唯一性. java中已经提供给我们很多现成的类供我们选择,例如可以使用 imp ...

  2. day09 多态抽象类接口

    多态抽象类接口 1:final关键字可以干什么?有什么特点? 2:final关键字的面试题? 3:多态是什么,前提是什么? 4:多态中成员访问的特点? 5:多态的好处及弊端?如何解决多态的弊端? 6: ...

  3. 初始Java Java SE 包,继承,组合,多态,抽象类,接口

    目录 包 1.静态导入 2.将类放到包中 3.包的访问权限控制 继承 基本语法: 注意事项: protected 关键字 final 关键字 组合 多态 向上转型: 动态绑定 方法重写 重写的规则 : ...

  4. Java编程基础10——面向对象_多态抽象类接口

    1.多态的概述及其成员访问特点代码体现 A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提- 1.要有继承关系 2.要有方法重写 3.要有父类引用指向子类对象. C:多态中的成员 ...

  5. JavaSE 多态 抽象类 接口

    day09目录: 多态(动态绑定机制)多态的概述多态的成员访问特点多态的好处和弊端向上转型和向下转型多态内存图 抽象类抽象类的概述抽象类的成员特点抽象类的案例 接口接口的概述接口的成员特点类与类,类与 ...

  6. javaSE各阶段练习题--面向对象-多态-抽象类-接口

    1 (多态)定义榨汁机JuiceMachine 有榨汁方法makeJuice,传入相应的水果.如果传入的是Apple 输出 "流出苹果汁"传入的是Orange 输出 "流 ...

  7. java 多态 接口_从零开始的Java日常: 多态,抽象类,接口

    欢迎关注微博:@小白程序员的日常 欢迎关注微博超话:#小白程序员的日常# 本人目前在自学java,会不间断更新java知识 同为小白或者有大佬可以一起探讨一下 一.多态 1.什么是多态 同一个对象,在 ...

  8. java基础-类-抽象类-接口(自学笔记)

    一.类 class 定义:具有相同属性(特性)和方法(行为)的一类事物 的抽象的总称 例如:人类,动物,车,屌丝类.是一种类别,世界上所有的事物都可以分类,在计算机中java都能进行对应和体现 类的三 ...

  9. java自学 part2 数组 类和对象 包 继承 多态 抽象类 接口

    数组:arr 获取数组的长度:arr.length 数组转字符串: Arrays.toString(arr) 数组的拷贝: Arrays.copyOf(arr,arr.length) 数组的排序:Ar ...

  10. java ee2019 11 5关于多态 抽象类 接口

    1 猫狗案例 多态版(继承版) class Animal{//成员方法private String name ; private int age ;//无参构造public Animal(){}//有 ...

最新文章

  1. Flutter开发之布局-1-Column(15)
  2. springboot 得到端口_带你入门SpringBoot
  3. 对 SAP Spartacus 进行服务器端构建时,编译的资源列表
  4. Detail when click Custom fields tile in s4
  5. arguments.callee()事例 参数检验
  6. [mybatis]映射文件_参数处理_#和$取值区别
  7. 视频干扰的原因及解决方法
  8. Docker Registry 删除镜像并清理
  9. 作者:刘新海(1976-),男,中国人民银行征信中心副研究员
  10. 二进制的科学计数法?白话谈谈计算机如何存储与理解小数:IEEE 754
  11. 二进制文件转成文本保存,并可以读回
  12. visual studio使用小技巧(以vs2012为例)
  13. php100视频教程下载(全集),下载地址链接(整理后包涵解压密码)
  14. 现任明教教主CCNP Security Secure第十一天视频共享
  15. html 数据交互动画,H5交互动画创作平台推荐:爆米兔和木疙瘩
  16. PyQt5 第六章 拖拽和绘画(二)
  17. Chance Gym - 101086L——二进制,素数
  18. 220817笔试(速腾聚创)
  19. 调用模板类出现undefined reference to的情况及解决方案
  20. 企业防病毒体系建设的探讨

热门文章

  1. 001----Mysql隔离级别
  2. JS--微信浏览器复制到剪贴板实现
  3. iOS 最新版 CocoaPods 的安装流程介绍
  4. IIS7的HTTP 500.19错误
  5. 孙鑫VC学习笔记:第十讲画图 创建设置画笔的对话框 并且可以预览效果
  6. android checkbox 选中事件_智慧树知到Android移动应用开发基础章节测试答案
  7. 拓端tecdat|R语言中实现层次聚类模型
  8. 遗传算法的原理与python实现
  9. 1、matplotlib绘制一个简单的图形
  10. 双重差分模型能做固定效应吗_互助问答第213期:模型中的固定效应问题