抽象类
使用abstract修饰的类为抽象类
1.抽象类无法实例化,因为其中的抽象方法未实现,而继承它的子类必须实现父类所有的抽象方法
2.可以包含abstract修饰的抽象方法,也可以有无abstract的非抽象方法
package over; public abstract class fruit { String name="fruit"; int value; fruit(){} fruit(String name, int value) { this.name = name; this.value = value; } public void tellName(){ System.out.println("father::I am "+name+"!"); }; public abstract void tellPrice(); public void say(){ System.out.println("hello fruit!"); } }
抽象类子类
必须实现父类的抽象方法
package over; public class apple extends fruit { private int size; public apple(){}; public apple(String name,int value,int size){ super(name,value); this.size=size; }; //实现父类抽象方法 @Override public void tellPrice() { System.out.println("I am worth "+value); } }
重写父类的非抽象方法与子类私有而父类没有的方法
package over; public class apple extends fruit { private int size; public apple(){}; public apple(String name,int value,int size){ super(name,value); this.size=size; }; //实现父类抽象方法 @Override public void tellPrice() { System.out.println("I am worth "+value); } //重写父类方法 public void tellName(){ System.out.println("child::This is "+name); } //子类私有而父类没有的方法 public void tellSize(){ System.out.println("My size is"+size); } }
多态,向上转型
通过父类引用实例化的子类
fruit apple1=new apple("apple",10,1);
该引用所使用的方法父类都必须要有,在父类中找到后再从子类中查找,子类中有则使用,没有则使用父类自己实现的方法
测试
package over; public class test { public static void main(String argv[]){ fruit apple1=new apple("apple",10,1); //调用抽象方法 apple1.tellPrice(); //调用子类覆盖重写的方法 apple1.tellName(); //调用子类没有而父类有的方法 apple1.say(); } }
子类中有而父类中没有的方法该引用是无法调用的
面试考点
1.覆盖与重载
-
覆盖(Override)存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法;
-
重载(Overload)存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其它都相同不算是重载。
2.多态
概念:类引用对象的具体类型与它调用的具体方法在编程时是不确定的,而在程序运行的时候才会被确定
条件:继承,重写,向上转型
优点:可以实现不修改程序代码,却能改变引用所绑定的具体对象与其具体方法;例如输入1234来确定将fruit绑定苹果还是香蕉还是其他水果;可扩充性:将来要新增一个子类,不用对父类与其他子类做出修改,降低了耦合性
缺点:子类的私有属性与方法引用是无法使用的