概述
java中的继承
1.继承的概念
继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性
的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了
由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用继承的思想来达到共用。
2.为什么需要继承
根据上面的说法.继承主要解决的问题是对共性的抽取,从而实现代码的复用;
有下面一个情景:
- 首先你要定义一个学生类:
- 然后我们在定义一个工人类
- 然后我们思考一个问题,既然工人和学生都是人,他们都有自己的姓名,都有自己的年龄,身高,他们都要吃饭,如果每次定义一个其他的人都要这样写的话会不会有些繁琐,有没有一种方法可以把他们的共性抽取出来,答案是有,而这个方法就是继承.
- 语法如何实现继承
- 继承使用的关键字: extend
- 然后我们对他们的共性进行抽取:定义了一个People类
- 继承的语法:一个类继承另一个类
如:class Student extends People{
}.…表明是学生这个类继承了"人"这个类,其中继承的类叫做子类(派生类),被继承的类叫做父类(基类或超类),父类和类的关系通常是子类 is a 父类?的关系
具体看代码:
而此时完成了继承以后我们就可以删去Student和Worker类中的共性了,只是可以如果你有其他的需要可以不用删除
4.继承后子类如何访问父类的成员变量与成员方法
4.1
子类中的成员变量与父类的成员变量相同时,优先访问子类中自己的成员变量:(此时会打印出"yaoyao",如果你将子类中的name删去的话,此时会打印出"虚无")
4.2
子类中的成员变量父类中没有时,此时当然会访问哪里有有这个成员变量的地方啦,如果父类中有就访问父类中的,如果子类中有就访问子类中的
4.3
子类中的成员方法名字(参数列表相同)与子类的相同时,此时会优先访问子类中的方法:
(此时会调用子类中的方法,会打印出 (“yaoyao要去吃食堂”)
4.4
子类中的成员方法(参数列表相同)父类没有时,会调用用的那个,如果子类中有就调用子类的,如果父类中有的话,就调用父类中的.与成员变量相同附【说明】
通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到
则访问,否则编译报错。
通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用.
方法适传递的参数选择合适的方法访问,如果没有则报错;
5.子类如何访问父类中的成员变量与方法
5.1
情景:
当我们发现使用子类对象的引用来访问父类中的成员方法与成员变量时,只有子类中没有这个成员变量或成员方法(除了使用参数列表不同的)时才会访问父类中的,但在实际中我们有时需要访问父类中的,显然使用子类对象的引用是无法完成的,这时就要使用super关键字.
5.2
此时没有加super关键字,function这个方法会调用子类中的eat方法,会打印出 (“yaoyao要去吃饭,食堂”)
运行结果图:
5.3
当我们使用了super关键字,就会调用父类中的ear方法,会打印出
(“虚无要去吃饭”)
运行结果图:
5.4
访问父类中的成员方法与此相类似,自己可以测试一下.
6.如何使用构造方法和代码块来初始化子类对象
6.1
情景:
上文中我们都是使用的就地初始化,也就是在建立变量时就顺便赋值了,那么我们如何使用构造方法和代码块进行初始化呢
6.2
使用构造方法来初始化子类的对象
首先我们要明白在子类初始化的时候必须先帮父类进行初始化,父类的初始化也要使用构造方法,只不过他的构造方法的调用是super(),此时我们就可以将父类的构造方法放在子类构造方法的第一条语句,此时就是先初始化父类再初始化子类了.
具体看代码:
这是子类的构造方法对子类进行构造,super表示调用父类中的构造方法.
当父类中没写构造方法时,会有一个默认的构造方法,参数列表为空,但是一旦你写了任何一个构造方法,就必须在子类的构造方法的第一行调用你写的父类的构造方法.
例如这是父类的构造方法,所以在子类的构造方法中必须调用它.
6.3
使用代码块来进行初始化,之前已经有一篇是讲的是代码块,这里讲一下代码块的执行顺序
首先先执行父类中的静态的代码块(如果有多个的话,按照顺序执行就好了),然后执行子类中的静态代码块,然后执行父类中的实例代码块,然后执行父类的构造方法,然后执行子类的实例代码块,最后执行子类的构造方法.(还有就是静态的代码块只执行一次)
比如下面代码:
package demo1;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
public class Demo3 {
public static void main(String[] args) {
Student student = new Student("haha",18,160,"123456");
// System.out.println(student.name);
// student.function();
// System.out.println(student.age);
// student.say("A","B");//测试使用参数列表不同来调用父类中的方法;
}
}
class People{
String name="虚无";
int age;
int height;
void eat(){
System.out.println(name+"要去吃饭");
}
void say(String a,String b){
System.out.println(a+" "+b);
}
public People(String name, int age, int height) {
this.name = name;
this.age = age;
this.height = height;
System.out.println("这是父类中的构造方法");
}
static{
System.out.println("这是父类中的静态代码块1");
}
static{
System.out.println("这是父类中的静态代码块2");
}
{
System.out.println("这是父类中的实例代码块1");
}
{
System.out.println("这是父类中的实例代码块2");
}
// public People(){
// System.out.println("这是在父类中的构造方法");//测试是否为无参就可以调用
// }
}
class Student extends People{
// String name="yaoyao";//名字
// int age;//年龄
// int height;//身高
String id;
void goToSchool(){
System.out.println(name+"要去上学");
}
void eat() {
System.out.println(name+"要去吃饭,食堂");
}
void function(){
super.eat();
}
void say(String a){
System.out.println(a);
}
public Student(String name, int age, int height, String id) {
super(name,age,height);
this.id = id;
System.out.println("这是子类中的构造方法");
}
static{
System.out.println("这是子类中的静态代码块1");
}
static{
System.out.println("这是子类中的静态代码块2");
}
{
System.out.println("这是子类中的实例代码块1");
}
{
System.out.println("这是子类中的实例代码块2");
}
}
class worker extends People{
String name;//姓名
int age;//年龄
int height;//身高
void goToWork(){
System.out.println(name+"要去上班");
}
void eat() {
System.out.println(name+"要去吃饭,回家");
}
void say(String a){
System.out.println(a);
}
public worker(String name, int age, int height) {
super(name, age, height);
this.name = name;
this.age = age;
this.height = height;
}
}
运行效果图:
最后
以上就是烂漫豌豆为你收集整理的java中的继承的全部内容,希望文章能够帮你解决java中的继承所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复