多态

1.引用多态:1)父类的引用可以指向本类的对象;2)父类的引用可以指向子类的对象

public static void main(String[] args) {
        Animal obj1 = new Animal(); //父类的对象指向本类
        Animal obj2 = new Dog(); //父类的引用可以指向子类的对象
        //Dog obj3 = new Animal(); 不可以使用子类的引用指向父类
 }

2.方法多态   1)创建本类对象时,调用的方法为本类方法;2)创建子类对象时,调用的方法为子类重写的方法或者继承的方法

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(); 不可以使用子类的引用指向父类
        obj1.eat();
        obj2.eat();
 }
}

注意:如果是子类中独有的方法,则不能通过“父类的引用指向子类的对象”

3.引用类型转换

1)向上类型转换(隐式/自动类型转换)——小类型到大类型

2)向下类型转换(强制类型转换)——大到小

3)instanceof运算符,解决引用对象类型,避免类型转换的安全问题——判断某个类型是否是某个类型的子类型,返回一个bool值

Dog dog = new dog();
Animal animal = dog;  //自动类型提升  向上转换
Dog dog2 = (Dog)animal; //向下类型转换
Cat cat = (Cat)animal;//强制类型转换Cat,编译器不会报错;但是animal对象在内存中是dog类型,强制转换成cat类型会造成类型不匹配——cat已经不是animal的子类型了
//使用instanceof
Dog dog = new Dog();
  Animal animal = dog;
  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("无法进行类型转换---");
  }

4.Java中的抽象

1)语法定义:使用abstract修饰

2)场景:a)父类只是知道子类包含的方法,无法确切子类的方法如何实现——子类必须有那些方法;b)从多个具有相同特征类中抽象一个抽象类,以抽象类作为子类模版

3)作用:限制规定子类必须实现的某些方法,但不关注实现细节

4)使用规则:a.abstractd 定义抽象方法,只有声明,不需要实现;b.包含抽象方法的类是抽象类;c.抽象类中可以包含普通方法,也可以没有抽象方法;d.抽象类不能直接创建,可以定义引用变量

抽象类:
package com.imooc;
public abstract class Telephone {
 public abstract void call();
 public abstract void message();
}
子类1:
package com.imooc;
public class SmartPhone extends Telephone {
 public void call() {
  // TODO Auto-generated method stub
        System.out.println("通过语音电话");
 }
 public void message() {
  // TODO Auto-generated method stub
  System.out.println("通过语音短信");
 }
}
子类2:
package com.imooc;
public class CellPhone extends Telephone {
 public void call() {
  // TODO Auto-generated method stub
  System.out.println("通过键盘电话");
 }
 public void message() {
  // 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
  Telephone tel = new CellPhone();
  tel.call();
  tel.message();
  Telephone tel2 = new SmartPhone();
  tel2.message();
  tel2.call();
 }
}

5.Java中的接口

1)接口:接口定义了某一些类所遵循的规范,接口不关心类的内部数据,不关心类的方法实现细节,只规定类里必须提供的方法。

2)使用interface关键字,而类用class。接口中都是常量或抽象方法

3)接口用来被继承和被实现的,使用public,不能使用private和protect,interface前面使用abstract,abstract、public static final可以省略 

public abstract interface IPlayGame {

 public static final int a = 8;

 public abstract void playGame(); // 不能  ...playGame(){};

}

注意:接口中方法不能有方法体  例如:错-void gg(){}   对-void gg();

定义接口:
public abstract interface IPlayGame {
 public static final int a = 6;
 public abstract void playGame();
}
继承接口:
public class psp implements IPlayGame {  
 public void playGame() {
  // TODO Auto-generated method stub
  System.out.println("具有玩游戏的功能");
 }
}