浅谈Java中的super与this关键字,继承,方法重载与方法重写

wuchangjian2021-11-05 03:45:47编程学习

 

0、本文的细节小知识点

0.0 、专有名词

父类(基类)(超类)        :     parent class  、  base class  、 superclass

子类(派生类)(次类)(扩展类)                   :       

 child class       、derived  、        subclass   、     extended class

继承&多态                           :        Inheritance        Polymorphism

重写&重载                           :        Override            Overloading

动态绑定                             :        Dynamic binding(理解动态绑定)

0.1、修饰符

0.2、super 和 this 关键字

0.2.1 super 关键字

super关键字 ! 指代父类 可以用于调用父类中的普通方法和构造方法!

即 super关键字 可以用于两种途径:

(1):调用父类的构造方法。

父类的构造方法不会被子类继承,

例如当在父类中 只有有参构造方法时,那么父类中的系统自己补充的无参构造方法就被覆盖了!

而且需要明白super关键字的第(1)种用法,还需要知道,在JAVA中,当子类实例化new对象的时候,先调用父类的构造方法,再调用自己的构造方法!


public class TestDemo
{
    public static void main(String[] args)
    {

//        System.out.println("HelloWorld");
        SonChildErzi son = new SonChildErzi();

    }

}


class  DieFatherBa
{
    public DieFatherBa()
    {
        System.out.println("我恁爹,先有爹再有子,姜还是老的辣!");
    }
}

class SonChildErzi  extends DieFatherBa
{
    public SonChildErzi()
    {
        System.out.println("nbnb666,先有父后有子,上梁不正下梁歪");
    }
}

输出结果如下图所示:

 这时候你在爹的构造函数里传了参,把他变成有参构造了,那问题就来了

子类构造方法先构造父类再构造子类的时候,他原来父类好端端的(系统自己补的)无参构造方法,父类无参时,子类在构造父类的时候也自己悄悄补了个super(),但是现在,父类变成有参构造方法了,被显式调用了,那么子类也必须显式调用父类的构造方法!

 

 要调用 父类 构造方法 ,没有系统给你默默补上 super(),

你就需要了解到 ,要调用父类的构造方法就必须使用关键字super,而且这个调用必须是构造方法的第一条语句。

 这时候就不会再报错了!

 所以 设计指南上说了:一般情况下,最好能为每个类提供一个无参构造方法,以便于对该类进行扩展,同时避免错误!

(2):调用父类的方法!关键字super不仅可以调用父类的构造方法,也可以引用父类的方法!

结果如下:

 

0.2.2、 this关键字

 (1)this.属性名称

(2)this.方法名称 这两点均在以前的博客中有讲解

(3)因为super的第一个作用与父类构造方法有关且花了大篇幅叙述讲解,因此在此

着重讲一下第三个作用 this()加以区分!

this()  访问本类中的构造方法,()中可以有参数的,如果有参数的,就是调用的指定的有参构造!

注意事项:

1、this() 不能使用在普通方法中! 只能写在构造方法中!

2、必须是构造方法中的第一条语句!

this()这个可不能单独写在类中嗷,跟super(参数)一样要写在构造方法中哦,不然分分钟报错给你啊!~

这时候我们换到无参的构造方法中:

 

 !!!!this()要被写在 构造方法中!!!还要this括号内传的参数和放进去的构造方法的参数不同!!!

即:this内有N个构造方法,你可以根据参数列不同,对N-1(除去跟自己所在的构造函数相同的参数列)个构造方法进行互相调用!

如图:

 

 

 

 

 

 1、继承

1.1、何为继承?!

面向对象的编程允许你从 已经定义的类中 定义 新的类 这称为 继承!

继承是Java在软件重用方面一个重要且功能强大的特称。

(假设要定义一个类,例如图书馆模型中,分为图书管理员和普通用户,对其进行抽象建模,面向对象对图书的属性 和 User 对 图书的操作 建模,User中的(Admin和NoramalUser)有很多共同的特性。如何设计?

User类来避免冗余并且易于维护(更改一个父类,其他中的子类也更改)的最好方式?

答案自然是使用继承!

继承使得你可以定义一个通用的类(即父类),之后扩充该类为一个或多个更加特定的类(即子类)

 

子类会自动拥有和继承父类所有可以继承的属性和方法!

和传统的理解不同,子类并不是父类的一个子集。实际上,一个子类通常比他的父类包含更多的信息和方法!此外,继承还是一种“是一种”关系(is-a)关系来建模的 

如上文提到的 Admin是User  NormalUser 也是 User

除构造方法外的所有方法和属性,

对于父类中有private的:私有数据域,在该类外是不可访问的,因此,不能在子类中直接使用。

但是,如果父类中定义了针对这些私有数据域的访问器/修改器,那么就可以通过这些公共的访问器/修改器来访问和修改他们!

面向对象方法结合了面向过程范式的强大之处,并且进一步将数据和操作集成在对象中!

1.2、Java有多态继承吗?

其实,Java只是选择了“单继承”,且提出解决丰富度的方案:

 

String str1 = new String("小红日srs");
int [] array = new int[ ] ;
HashSet<Integer> set1 = new HashSet<>();

User user = new User();

一旦出现new,就在堆上开辟内存用来存储对象了!

Java中的继承是来自于一个父类,这种限制称为单一继承(single inheritance),如果使用extends关键字来定义一个子类,他只允许有一个父类。

2、方法重载和方法重写

方法重载:Overload

1:要求必须在同一个类中。

2:对于签名中的返回值类型不做要求,与修饰符无关。

3:对于参数列表中的参数个数或参数类型或参数顺序不做要求。

4:要求必须同名。

方法重写:Override 又叫覆写

1、方法重写必须是子类重写父类中的方法

2、重写的方法与父类中的方法返回类型和方法名称,参数列表必须相同

满足上述条件这样我们说子类与父类的方法构成了重写关系。

 

相关文章

HashMap为什么初始长度为16或2的幂?

我们知道,HashMap是通过Key的HashCode和HashMap的长...

python 数据挖掘 上海 培训到深度学习

python 数据挖掘 上海 培训到深度学习

张文彤老师Python统计分析系列,从统计模型到深度学习全线贯通ÿ...

7-1 前n项的和1 (10 分)

1-3+5-7+……的前n项的和 输入格式: 输入一个整数n 输出...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。