MOOC +《JAVA入门第二季》+ 第4章 多态
目录
4-1 Java中的多态
1)引用多态
父类的引用可以指向本类的对象;
父类的引用可以指向子类的对象;
2)方法多态
创建本类对象时,调用的方法为本类方法;
创建子类对象时,调用的方法为子类重写的方法或者继承的方法;
例子:
package com.imooc;
//Dog和Cat继承于Animal。Dog中重写了eat方法,Cat没有
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
//父类引用可以指向本类对象
Animal obj1 = new Animal();
//父类引用可以指向子类对象
Animal obj2 = new Dog();
//Dog obj3 = new Animal(); //错误
Animal obj3 = new Cat();
//创建本类对象时,调用的方法是本类方法
obj1.eat();
//创建子类对象时,调用的方法是子类重写的方法或继承的方法
obj2.eat();
obj3.eat();
}
}
4-2 多态中的引用类型转换
1)向上类型转换(隐式/自动类型转换),是小类型到大类型的转换
2)向下类型转换(强制类型转换),是大类型到小类型,有风险
3)instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题
例子:
package com.imooc;
//Dog和Cat继承于Animal。Dog中重写了eat方法,Cat没有
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog dog = new Dog();
Animal animal = dog; //向上类型转换,自动
//Dog dog2 = (Dog)animal; //向下类型转换,强制
//Cat cat = (Cat)animal; //编译时不报错,但运行时报错
//可用instanceof运算符进行改进
if(animal instanceof Dog) {
Dog dog2 = (Dog)animal;
}else {
System.out.println("无法类型转换为Dog");
}
if(animal instanceof Cat) {
Cat cat = (Cat)animal;
}else {
System.out.println("无法类型转换为Cat");
}
}
}
4-3 Java中的抽象类
1.语法定义
抽象类前使用abstract关键字修饰,则该类为抽象类。
2.应用场景
1)在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法;
2)从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
3.作用
限制规定子类必须实现某些方法,但不关注实现细节。
4.使用规则
1)abstract定义抽象类;
2)abstract定义抽象方法,只有声明,不需要实现;
3)包含抽象方法的类是抽象类;
4)抽象类中可以包含普通的方法,也可以没有抽象方法;
5)抽象类不能直接创建,可以定义引用变量。
例子:
package com.imooc;
//创建抽象类
public abstract class Telphone {
public abstract void call();
public abstract void message();
}
package com.imooc;
//子类Cellphone
public class Cellphone extends Telphone {
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("通过键盘打电话");
}
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通过键盘发消息");
}
}
package com.imooc;
//子类Smartphone
public class Smartphone extends Telphone {
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("通过语音打电话");
}
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通过语音发消息");
}
}
package com.imooc;
//Cellphone和Smartphone继承于抽象类Telphone
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Telphone tel1 = new Cellphone();
tel1.call();
tel1.message();
Telphone tel2 = new Smartphone();
tel2.call();
tel2.message();
}
}
输出结果:
通过键盘打电话
通过键盘发消息
通过语音打电话
通过语音发消息
4-5 Java中的接口
1.接口概念
类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。
2.接口定义
和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。
基本语法:
[修饰符] interface 接口名 [extends 父接口1,父接口2···]
{
零到多个常量定义···
零到多个抽象方法的定义···
}
注:
1)修饰符:接口就是用来被继承、被实现的,修饰符一般建议用public,不能用private和protected修饰接口;
2)常量:接口中的属性是常量,即使定义时不添加public static final修饰符,系统也会自动加上;
3)方法:接口中的方法只能是抽象方法,即使定义时不添加public abstract修饰符,系统也会自动加上。
3.使用接口
一个类可以实现一个或多个接口,实现接口使用implements关键字。Java中一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以做补充。
继承父类实现接口的语法为:
[修饰符] class 类名 extends 父类 implements 接口1,接口2···
{
类体部分 //如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。
}
//若要继承父类,继承父类必须在实现接口之前
例子:
package com.imooc;
//创建抽象类
public abstract class Telphone {
public abstract void call();
public abstract void message();
}
package com.imooc;
//创建接口IPlayGame
//给接口命名时,常在前面加上“I”,表示为接口
public interface IPlayGame {
public void playGame();
}
package com.imooc;
//创建子类Smartphone,继承父类并实现接口IPlayGame
public class Smartphone extends Telphone implements IPlayGame{
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("通过语音打电话");
}
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通过语音发消息");
}
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println("具有了玩游戏的功能");
}
}
package com.imooc;
//创建另一个子类Psp,实现接口IPlayGame
public class Psp implements IPlayGame {
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println("具有了玩游戏的功能");
}
}
package com.imooc;
//主程序
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
IPlayGame ip1 = new Smartphone();
IPlayGame ip2 = new Psp();
ip1.playGame();
ip2.playGame();
}
}
4-7 UML简介
1.UML概念
Unified Modeling Language(UML)又称统一建模语言或标准建模语言。
是一个支持模型化和软件系统开发的图形化语言。
2.UML图示
UML2.2中一共定义了14种图示(diagrams)。
3.常用UML图
1)用例图(The Use Case Diagram)
用例图能够以可视化的方式,表达系统如何满足所收集的业务规则,以及特定的用户需求等信息。
2)序列图(The Sequence Diagram)
序列图用于按照交互发生的一系列顺序,显示对象之间的这些交互。
3)类图(The Class Diagram)
UML类图、业务逻辑和所有支持结构一同被用于定义全部的代码结构。
4.UML建模工具
使用PowerDesigner设计实例:
PS:可以自动生成Java框架代码。