多态:
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();