继承
继承的好处是代码复用。继承的子类自动拥有父类中的所有属性和方法。所以继承已存在的类就是复用这些类的方法和域。在此基础上,子类还可以添加一些新的方法和域,以满足新的需求。
直接上例子:
//父类
public class Father {
public void doSome1(){
System.out.println("父类doSome1");
}
public void doSome2(){
System.out.println("父类doSome2");
}
}
//子类
public class Son extends Father{
@Override
public void doSome1() {
System.out.println("子类重写doSome1");
}
public void doOther(){
System.out.println("子类doOther");
}
}
//测试类
public class TestExtend {
public static void main(String[] args) {
Son son = new Son();
son.doSome1();//子类重写
son.doSome2();//继承自父类
son.doOther();//子类扩展
}
}
测试类运行结果:
多态
先说几个概念,“向上转型”、“父类的引用指向子类”、“自动类型转化”,它们都是一个意思。形如代码:Father father = new Son();这里的father就是”引用“。
“多态”字面理解:多种形态,多种状态。
java程序分为编译阶段和运行阶段,多态其实就是编译时候是一种形态,运行的时候另一种形态,编译阶段编译器认为father对象是Father类型,father只能访问到Father类的方法,假如访问子类的就会报错,比如访问子类Son的方法doOther()会爆红:
但它是从Son类new出来的,本质是Son类,运行阶段真正执行的是Son类的方法。还是上述的Father类和Son类,重写测试类:
public class TestExtend {
public static void main(String[] args) {
Father father = new Son();
father.doSome1();
}
}
测试类执行结果:
总结
new关键字后面的是对象的本质,“引用”只是在编译阶段限制了对象的功能。
多态和继承在开发中的作用
为了提高程序的扩展性,降低程序的耦合度。我们采用面向抽象,面向接口编程,比如我们有这样一个动作,“喂狗”、“喂猫”...我们如果用代码实现可以是这样:
//狗
public class Dog {
public void eat(){
System.out.println("狗在进食");
}
}
//猫
public class Cat {
public void eat(){
System.out.println("猫在进食");
}
}
//测试
public class Master {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
feed(dog);
feed(cat);
}
public static void feed(Dog a){
a.eat();
}
public static void feed(Cat a){
a.eat();
}
}
很容易看出上述代码的缺陷,我每次喂一个动物,我都需要写一个feed方法,而面向接口编程,优化之后的代码:
//写一个抽象接口,无论是狗还是猫,鸡鸭鹅,都是动物
public interface Animal {
public void eat();
}
//狗
public class Dog implements Animal {
public void eat(){
System.out.println("狗在进食");
}
}
//猫
public class Cat implements Animal{
public void eat(){
System.out.println("猫在进食");
}
}
//测试
public class Master {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
feed(dog);
feed(cat);
}
public static void feed(Animal a){
a.eat();
}
}
通过接口编程,我们只需要写一个feed方法就可以喂所有的动物了。