乐趣区

关于java:静态绑定和动态绑定

绑定
绑定就是一个办法的调用与调用这个办法的类连贯在一起的过程被称为绑定。

绑定次要分为两种:

动态绑定 和 动静绑定

绑定的其余叫法

动态绑定 == 后期绑定 == 编译时绑定

动静绑定 == 前期绑定 == 运行时绑定

为了不便辨别:上面对立称说为动态绑定和动静绑定

动态绑定
在程序运行前,也就是编译期间 JVM 就可能确定办法由谁调用,这种机制称为动态绑定

辨认动态绑定的三个关键字以及各自的了解

如果一个办法由 private、static、final 任意一个关键字所润饰,那么这个办法是后期绑定的

构造方法也是后期绑定

private:private 关键字是公有的意思,如果被 private 润饰的办法是无奈由本类之外的其余类所调用的,也就是本类所特有的办法,所以也就由编译器辨认此办法是属于哪个类的

public class Person {

private String talk;

private String canTalk(){return talk;}

}

class Animal{

public static void main(String[] args) {Person p = new Person();
    // private 润饰的办法是 Person 类独有的,所以 Animal 类无法访问(动物原本就不能谈话)

// p.canTalk();

}

}
final:final 润饰的办法不能被重写,然而能够由子类进行调用,如果将办法申明为 final 能够无效的敞开动静绑定

public class Fruit {

private String fruitName;

final String eatingFruit(String name){System.out.println("eating" + name);
    return fruitName;
}

}

class Apple extends Fruit{

  // 不能重写 final 办法,eatingFruit 办法只属于 Fruit 类,Apple 类无奈调用

// String eatingFruit(String name){
// super.eatingFruit(name);
// }

String eatingApple(String name){return super.eatingFruit(name);
}

}
static:static 润饰的办法比拟非凡,不必通过 new 出某个类来调用,由类名. 变量名间接调用该办法,这个就很要害了,new 很要害,也能够认为是开启多态的导火索,而由类名. 变量名间接调用的话,此时的类名是确定的,并不会产生多态,如下代码:

public class SuperClass {

public static void sayHello(){System.out.println("由 superClass 说你好");
}

}

public class SubClass extends SuperClass{

public static void sayHello(){System.out.println("由 SubClass 说你好");
}

public static void main(String[] args) {SuperClass.sayHello();
    SubClass.sayHello();}

}

退出移动版