多态:
1、引用多态
2、方法多态

引用多态:
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象

public class Animal{
}

public class Cat extends Animal{
}

Animal an = new Animal();
Animal cat = new cat();

方法多态:
创建本类对象时,调用的方法为本类方法
创建子类对象时,调用的方法为子类重写的方法或者
继承的方法。

public class Animal{
  public void move()
  {
    System.out.println("move");
  }

}

//重写父类的方法move
public class Cat extends Animal{
  public void move()
  {
    System.out.println("cat walk");
  }
}

Animal an = new Animal();
Animal cat = new cat();

an.move(); // move

cat.move(); // cat walk
--------------------------------------------------
instanceof关键字
引用类型转换
1、向上类型转换(隐式/自动类型转换),是小类型到大类型的转换。
2、向下类型转换(强制类型转换),是大类型到小类型。(存在风险)

如何避免风险
instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。

Cat cat = new Cat();
Animal animal = cat;//自动类型转换,向上类型转换

Cat cat2 = (Cat)animal;//向下类型转换(强制类型转换)

Dog dog = (Dog)animal;//存在问题!编译时 Dog类型,运行时 Cat类型。

使用 instanceof 来避免上面的问题

if(animal instanceof Dog)
{
  Dog dog = (Dog)animal;
}
else
{
  //输出错误信息
  "无法进行类型转换"
}
-----------------------------------------------------------
抽象类
使用规则:
1、abstract定义抽象类
2、abstract定义抽象方法,只有声明,不需要实现
3、包含抽象方法的类是抽象类
4、抽象类可以包含普通的方法,也可以没有抽象方法。
5、抽象类不能直接创建,可以定义引用。

子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);

抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理; 
子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);

抽象类实际上就比普通类多了一些抽象方法而已,其他组成部分和普通类完全一样; 

 

public abstract class Telphone{
  public abstract void call();
  public abstract void message();
}

子类
public class CellPhone extends Telphone{

  //Override
  public void call()
  {
    //....
  }

  //Override
  public void message()
  {
    //...
  }
}


Telphone tel1 = new CellPhone();
tel1.call();
tel1.message();
----------------------------------------------------
更详细的说明:
http://blog.csdn.net/nvd11/article/details/18888415

接口:
接口可以理解为一种特殊的类,由公共静态常变量成员和公共的抽象方法所组成。

接口定义:和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。

[修饰符] interface 接口名[extends 父接口1,父接口2,...]
{
  零到多个常量定义
  零到多个抽象方法
}
接口就是用来被继承,被实现的,修饰符一般建议用public
注意:不能使用private和protected修饰外部接口

类是单继承的,接口是可以多继承的。

接口,系统会默认加上abstract关键字
接口中的属性是常量,即使定义时不添加public static final修饰符,系统也会自动加上。
不能用protected 或 private 来修饰成员, 否则编译失败.

接口里不能定义构造方法

类里面不能为接口的成员赋值
类继承1个接口的话, 可以使用接口的成员, 但是不能为它们赋值, 因为接口的成员都是常量.

 

接口中的方法只能是抽象方法,即使定义时不添加public abstract修饰符,系统也会自动加上。

使用接口
一个类可以实现一个或多个接口,实现接口使用implements关键字。Java中一个类只能继承一个父类,是
不够灵活的,通过实现多个接口可以做补充。

继承父类实现接口的语法:

[修饰符] class 类名 extends 类名 implements 接口1,接口2,...
{
  //如果继承了抽象类,需要实现继承的抽象方法
  //要实现接口中的抽象方法
}
类如果要继承父类,继承父类必须在实现接口之前。

public abstract interface IPlayGame{
  public abstract void play();
}

public abstract class Telphone{
  public abstract void call();
  public abstract void message();
}


public class CellPhone extends Telphone implements IPlayGame{

  //Override
  public void call()
  {
  }

  //Override
  public void message()
  {
  }

  //Override
  public void play()
  {
  }
}

使用:
Telphone tel1 = new CellPhone();
tel1.call();
tel1.message();

IPlayGame playGame = new CellPhone();
playGame.play();

在接口使用过程当中,还经常与匿名内部类配合使用

匿名内部类就是没有名字的内部类
多用于关注实现而不关注实现类的名称
IPlayGame playGame = new IPlayGame(){
  //Override
  public void play()
  {
    System.out.println("使用匿名内部类的方式实现接口");
  }
};
playGame.play();

还可以:
new IPlayGame(){
  //Override
  public void play()
  {
    System.out.println("使用匿名内部类的方式实现接口");
  }
}.play();

posted on 2018-01-22 13:15  邶风  阅读(263)  评论(0编辑  收藏  举报