多态成立的三个条件 1.继承 2.子类重写父类方法 3.父类引用指向子类对象 例: class A { void fun(){} }class B extends A { //继承 void fun(){ //重写父类方法 System.out.println("supClass"); } }class Test { public staic void main(Strings[] args){ A a = new B(); //父类引用指向子类对象 a.fun(); //多态 } }在编译时无法确定是执行A里面的方法还是B里面的方法,只有在运行时才能确定执行的方法。
一个函数是不是static的,还不是很清楚的事情吗,另外非final private的函数,都是virtual函数。
你说好编译不?
{
public String sayHello();
}
package asmTest;public class MyClass implements MyInterface
{
public String sayHello()
{
return "Hello!";
}
public static void main(String[] args)
{
MyClass c = new MyClass();
c.sayHello();
}
}
{
public void printf();
}class ChildB
{
public void printf()
{
// to do
}
}class ChildB
{
void printf()
{
// to do
}
建议楼主去看下 thinking in Java
那里边比较仔细
father f=new son()
详见任意一本java书。
【多态的官方定义是: 多态(Polymorphism)是面向对象技术的核心概念,按字面意思就是“多种形状”。Java语言的多态不是一个独立特性,其优越性体现在类的继承、使用接口等多方面,同时也使人感觉较难理解。理清与多态有关的概念,有助于在程序设计中正确实现多态】简单的说就是方法的重写Overriding和重载Overloading是Java多态性的不同表现;(需要你好好看看Overriding,与Overloading我在这儿就不说了)需要注意的是:
当父类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。将子类对象赋值给父类对象,所得到对象是这样的一个对象:
它是一个编译是为父类对象,但运行却是一个子类对象,具体特征如下.
1.被声明为父类对象
2.拥有父类属性
3.占用子类的内存空间
4.子类方法覆盖父类的方法时,此时对象调用的是子类的方法;否则,自动调用继承父类的方法. 多态的目的
通过类型转换,把一个对象当作它的基类对象对待。
从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理。
这些不同派生类的对象响应同一个方法时的行为是有所差别的,这正是这些相似的类之间彼此区别的不同之处。
当然还有继承多态,接口多态···涉及太广了,你自己找本书系统化一下
JAVA中,除了final和static方法,其他所有的方法都是动态绑定的。这也给多态机制提供了条件。
多态的实现,就是运行时由JVM自动的根据对象引用来选择正确的方法体。
多态的实现有两种方式:覆盖和重载。上面已经讲的很清楚了,这里不赘述了。
x.invoke();x是不同的,但是属于一个派生系
invoke形式是相同的,但实现不同
具体定位到哪个实现是由x的本质决定的
这对jvm来说x是什么是非常清楚的 动态加载、动态绑定
代码都在那了
1.继承
2.子类重写父类方法
3.父类引用指向子类对象
例:
class A {
void fun(){}
}class B extends A { //继承
void fun(){ //重写父类方法
System.out.println("supClass");
}
}class Test {
public staic void main(Strings[] args){
A a = new B(); //父类引用指向子类对象
a.fun(); //多态
}
}在编译时无法确定是执行A里面的方法还是B里面的方法,只有在运行时才能确定执行的方法。