马太效应 发表于 2017-7-24 21:26:01

Java暑期学习Day20

本帖最后由 马太效应 于 2017-7-24 22:04 编辑

今天是第20天,论注意身体的重要性{:10_269:} {:10_266:}{:10_266:},今天就把昨天写了又被卡掉的补上,再整理下之前敲的代码好了T T

static/image/hrline/4.gif


①对象上下转型
1.向上转型:由子类转型为父类(继承图上向上移动),不需要强制转换,总是安全的。
               <可能丢失方法,不会获取方法>


2.向下转型:与向上转型相反,不安全,需要强制转换。
                  (可能需要instanceof操作符协助)

语法:boolean result=object instanceof class 。
         运算符instanceof通过返回一个boolean类型的值,用来判断Obect 是否是class类型的。


3.LSP(liskov替换原则):子类型必须能够替换掉它们的基类型
            
4.在敲代码时的发现:
如果父类定义了一个有参的构造器,那么子类也要定义一个有参的构造器,且要在第一行书写super(...);
如果父类既定义了有参的构造器,也定义了无参的构造器,那么子类会默认调用父类的无参构造器,意思就是不用自己再定义有参的构造器。
如果父类没有定义构造器,那父类和子类调用的都是系统默认的无参构造器。

5.辅助理解代码

package ploymorphism;

public class AnimalDemo {
      public static void main(String[] args) {
       //父类的引用变量可以引用其子类对象
               
                Animal ani1= new Dog("旺旺"); //向上转型
               
                //向上转型是安全的,但可能会导致子类方法的丢失
               
                //父类的引用变量只能调用父类中有的方法或子类重写的方法
                ani1.eat();
                //ani1.sleep(); The method sleep() is undefined for the type Animal
               
                Animal ani2 = new Cat("招福猫");
                ani2.eat();

                //向下转型是不安全的
               //Cat cat=(Cat)ani1;   java.lang.ClassCastException
                if (ani2 instanceof Cat){
                        System.out.println("注意身体");
                        Cat cat=(Cat)ani2;
                        cat.sleep();
                }
               
      }
}

class Animal {
      private String name;

      public Animal(String name) {
                this.name = name;
      }

      // 这是一个通用方法,由子类去实现
      public void eat() {

      }

}

class Dog extends Animal {

      public Dog(String name) {
                super(name);
      }
@Override
      // 对父类的方法进行重写
      public void eat() {
                System.out.println("爱吃骨头的汪");
      }
public void sleep() {
      System.out.println("爱睡懒觉的汪");
}
}

class Cat extends Animal {

      public Cat(String name) {
                super(name);
      }

      // 对父类的方法进行重写
      public void eat() {
                System.out.println("爱吃罐头的喵");
      }
      public void sleep() {
                System.out.println("爱睡懒觉的猫唔");
      }
}


结果是——
爱吃骨头的汪
爱吃罐头的喵
注意身体
爱睡懒觉的猫唔

页: [1]
查看完整版本: Java暑期学习Day20