Java之继承详解

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。

extends的意思是"扩展"。子类是父类的扩展。(继承可以有传递性即孙子可以继承爷爷的属性和方法)

Java中类只有单继承,没有多继承。并且继承是类和类之间的操作。

一个父亲可以有多个儿子。

以下为代码实例:

 首先定义一个Persons作为父类,并定义一些属性。

package com.xzc.oop;

public class Persons {//父类
    String name = "xzc";//在同一个package下可以使用
    public int height = 180;//公开属性任意情况都可以使用
    private int age = 10;//此时private为父类私有的不能被继承 但是可以通过get/set方法进行取值和赋值
    public void say(){
        System.out.println("说了一句话");
    }
    public void getAge(){
        System.out.println(this.age);
    }
}

接下来定义子类Man并继承父类Persons

Man中除了继承来的属性和方法没有其余的。

package com.xzc.oop;
//Man is Persons
public class Man extends Persons{//Man继承了Persons Man为子类、派生类
}

最后调用继承成果,可以发现尽管Man中没有属性和方法,但是也可以调用出父类的属性和方法。

package com.xzc.oop;
import com.xzc.oop.Student;
public class Application {
    public static void main(String[] args) {
        Man man = new Man();
        man.say();//虽然Man类中什么也没有 但是继承了Persons类的参数和方法所以方法也可以被调用
        //说了一句话
        System.out.println(man.name);//xzc
        System.out.println(man.height);//180
        //System.out.println(man.age);//报错age为父类私有属性能被继承,但没有使用权
        man.getAge();//10 虽然age为private但是可以利用get/set方法实现调用和赋值
    }
}

在Java中,所有的类,都默认直接或者间接继承Object

  • super详解

super和this是一对近义词:我们之前写的this.()用法是表示该类下的类变量,而super则表示父类中的类变量。(当然this和super后加方法也分别代表同样的意思)

当方法中形参不与类变量重名时

package com.xzc.test;
public class test{
    private String name;
    private int age;
    public void t(int a){//此时t方法中的形参不与类变量重名
        this.name = "zyj";//this.name代表的是类变量
        name = "xzc";//可以用name来代替this.name并且二者没有区别,因为类变量和t方法都是非static修饰的所以可以直接调用
    }
}

 当方法中有与类变量重名的形参时,需要对两个变量名进行区分就用this

package com.xzc.test;
public class test{
    private String name;
    private int age;
    public void t(String name){//此时t方法中有与类变量重名形参
        name = "zyj";//name代表的是传入的形参
        this.name = "xzc";//而this.name则表示类变量name
    }
}

当方法中出现父类变量、类变量、传入形参三者都重名的情况,则用this表示类变量,super表示父类变量。

package com.xzc.test;
public class test extends Test{
    private String name;
    private int age;
    public void t(String name){//此时t方法中有与类变量重名形参
        name = "zyj";//name代表的是传入的形参
        this.name = "xzc";//而this.name则表示类变量name
        super.name = "xt";//super.name表示该类的父类中的name变量
    }
}

注意:当主函数进行new对象时,该语句先执行父类构造器然后再执行该类构造器。 这也导致父类和子类的构造器中必须要各有一个无参构造器,以达到调用时不报错。

最后总结一点:就是在主函数中使用对象名.变量(或方法)可以调用出对应对象类的类变量(类方法),当对象类中无此类变量名时则调用的是父类中的类变量。若子类和父类都有同名的类变量时,对象名.变量只能调用子类的类变量,无法调用父类的类变量,若想调用父类变量则需要在子类中写出调用方法,方法中需包含super.变量名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值