Java 第9天 面向对象(上)继承

写在前言 :
1 、现在出去面试,面试官老是会问你一句话Java 怎么样?
不管是大数据岗位还是数据库都会问一句。 回来痛下决心,决定探索下这门语言的精髓,大数据很多框架也都是Java 写的,的确懂一门语言,比较稳妥。路也宽敞!!!不然就和吃饭没筷子,那么尴尬。把每天学习到的 Java知识分享到这里会。直到能自己写个复杂一点Dome得出来。
2、为了监督自己探索这门语言的动力与决心。特此这段话放到前面!!!
3、挑战下自己 到底是笨 还是学不会,还是不想学。 好运

一、继承概述:

  • 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
    通过extends关键字可以实现类与类的继承
  • class 子类名 extends 父类名 {}
    单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
    有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。

继承的好处:

  • 减少了代码的冗余,提高了代码的复用性
  • 多个类相同的成员可以放到同一个类中
  • 提高了代码的维护性
  • 如果功能的代码需要修改,修改一处即可
  • 让类与类之间产生了关系,是多态的前提
  • 其实这也是继承的一个弊端:类的耦合性很强

Java中继承的特点:

  • Java只支持单继承,不支持多继承。
    一个类只能有一个父类,不可以有多个父类。
    class SubDemo extends Demo{} //ok
    class SubDemo extends Demo1,Demo2…//error
  • Java支持多层继承(继承体系)
    class A{}
    class B extends A{}
    class C extends B{}

继承的注意事项

子类只能继承父类所有非私有的成员(成员方法和成员变量)
其实这也体现了继承的另一个弊端:打破了封装性
子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。
不要为了部分功能而去继承

我们到底在什么时候使用继承呢?
继承中类之间体现的是:”is a”的关系。

理解继承-1

子类继承父类的什么?
继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里

super关键字

  • super的用法和this很像
    1、this代表本类对应的引用。
    2、super代表父类存储空间的标识(可以理解为父类引用)
  • 用法(this和super均可如下使用)

- 访问成员变量

this.成员变量 super.成员变量

  • 访问构造方法(子父类的构造方法问题讲)
    this(…) super(…)
  • 访问成员方法(子父类的成员方法问题讲)
    this.成员方法() super.成员方法()
    1、
    在这里插入图片描述
    2、在这里插入图片描述
    3、创建类的对象调用属性方法。。

继承中构造方法的关系:

  • 子类中所有的构造方法默认都会访问父类中空参数的构造方法

为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
每一个构造方法的第一条语句默认都是:super()

继承中构造方法的关系:

如果父类中没有构造方法,该怎么办呢?
子类通过super去显示调用父类其他的带参的构造方法
子类通过this去调用本类的其他构造方法
本类其他构造也必须首先访问了父类构造
一定要注意:
super(…)或者this(….)必须出现在第一条语句上
否则,就会有父类数据的多次初始化

二、方法的重写:

1、什么是方法重写

1、方法的重写或方法的覆盖(overriding)
2、子类根据需求对从父类继承的方法进行重新编写
3、重写时,可以用super.方法的方式来保留父类的方法
4、构造方法不能被重写

2、方法重写的规则:

在这里插入图片描述

3、方法重写概述

  • 子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写。
  • 使用特点:
    如果方法名不同,就调用对应的方法
    如果方法名相同,最终使用的是子类自己的

4、方法重写的应用:

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。

5、方法重写的注意事项:

  • 父类中私有方法不能被重写
  • 子类重写父类方法时,访问权限不能更低
  • 父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解)

6、方法重写vs方法重载

方法重写与方法重载有何区别

在这里插入图片描述

三、遇到的问题:

如果继承子类后,属性为私有的(private)的,那么需要提供get set 方法。
但是我遇到一个问题是:子类继承父类后,报错如下:

Implicit super constructor ManKind() is undefined. Must explicitly invoke another constructor
在这里插入图片描述
如下翻译:未明确定义构造方法,我定义了是,不解啊。。
在这里插入图片描述

解决办法:

经过酝酿一阵排解:是因为我的无参构造函数在父类中没有定义。添加进行报错也就没有了。
也能正常运行了。。。

四、完整栗子代码:

package com.it.iwork;

/**  
 * @author Administrator
 *    父类
 */
public class ManKind {
private int sex;
private  int salary;

public ManKind() {
super();
}



public ManKind(int sex, int salary) {
super();
this.sex = sex;
this.salary = salary;
}


public void manOrWoman() {
if(sex ==1) {
	System.out.println("性别为男");
}else if(sex ==0){
	System.out.println("性别为女");
	
}
 }

public void employeed() {
if (salary ==0) {
	System.out.println("no job");
}else if (salary ==1){
	System.out.println("job");
}
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
	this.sex = sex;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}

小孩 子类:继承父类 ManKind

在这里插入图片描述

测试类 :KidsTest

在这里插入图片描述

如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。

【转载注明出处,还望尊重原创 】

【作者水平有限,如有错误欢迎指正 .】

猜你喜欢

转载自blog.csdn.net/weixin_46163590/article/details/106885814