java中的静态与多态

静态的概念经常出现在java程序中,系统自带类中的大部分函数是静态函数。
静态static可以用来修饰属性、方法、代码块。在类中static修饰的变量可以被该类创建的所有对象共同使用。
而不用static修饰的只被单个对象使用。前者叫类属性或类方法,后者叫实例属性或实例方法。static不能定义在方法中。

public class javabase {
    static int i=5;

    static {
        i = 10;
        System.out.println("初始化"+i);
    }

    public void updatei(int I){
        this.i=I;
    }

    public void pu2(){
        System.out.println(i);
    }
}

void run2(){
    javabase b1=new javabase();
    javabase b2=new javabase();
    Scanner input2 =new Scanner(System.in);
    b1.updatei(input2.nextInt());
    b2.updatei(input2.nextInt());
    b1.pu2();
    b2.pu2();
}//测试静态变量及方法

在main中运行run2,发现我们new了两个对象只初始化i一次,并且两个对象共用一个i,去用连个对象的方法修改i,发现实际上是同一个i。

下面介绍一下多态,话不多说,先上代码,定义了一个电器类,灯类,电话类,后俩继承电器类,都有电量和充电功能,子类重写了父类的充电功能,毕竟电池容量不一样。

public abstract class Ele {
    private int electri;
    public Ele(){
        electri=50;
    }
    public boolean upele(){
        if(electri==100){
            System.out.println("充电已满");
            return false;
        }
        electri++;
        return true;
     }
public class Light extends Ele{
    int electri;
    public boolean upele(){
        System.out.println("灯泡正在充电");
        if(electri==100){
            System.out.println("充电已满");
            return false;
        }
        electri++;
        return true;
    }
public class Phone extends Ele{
    int electri;
    public boolean upele(){
        System.out.println("手机正在充电");
        if (electri == 200) {
            System.out.println("充电已满");
            return false;
        }
        electri++;
        return true;
    }
    public static void seephone(){
        System.out.println("欢迎使用麻瓜电话");
    }

这是充电这个动作,为不同的电器充电都是充电的动作,我们不能每次有了新电器都去写一个新的充电的动作,充电动作是统一的重写父类的,所以直接调用父类。

public class Oprat{
    public void recharge(Ele ele) {
        ele.upele();
    }
}

在new对象的时候,对象的类型是父类,实际上调用子类的构造。那么再用充电这个动作处理这个对象,实际上处理的是子类的对象。这就体现了java的多态。最终输出灯泡正在充电。

Ele li=new Light();
        Oprat opr=new Oprat();
        opr.recharge(li);

通过上述例子,应该感觉到多态实际上是为了减少开发的工作量设计的,让代码看上去更整洁,一个父类可以对应很多很多的子类,每个子类都可能重写或继承很多个方法。针对重写的这些共性,开发的时候就不管那些子类不同的地方,直接调用父类的方法。

猜你喜欢

转载自blog.csdn.net/dt_zhangshuo/article/details/81131287