鱼C论坛

 找回密码
 立即注册
查看: 2480|回复: 0

[学习笔记] Java暑期学习Day16

[复制链接]
发表于 2017-7-20 21:45:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 马太效应 于 2017-7-20 23:30 编辑
[/pre]
今天是第16天,千里之行始于足下


[img]static/image/hrline/line7.png[/img]

OOP三大特性之继承

[b]  A:[/b]
  a.继承背后的思想就是基于已存在的类来构建新类。
  b.当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求。
  c.约定:从其他类导出的类叫子类,被导出的类叫父类。
  d.在Java中,除了Object类之外,所有类都是子类,都有唯一的父类。

[b]B:[/b]
1.创建一个类时,总是在继承
2.继承在OO中不可或缺
3.类之间的关系
  a. [b]is-a[/b]  [b]继承[/b]体现
  b. Has-a 组合体现
  c. Like-a 实现接口体现

[b]C:继承的特点[/b]
1:子类继承了父类的成员
2:具有层次结构


[b]D:继承的优点[/b]
1.代码重用
2.父类字段和方法可用于子类
3.从抽象到具体形成类的继承体系
4.可轻松自定义子类


[pre]package role;

public class Role {
        private String name;
        private int level;
        private int blood;
        
        public int getBlood(){
                return blood;
        }
        public void setBlood(int blood){
                 this.blood=blood;
        }
        public int getLevel(){
                return level;
        }
        public void setLevel(int level){
                 this.level=level;
        }
        public String getName(){
                return name;
        }
        public void setName(String name){
                this.name=name;
        }
        

}
  这是为了避免多个类间重复定义共同行为。


package role;

public class SwordsMan extends Role{

        public void fight(){
                System.out.println("打架狂人");
        }

}

  在java中,继承时使用extends关键字,private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(如果父类愿意提供方法的话)。


<font size="5">package role;

public class Magician extends Role {

        public void fight(){
                System.out.println("魔法攻击");
        }
        
        public void cure(){
                System.out.println("魔法治疗");
        }
        
        
}</font>
  
  Magician继承了Role的行为,再扩充了Role原本没有的fight()与cure()行为。

<font size="5">package role;

public class RPG {

        public static void main(String[] args) {

                SwordsMan swordsman = new SwordsMan();
                swordsman.setName("大白");
                swordsman.setLevel(1);
                swordsman.setBlood(222);

                Magician magician = new Magician();
                magician.setName("小黑");
                magician.setLevel(2);
                magician.setBlood(666);

                showBlood(swordsman);
                showBlood(magician);

        }

        static void showBlood(Role role) {
                System.out.printf("%s 血量 %d%n", role.getName(), role.getBlood());
        }

}</font>
结果是:
大白 血量 222
小黑 血量 666




以上使用的都是符合is-a原则
SwordsMan swordsman = new SwordsMan();
Role role=swordsman; (编译成功,swordsman是一种Role)


//告诉编译程序要让Role扮演SwordsMan,以下这行通过编译
SwordsMan swordsman2= (SwordsMan) role;//Role参考SwordMan实例,执行成功


Magician magician2=(Magician) role;//通过编译,但执行失败


报错:Exception in thread "main" java.lang.ClassCastException: role.SwordsMan cannot be cast to role.Magician


super关键字
A.特点
1.super和this关键字的特点类似:super代表的是父类对象的引用


   2.当子父类的成员出现同名时,可以通过super来进行区分


   3.子类的构造方法中,通过super关键字调用父类的构造方法
    (当构造一个子类对象的时候一定会先调用父类的构造方法来构造父类的对象。
         调用父类构造方法的语句必须是子类构造方法中的第一条指令。)

  


评分

参与人数 1鱼币 +6 收起 理由
小甲鱼 + 6

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-20 20:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表