java面向对象--继承(基础进阶篇)

一、在java中面向对象的重要性

(1)引言:

     在Java中,面向对象编程(OOP)中的继承是一个非常重要的特性。继承允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。以下是继承在Java中的一些重要性:


1. 代码重用:


继承支持代码的重用,子类可以直接使用父类中定义的所有非私有成员(属性和方法),无需重新编写相同的代码。
这减少了代码冗余,提高了开发效率,降低了维护成本。


2. 模块化:


继承使得代码更加模块化,可以将通用的功能放在基类中,特定的功能放在派生类中。
这种结构使得代码更加清晰,易于理解和维护。


3. 扩展性:


继承支持类的扩展,子类可以通过添加新的方法或属性来扩展父类的功能。
子类还可以覆盖(override)父类的方法以提供不同的实现。


 4. 多态性:


    继承是实现多态的基础之一。子类对象可以被当作父类对象来使用,这意味着你可以使用父类类型的引用指向子类的对象。
这种多态性使得代码更加灵活,可以在不知道具体子类的情况下编写可以处理多种类型对象的代码。

 

 二、继承初识

下面这张图片是我们继承所需要学习的内容:

 首先我们先来看一段代码:

package 面向对象进阶_继承;

public class animal {
    public void  eat() {
        System.out.println("动物在吃饭");
    }
    public void sleep( ){

        System.out.println("动物在睡觉");
    }
    public  void  breathe() {
        System.out.println("动物在呼吸");
    }
}

我们可以看到,这个javabean类中定义了一个animal类,对于一个动物来说,吃饭,睡觉,呼吸,都是最基本的行为。那之后如果还定义了一个dog类,那还需要重新写一遍,那就太过于繁琐,那dog也是animal类的一种,所以我们可以通过继承来重用代码,提高代码的复用性。

 

同样,也可以通过这张图片来理解继承的概念。 

1、extends关键字

 我们可以通过extends关键字,让一个子类继承父类,通过继承提高代码的复用性,并且可以在子类中增加新的方法,使得子类更加厉害!

 

 2、继承的特点

 java中的继承,支持单继承和多层继承,但是不支持多继承,c++支持多继承,一个子类只能继承一个父类。但是每一个类都直接或者间接继承了object这个大类。这个不需要我们自己写,在程序运行时,jvm虚拟机会自动帮我们加上。

 

 

3、继承练习一: 

 解析:在做这道题时,我们需要先从下往上采用画图法完成,在实际编代码的时候采用从上到下的方法。推荐使用画图法,层层的分析。

 

 

4、子类到底可以继承父类的哪些东西? 

常见的两个误区:

1、父类私有的东西,子类无法继承

2、父类非私有的东西,就被子类继承下了

注意:在继承中,主要就是子类继承父类的(构造方法+成员变量+成员方法),但是子类是无法继承父类的构造方法的,因为这个会违反构造方法的定义(方法名要与类名保持一致),如果要使用,那就要自己手写。

至于,成员变量,无论是私有还是公有的都会被子类继承,对于成员方法而言私有是无法被子类继承的。

 

 一、子类继承父类的成员变量的不同情况

1、非私有变量:

 程序在运行时会先从main函数先开始,main函数先进栈,然后到Zi z =new zi()在堆内存中创建出一块空间,因为存在继承所以会在一块空间内分出一般来给父类,通过栈内存的图片可以知道,如果父类的成员变量不是私有变量时,子类是可以继承的。

2.私有变量

 

 通过上面的图片显示,对于私有的成员变量,在子类中是无法被直接使用的,需要使用get和set方法。

二、子类继承父类的成员方法 

这里会涉及的一个虚方法表的概念: 在c类中,会将非private、static、final修饰的方法存到一个虚方法表中,然后b类继承c类,b类也可以在此基础上继续编写自己的虚方法,对于a而言同理。这样在a类中调用c的方法就不用一层一层寻找,直接就在虚方法表中找到即可。

只有父类的中的虚方法才能被子类继承。

我们可以看到fushow2这个方法是私有的,所以在方法区中首先检索,发现不是虚方法所以继续向上检索父类,发现是私有的所以无法使用,程序运行到这里是会出错的。

三、继承中的特点 

 

 1、继承中成员变量的访问特点:(就近原则)

根据就近原则可知道,因为sout的打印语句距离String name=“zishow”最近,所以结果就是 zishow,如果想打印zi,应该在打印语句中写this.name,这样打印出来的就是子类中的成员变量,如果想打印父类中的name,应该在打印语句中写super.name。

 

2、继承中成员方法的特点(就近原则)

package 面向对象进阶_继承;

public class test {
    public static void main(String[] args) {
        student stu = new student();
        stu.lunch();

    }
}
class  Person {
public  void eat(){
        System.out.println("吃米饭");
    }
    public  void drink() {
        System.out.println("喝开水");
    }
}
class student extends Person {
    public void lunch(){
        eat();
        drink();
//如果直接使用super会直接到父类中找
super.eat();
super.drink();


    }
}

 

在上面的代码中,在student类中,在调用eat()和drink()方法中,其实在开头出都隐藏了一个this,当在调用这两个方法时,程序会先在子类中查找,发现没有所以继续向父类查找

.如果在子类中也有一个相同的eat和drink会怎么样?

package 面向对象进阶_继承;

public class test {
    public static void main(String[] args) {
        forgien_student stu = new forgien_student();
        stu.lunch();
    }
}
class  Person {
public  void eat( ){
        System.out.println("吃米饭");
    }
    public  void drink( ) {
        System.out.println("喝开水");
    }
}
class forgien_student extends  Person  {public void lunch(){
    eat();
    drink();
    super.eat();
    super.drink();
}
    public void eat(){
        System.out.println("吃意大利面");
    }
    public  void drink() {
        System.out.println("喝量水");
    }
}
class student extends Person {
    public void lunch(){
        eat();
        drink();
    }
}

因为会有就近原则,所以在留学生的类中,调用eat和drink方法是先从自己的类中找到,但是下面的super.eat()  super.drink()就是直接从父类中查找。

四、方法的重写 

1.应用场景:当父类中的方法不能满足子类时,我们就需要把方法重写

 2.方法重写的本质:

方法的重写一定是基于子类和父类的继承之间的。其本质就是覆盖了虚方法表中的方法

只有被添加到虚方法表中的方法才能被重写。

 五、总结

六、结语

在这个充满挑战的世界里,每个人都在寻找属于自己的位置。有时候,我们会感到迷茫,甚至怀疑自己的选择。但请记得,每一次挫折都是一次成长的机会,每一次失败都是通往成功的必经之路。
当你觉得前方的道路越来越艰难时,请不要放弃。回头看看你已经走过的路,你会发现那些曾经看似无法逾越的障碍,如今都已经成为了你生命中最宝贵的财富。正是这些经历塑造了今天的你,让你变得更加坚强和勇敢。
不要害怕犯错,因为错误是学习的一部分。每一次尝试都是一次进步的机会,即使最终的结果不是你所期望的,也不要气馁。记住,成功往往属于那些不断尝试、永不言败的人。
给自己一些时间,去探索未知的领域,去追求那些曾经让你心动的梦想。不要让恐惧和犹豫阻止你前进的脚步。相信自己的直觉,听从内心的声音,你会发现原来自己有着无限的可能。
在这个旅程中,最重要的是保持乐观的心态,相信每一天都是一个新的开始。即使遇到了困难,也要学会从中找到积极的一面。因为只有这样,你才能真正体验到生活的美好,感受到成长的乐趣。
所以,无论你现在处于什么样的境遇,都请坚持下去。相信自己,勇敢地面对挑战,你将会发现,那些曾经看似遥不可及的梦想,其实就在不远处等着你。
希望这段文字能带给你力量和勇气,继续向前迈进!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值