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