java入门之面向对象4
来源:互联网 发布:经纬度换算坐标软件 编辑:程序博客网 时间:2024/05/29 17:37
多态
多态的规则
多态的规则(前提):
1类与类之间要建立关系 建立继承的关系
2.必须要有方法重写
3.父类的指针(引用) 指向 子类的对象(空间)
需求:创建 动物类 猫类 狗类
都有一个吃的方法 动物类 吃
猫 猫吃鱼
狗 狗吃骨头
public class Demo01 { private void mian() { // 本类的引用(指针) 指向子类对象(空间) // 比如 猫是一只动物(不能是 动物是一只猫) Cat c = new Cat(); c.eat(); // 父类的引用(指针) 指向 子类的对象(空间) Animal a = new Cat(); a.eat(); Animal ad = new Dog(); ad.eat(); Math.random(); }}class Animal{ public void eat() { System.out.println("吃饭"); }}class Cat extends Animal{ public void eat(){ System.out.println("猫吃鱼"); }}class Dog extends Animal{ public void eat() { System.out.println("狗吃骨头"); }}
多态 成员变量 成员方法如何调用
多态时 成员变量如何调用的?
多态时 当父类引用 调用成员变量
编译需要看父类中有没有这个成员变量 没有编译不会通过
运行 访问的就是父类中的这个成员变量
编译 和 运行 父类访问成员变量看父类(看父类)
思考:Son s = new Son();
s.num 打印的是什么 在内存中如何表现
多态时 如何访问成员方法?
多态调用 成员方法时
编译时 看父类中有没有这个方法 没有 就报错
运行时 运行 运行子类的这个方法
多态调用成员方法时
编译看父类
运行看子类
public class Demo02 { public static void main(String[] args) { Father f = new Son(); f.speak(); System.out.println(f.num);//值是 10 Son son = new Son(); System.out.println(son.num);值是 20 }}class Father{ int num = 10; public void speak() { System.out.println("Father 说"); }}class Son extends Father{ int num = 20; public void speak() { System.out.println("Son 说"); }}
多态 利 与 弊
多态
好处:
1.增强代码可以维护性(建立在继承的基础上)
2.增强方法的可扩展性(核心)
弊端:
不能调用直接调用子类特殊方法
public class Demo03 {
public static void main(String[] args) {
// 父类引用指向子类对象
// 骗子 提升逼格 向上转型
Person p = new Lie();
//骗子调用自己的方法 对你洗脑
p.speak();
//向下转型
//注意 :如果你要向下转型 必须之前有过向上转型
Lie l = (Lie)p;
l.Hit();
int num = 10; byte b = 5; num = b;//自动类型 提升转换 int a =(int)b; // 强制转换}
}
class Person{
public void speak() { System.out.println("人说 聊天");}
}
class Lie extends Person{
@Override
public void speak() {
// TODO Auto-generated method stub
System.out.println(“骗子说 洗脑”);
}
public void Hit() {
System.out.println(“骗子打人 威胁人”);
}
}
举一个 例子
需求:
武器类 打 挥舞武器
刀 打 挥舞刀 —砍人
练功 —-练刀
剑类 打 挥剑—–刺人
练功 耍剑
public class Demo04 { public static void main(String[] args) { fun(new Blade()); fun(new Sword()); } public static void fun(Weapon w) { w.hit(); //判断 传进来的参数 是哪个类的 //可以判断 是否属于 那个类的对象 // w 是否 属于 到累对象 if (w instanceof Blade) { //向下转型 成刀 Blade dao = (Blade)w; dao.pratice(); }else if (w instanceof Sword) { Sword sword = (Sword)w; sword.pratice(); } }}class Weapon{ public void hit() { System.out.println("挥舞武器"); }}class Blade extends Weapon{ public void hit() { System.out.println("挥舞刀——————打人"); } public void pratice() { System.out.println("练刀"); }}class Sword extends Weapon{ @Override public void hit() { // TODO Auto-generated method stub System.out.println("挥舞剑————————刺人"); } public void pratice() { System.out.println("耍剑"); }}
- java入门之面向对象4
- 《java入门第一季》之面向对象
- Java面向对象入门
- Java面向对象入门
- Java 面向对象入门
- 《java入门第一季》之面向对象(匿名对象)
- Java 入门之开始面向对象的编程
- Java 入门之开始面向对象的编程
- java基础入门之五(面向对象+this)
- 黑马程序员--Java入门之面向对象的理解
- JavaSE入门学习13:Java面向对象之封装
- JavaSE入门学习15:Java面向对象之继承
- JavaSE入门学习17:Java面向对象之package(包)
- JavaSE入门学习19:Java面向对象之抽象类
- JavaSE入门学习22:Java面向对象之final关键字
- JavaSE入门学习23:Java面向对象之构造方法
- 《java入门第一季》之面向对象this关键字
- 《java入门第一季》之面向对象(构造方法)
- TCP/IP协议栈与数据报封装 (802.3 Ethernet 以太网 802.11 WLAN 无线网 )
- tomcat端口冲突
- virtualbox虚拟机下 Win7开启 host-only
- Java日期类
- QT模拟鼠标事件
- java入门之面向对象4
- xml解析之dom解析
- MYSQL
- shell脚本实现自动保留最近n次备份记录
- [HAOI2006]受欢迎的牛 Tarjan缩点
- windows下创建ftp服务
- Sqoop将MySQL中数据导入到Hive表中
- box-shadow在ios下没有显示
- Android驱动入门-Led控制+app+ndk库+底层驱动