java 的传值,是值调用而非引用调用 (见图片)
抽象关键字abstract不可以和哪些关键字共存?
final:如果方法被抽象,就需要被覆盖而final是不可以被覆盖,所以冲突。
private:如果函数被私有了,子类无法直接访问,怎么覆盖呢?
static:不需要对象,类名就可以调用抽象方法。而调用抽象方法没有意义。
static 详解 :http://blog.csdn.net/chenssy/article/details/13004291
http://blog.csdn.net/wei_zhi/article/details/52767651 也就是说,static后的是定死的,不随变量的变化而变化
http://blog.csdn.net/chenssy/article/details/12786385
指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类
中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用
该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。 也就是说调用父类的方
法,若父类的该方法被子类重写,则调用子类方法,若父类的方法被重载,则调用父类方法,不能调用
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}
public void fun2(){
System.out.println("Wine 的Fun2...");
}
}
public class JNC extends Wine{
/**
* @desc 子类重写父类方法
* 父类中不存在该方法,向上转型后,父类是不能引用该方法的
* @param a
* @return void
*/
public void fun1(String a){
System.out.println("JNC 的 Fun1...");
fun2();
}
/**
* 子类重写父类方法
* 指向子类的父类引用调用fun2时,必定是调用该方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}
public class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
-------------------------------------------------
Output:
Wine 的Fun.....
JNC 的Fun2...
个程序中子类JNC重载了父类Wine的方法fun1(),重写fun2(),而且重载后的fun1(String a)与 fun1()
不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行JNC的Wine类型引用是不
能引用fun1(String a)方法。而子类JNC重写了fun2() ,那么指向JNC的Wine引用会调用JNC中fun2()方
法。
Java实现多态有三个必要条件:继承、重写、向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用
类的方法和子类的方法。
http://blog.csdn.net/changhenshui1990/article/details/69943363?locationNum=5&fps=1
总结
· 有默认实现的方法,使用抽象类
· 实现多重继承,必须使用接口。
· 基本功能频繁变化,使用抽象类。
抽象关键字abstract不可以和哪些关键字共存?
final:如果方法被抽象,就需要被覆盖而final是不可以被覆盖,所以冲突。
private:如果函数被私有了,子类无法直接访问,怎么覆盖呢?
static:不需要对象,类名就可以调用抽象方法。而调用抽象方法没有意义。
static 详解 :http://blog.csdn.net/chenssy/article/details/13004291
http://blog.csdn.net/wei_zhi/article/details/52767651 也就是说,static后的是定死的,不随变量的变化而变化
http://blog.csdn.net/chenssy/article/details/12786385
指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类
中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用
该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。 也就是说调用父类的方
法,若父类的该方法被子类重写,则调用子类方法,若父类的方法被重载,则调用父类方法,不能调用
父类没有的方法。
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}
public void fun2(){
System.out.println("Wine 的Fun2...");
}
}
public class JNC extends Wine{
/**
* @desc 子类重写父类方法
* 父类中不存在该方法,向上转型后,父类是不能引用该方法的
* @param a
* @return void
*/
public void fun1(String a){
System.out.println("JNC 的 Fun1...");
fun2();
}
/**
* 子类重写父类方法
* 指向子类的父类引用调用fun2时,必定是调用该方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}
public class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
-------------------------------------------------
Output:
Wine 的Fun.....
JNC 的Fun2...
个程序中子类JNC重载了父类Wine的方法fun1(),重写fun2(),而且重载后的fun1(String a)与 fun1()
不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行JNC的Wine类型引用是不
能引用fun1(String a)方法。而子类JNC重写了fun2() ,那么指向JNC的Wine引用会调用JNC中fun2()方
法。
Java实现多态有三个必要条件:继承、重写、向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用
类的方法和子类的方法。
http://blog.csdn.net/changhenshui1990/article/details/69943363?locationNum=5&fps=1
总结
· 有默认实现的方法,使用抽象类
· 实现多重继承,必须使用接口。
· 基本功能频繁变化,使用抽象类。