java之多态性

多态性(Polymorphism):一个东西,在不同的情况下,呈现出不同的行为
两类:
静态多态性:函数重载
void add(int a,int b){}
void add(int a,int b,int c){}
调用:
add(1,2); add(3,4,5);
动态多态性:在面向对象中,父类引用可以指向子类对象
性质:
(1)父类引用能够调用的函数都是子类中的函数
(2)子类中特有的函数对父类不可见

//在面向对象中,父类引用可以指向子类对象
class Dialog{
    void fun1(){  System.out.println("Fun1"); }
    void show(){ System.out.println("父类show");}
}
class FontDialog extends Dialog{
    void fun2(){  System.out.println("Fun2"); }
    void show(){ System.out.println("子类show");}
}
class Main{
    public static void main (String[] args) {
        Dialog d = new FontDialog();//动态多态性的基础
        d.fun1();
        //d.fun2(); 报错
        d.show();
    }

作用:用于两个场合
(1)形参为父类类型,可以传入子类对象做实参
void fun(Dialog d){}
调用:
fun(new FontDialog());//也是对的
举例说明:二次开发
(2)返回类型为父类类型,实际上可以返回子类对象
Dialog fun(){
FontDialog fd=new FontDialog();
return fd;
}

class Window{
    void clickMenu(Dialog d){        d.show();    }
}
class Dialog{     void show(){}         }
class FontDialog extends Dialog{
    void show(){  System.out.println("字体对话框显示"); }
}
//-----------------------------------------------
class MyFontDialog extends Dialog{
    void show(){  System.out.println("漂亮对话框显示"); }
}
class Main{
    public static void main (String[] args) {
        new Window().clickMenu(new MyFontDialog());
    }
}

抽象类——类似于C++中的虚基类
abstract class Dialog{ //抽象类
abstract void show();
}
性质:
(1)抽象类必须用abstract修饰
(2)抽象类中至少含有一个抽象函数
(3)抽象函数必须用abstract修饰,并且没有函数体
(4)抽象函数必须被子类重写,否则报错。除非子类也是抽象类
(5)抽象类不能被实例化,只能实例化其子类对象

abstract class Dialog{ //抽象类
    abstract void show();        
    void fun(){System.out.println("adfadf");}
}
class FontDialog extends Dialog{
    void show(){  System.out.println("字体对话框显示"); }
}
class Main{
    public static void main (String[] args) {
        Dialog d = new FontDialog();
        d.fun();
    }

抽象类中可以有普通函数
Java中还有一种比抽象类还要抽象的“类”,叫做接口(Interface)
只允许有抽象函数,不能有普通函数。

interface Dialog{ //接口
void show(); //默认就是public抽象函数
}
class FontDialog implements Dialog{
public void show(){ System.out.println("字体对话框显示"); }
}
(1)接口用interface修饰
(2)接口中的函数默认为public抽象函数
(3)接口用implements实现,不用extends继承
(4)一个类可以同时实现多个接口,用逗号隔开,但是不可以同时继承多个抽象类

/抽象类中可以有普通函数,Java中还有一种比抽象类
//还要抽象的“类”,叫做接口(Interface),
//只允许有抽象函数,不能有普通函数。

interface Dialog{ //接口
    void show();        //默认就是public抽象函数
}
class FontDialog implements Dialog{
    public void show(){  System.out.println("字体对话框显示"); }
}
class Main{
    public static void main (String[] args) {
        Dialog d = new FontDialog();
        d.show();
    }

如果我们继承多个接口的话呢,如果在继承的过程当中我们遇到了重名 的方法,我们便会遇到错误,这个时候我们便需要一些改动。

interface Dialog1{ //接口
    int show();        //默认就是public抽象函数
    void query();
}
interface Dialog2{ //接口
    void show();        //默认就是public抽象函数
}
class FontDialog implements Dialog1,Dialog2{
    public void show(){  }    
    public int show(int s){ return s; }
    public void query(){}
}
原文地址:https://www.cnblogs.com/chang1203/p/5888680.html