super在继承中的作用||回顾总结ava继承

本文详细介绍了Java中的继承概念,包括如何使用`extends`关键字创建子类,以及在子类中如何通过`this`和`super`调用父类的属性和方法。特别强调了`super`关键字在构造方法中的应用,以及继承的限制,如不能多重继承、私有成员的间接访问和子类构造时必须初始化父类数据。此外,还通过示例展示了如何在构造方法中传递参数给父类构造器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承关键字

继承是 OOP 面向对象程序设计 的关键技术之一,也是面向对象的三大特性(封装 继承 多态)

继承的关键字:extends super

在实现继承一个类时 要使用extends去继承一个类

class Parent
{
	...
}

子类
class child extends Parent
{
	...
}

super是在子类中明确调用父类公共属性或方法时 使用

super(name,age);// 一般用在构造方法传参中。

super.name=name;
super.fun();

子类调用父类属性和方法

父类

public class parent {
    public String name;
    private String wife;
    public int age;
    protected String homeadd;

    public void talk(){
        System.out.println("我的名字是"+name);
    }

    private void talk1(){
        System.out.println("此话我只对自己说");
    }

    protected void talk2(){
        System.out.println("我的继承人也可以知道");
    }

    public void out(){
        this.talk();
        this.talk1();
        this.talk2();
    }
}

上述代码块中,修饰符public、protected和默认修饰的属性和方法,该类的子类都可以调用。而private修饰的方法和属性,只能父类自己调用,或者通过一个其他修饰符的方法 间接调用如:

public void out(){
        this.talk();
        
        this.talk1();//该类只能自己调用,
        			//而通过间接的方法可以实现让子类调用。
        this.talk2();
    }

即子类在不定义任何成员的情况下,就已经有了父类所有非private定义的成员变量和全局属性。

子类通过this调用父类属性和方法

this:表示当前类,它出现在哪个类的代码中就是哪个代表哪个类,可以直接调用该类的所有属性和方法

class child extends parent{
    private String school;

    public child(String school) {
        System.out.println("************子类构造方法开始");
        this.school = school;
        this.talk();
        this.out();
        System.out.println(this.age);
        System.out.println("子类构造方法结束************");
    }
    public void talk(){
        System.out.println("我是子类,我的名字是"+name);
    }
    public void speak(){
        System.out.println("--------------子类方法开始");
        this.talk();
        this.out();
        this.age=5;
        System.out.println(this.age);
        System.out.println("子类方法结束--------------");
    }
}

主方法实现:

public class reextend01 {
    public static void main(String[] args) {
        child c=new child("中心小学");
        c.speak();
    }
}

在这里插入图片描述
可见,如果子类child继承了父类parent,在子类中我们可以通过this,或者直接处理父类得非私有的属性和方法。

当然,这种只适合,子类和父类属性方法不冲突的情况下,否之子类或调用它自己的,下面会讲。

子类通过super调用父类属性和方法

class child extends parent{
    private String school;
    //以下两个属性 父类中也有,且修饰符也一样
    protected String homeadd;
    public int age;

    public void talk(){
        //talk 方法父类子类都有一个修饰符+返回类型+方法名+参数都一样的方法  只是方法体不一样
        System.out.println("我是子类,我的名字是"+name);
    }

    public void super1(){
        this.talk();
        super.talk();
    }
}
public class reextend01 {
    public static void main(String[] args) {
        child c=new child();
        c.super1();
    }
}

在这里插入图片描述
所以,如果子类和父类都有一个相同的方法talk()(只有函数体不一样,相同的方法名、相同的参数列表、相同的返回值),

在子类中直接调用talk(),此时会覆盖父类的talk方法,调用的是子类方法

而super则是明确表示指向父类的方法,会覆盖掉子类方法。

构造方法中使用super

当父类方法没有相关参数构造方法时

class child extends parent {
    private String school;
    //以下两个属性 父类中也有,且修饰符也一样
    protected String homeadd;
    public int age;

    public child(String name,String school, String homeadd, int age) {
        super.name=name;
        this.school = school;
        this.homeadd = homeadd;
        this.age = age;
    }

    public void print(){
        super.talk();
        super.talk2();
    }
}

/*
*父类talk 中加入子类父类皆有的属性homeadd  和年龄
*/
protected void talk2(){
        System.out.println("我的继承人也可以知道"+"地址"+this.homeadd);
    }

在这里插入图片描述

构造方法中主要就是涉及到传参这个概念:
如果子类父类都有的属性,构造方法体中传参时:
如果没有用到super.属性=xxx
那么父类属性将不会赋值

当父类方法有相关参数构造方法时

当父类有相关参数的构造方法时

public parent(String name,int age, String homeadd) {
        this.name = name;
        this.age = age;
        this.homeadd = homeadd;
    }

在子类的构造方法中,我们就不必super.属性=xxx…一个一个赋值了

super(name,age,homeadd);;

只需在子类构造方法中根据父类构造方法的参数写super(,,…)就行

不过super() 只适合出现在构造方法中
在这里插入图片描述

继承的限制

限制1:没有多重继承,只有多层继承
如果C类想同时继承A 类 和 B类的功能

class A
{}
class B
{}
class C extends A B//这样是不行的
{}

上面是错的,无法实现多重继承

只能通过B 继承 A ,C再继承B 才行,也就是 一个类,一次只能继承一次
通过多层继承才能完成继承多个类

一般情况下,继承最多不建议超过3层

限制2:父类的私有成员不能直接被子类继承,只能间接调用
毕竟灰太狼和小灰灰还是不一样的 ,也有自己的私人空间。

限制3:子类进行对象实例化时,从父类继承而来的数据成员,要先通过调用父类的构造方法来初始化
限制3什么意思呢? 切记是在构造方法时

你调用父类的数据,其数据具体值必须在父类中的构造函数生成,
也就是子类构造方法调用父类数据,此数据在父类中要先诞生

意思就是,在上述中,我要给父类属性赋值,都要通过父类那进行赋值
你可以super.age=24;
也可以super(age)——————前提 父类中有相关参数的构造方法
还可以this.s=24___________前提,子类没有相冲突的属性,用this是明确调用父类属性。

所以在实例化子类,且涉及到给父类属性传值时
必须满足以下两个条件:
1、子类构造方法中依次用super.s=xxx 赋值

class Person
{
	String name;
	int age;
}

class Student extends Person
{
	String School;
	Student(String name,int age,String School)
	{
		super.name=name;
		super.age=age;
		this.School=School;
	}

	public String talk()
	{
		//return super.talk()+"I am from:"+this.School;
		return "I am from:"+this.School;
	}

}
public class InheritFFF
{
	public static void main(String[] args)
	{
		Student S=new Student("jack",24,"zhongg");
		System.out.println(S.talk());
	}
}

2.父类的构造方法中,有相关参数a、b的构造方法,然后再子类构造方法中写super(a,b);

父类的构造方法

class parent
{
	String name;
	int age;
	parent(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
}

子类的构造方法

class Child extends parent
{
	String school;
	Child(String name,int age,String school)
	{
		super(name,age);
		this.name=name;
		this.age=age;
		this.school=school;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值