多态
现实事物经常会体现出多种形态,例如猫是动物的一种,则具体的加菲猫,既是猫的一种也是动物的一种,即出现两种形态;
Java中构成多态的三个条件:继承 、重写 、父类引用指向子类对象
多态的种类:
1,普通类的多态
public class Demo1 {
public static void main(String[] args) {
//父类引用指向子类对象
Book1 b = new AndroidBook();
}
}
class Book1{
public static int num =10;
public void read(){
System.out.println("Book");
}
}
class AndroidBook extends Book1{
public static int num = 22;
public void read(){
System.out.println("AndroidBook");
}
public void android(){
System.out.println("android Code");
}
}
2,抽象类的多态
public class DemoInterface {
public static void main(String[] args) {
Book b = new ChineseBook();
b.read();
}
}
abstract Book{
public abstract void read();
}
class ChineseBook extends Book{
public void read() {
// TODO Auto-generated method stub
System.out.println("读汉语");
}
public void chinese(){
System.out.println("汉字");
}
}
3,接口中的多态
public class DemoInterface {
public static void main(String[] args) {
Book b = new ChineseBook();
b.read();
}
}
interface Book{
public abstract void read();
}
class ChineseBook implements Book{
public void read() {
// TODO Auto-generated method stub
System.out.println("读汉语");
}
public void chinese(){
System.out.println("汉字");
}
}
多态中的成员特点:
多态中的成员变量特点:编译看左边(父类),运行看左边(父类)
多态中的成员方法的特点:编译看左边(父类),运行看右边(子类)
多态中的静态方法的特点:编译看左边(父类),运行看左边(父类)注意静态和类相关,不算重写;
public class Demo1 {
public static void main(String[] args) {
Book b = new AndroidBook();
System.out.println(b.num);
b.read();
}
}
class Book{
public static int num =10;
public void read(){
System.out.println("Book");
}
}
class AndroidBook extends Book{
public static int num = 22;
public void read(){
System.out.println("AndroidBook");
}
}
运行结果:
10
AndroidBook
多态中的向上转型和向下转型
向上转型
定义:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
上例中的Book b = new AndroidBook();就是向上转型;
向下转型
定义:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的;
引用类型的向下转型必须现有向上转型,才有向下转型;例如 Book b = new AndroidBook(); AndroidBook ab = (AndroidBook)b;
多态的优缺点:
多态的好处:提高了代码的维护性(由继承性保证)和扩展性(有多态保证);
多态的缺点:不能使用子类特有的属性和行为;如果想使用子类特有的属性和行为,必须强转为子类;
public class Demo1 {
public static void main(String[] args) {
Book b = new AndroidBook;
b.read();
//b.android() 缺点不能调用子类特有的方法
method(new AndroidBook());//只要是Book的子类对象都可以
}
public static void method(Book b){//多态的好处,提高代码的扩展性,这里相当于提供了一种规范
if(b instanceof AndroidBook){
AndroidBook ab = (AndroidBook)b;//多态中如果需要使用子类特有的方法,则必须要强转
ab.android();
}
if(b instanceof IOSBook){
IOSBook ib = (IOSBook)b;
ib.ios();
}
}
}
class Book{
public static int num =10;
public void read(){
System.out.println("Book");
}
}
class IOSBook extends Book{
public void read(){
System.out.println("IOSBook");
}
public void ios(){
System.out.println("IOS code");
}
}
class AndroidBook extends Book{
public static int num = 22;
public void read(){
System.out.println("AndroidBook");
}
public void android(){
System.out.println("android Code");
}
}