当多个对象具备多种同样的属性和方法,每个人对象都要重复写同样的内容,则会显得代码冗杂和繁重。作为面向对象三大特性之一的继承,则可以很好地解决该问题。本篇文章将为您简单地介绍继承的内容以及在 Java 中继承的使用方法。

1、继承的定义

当多个类存在相同的属性和方法时,可以选择讲这些共同的部分抽象为一个父类,其他的子类就可以继承父类的属性和行为,使得子类对象获得和父类对象同样的属性和方法。

继承的优点

(1)提高代码的复用性。

(2)类与类之间产生了联系,是多态的前提。

2、继承的格式

通过 extends 关键字,可以声明一个子类继承了一个父类,定义格式:

public class 父类名称{//定义父类的格式
..........
}

public class 子类名称 extends 父类名称{
...........//定义子类格式
}

3、成员变量重名

在父子类继承关系中,如果成员变量重名了,则创建子类对象,有两种访问方式:

(1)直接通过子类对象访问成员变量。

等号左边是谁,就优先用谁,没有则向上找。

(2)间接通过成员方法访问成员变量。

成员方法属于谁,就优先用谁,没有则向上找。

public class Demo02ExtendsField {
    public static void main(String[] args) {
        Father father = new Father();//创建父类对象
        System.out.println(father.numFather);
        System.out.println("====================");

        Son son = new Son();
        System.out.println(son.numFather);//10
        System.out.println(son.numSon);
        System.out.println("====================");

        System.out.println(son.num );//优先子类200
        System.out.println("===================");

        son.methodSon();//这个方法定义在子类,优先用子类,没有再向上找
        son.methodFather(); //这个方法在父类中定义的
    }
}


public class Father {
    int numFather = 10;
    int num = 100;

    public void methodFather(){
        System.out.println(num);
    }
}


public class Son extends Father{
    int numSon = 20;
    int num = 200;

    public void methodSon(){
        System.out.println(num);
    }
}

注:也可以通过 super 关键字来访问父类中的同名变量;this 关键用来访问本类中的同名变量。

4、成员方法重名

如果父子类中都出现了重名的成员方法,一般使用重写(Override)来进行访问。

方法重写:如果子类出现和父类中一模一样的成员方法(返回类型、方法名和参数列表完全相同),就会出现覆盖效果,也就是重写。即声明不变,重新实现。

重写特点:创建的是谁,就优先用谁的方法;只会向上找父类,而不会向下去找子类。

public class Demo04ExtendsMethod {
    public static void main(String[] args) {
        Son son = new Son();
        son.methodFather();
        son.methodSon();
        System.out.println("===========");
        son.method();
    }
}


public class Father {
    public void methodFather(){
        System.out.println("父类方法执行!");
    }

    public void method(){
        System.out.println("父类方法重名执行!");
    }
}

public class Son extends Father {
    public void methodSon(){
        System.out.println("子类方法执行!");
    }

    @Override
    public void method(){
        System.out.println("子类方法重名执行!");
    }
}

方法重写的注意事项:

(1)必须保证父子类之间方法的方法名和参数列表一致。

(2)子类返回数据类型必须小于父类的返回数据类型。

(3)子类方法的权限必须大等于父类的权限修饰符。

(4)方法复写前加一个​ @Override​ 是用来检测是否为有效的重写。但这个不是必须的,可写可不写。

扩展:

(1)Object 类是所有类的公共最高父类(祖宗类)。

(2)public > protected > (deafult) > private  【(default)不是关键字,而表示权限修饰符留空。】

5、重写的应用场景

public class Demo06Phone {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.call();
        phone.send();
        phone.show();
        System.out.println("==========");

        NewPhone newPhone = new NewPhone();

        newPhone.call();
        newPhone.send();
        newPhone.show();
        System.out.println("==========");
    }
}

public class Phone {
    public void call(){
        System.out.println("打电话");
    }

    public void send(){
        System.out.println("发短信");
    }
    public void show(){
        System.out.println("显示号码");
    }
}

public class NewPhone extends Phone {
    @Override
    public void show() {
        super.show();
        System.out.println("显示姓名");
        System.out.println("显示头像");
    }
}

6、总结

以上就是 Java 中面向对象三大特性之一继承的全部内容,如果想要了解更多关于 Java 面向对象的内容,请继续关注W3Cschool,如果对您的学习有所帮助,还希望多多支持我们!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。