Java继承详解
1.什么是继承?
把若干个类的共同属性和方法提取出来,放到一个类中。利用extends关键字实现子类继承父类,子类继承父类的属性和方法,这就是继承。
2.使用继承的好处?
提高代码的复用性;
为多态打基础,有继承才会有多态,没有继承就没有多态。
3.使用继承的注意事项
java只支持单继承;
子类继承父类属性和方法,如果有方法重写了,有属性同名,优先使用子类的属性和方法;
子类对象的创建,要先看父类是怎么创建的;
看下面的代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
package com.wz.extendsdemo; class A { public A() { // 父类无参构造 System.out.println("*************************") ; }}class B extends A { public B() { // 子类构造 System.out.println("#########################"); }}public class TestDemo { public static void main(String args[]) { B b = new B() ; // 实例化子类对象 }} |
运行结果
*************************
#########################
在上面的代码中,class B 继承了 class A ,创建子类对象A的时候,调用构造方法会首先调用父类B的构造方法(默认调用无参构造方法),然后再调用子类的构造方法,既得到上面的运行结果。子类继承父类的属性和方法,但不继承构造方法,只能调用父类的构造方法,如果父类的属性是private修饰的(私有的),就只能通过get/set方法调用和修改。super调用父类构造时,一定要放在构造方法的首行上。跟this语法类似,super和this不能再构造方法中同时出现。看如下代码定义一个父类Person,抽取出来name, age, gender属性,还有eat(),sleep()方法。
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
public class Person { //属性 private String name; private int age; private char gender; int i; //构造方法 public Person(){} public Person(String name, int age, char gender){ this.name = name; this.age = age; this.gender = gender; } //生成get/set方法 public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } public char getGender(){ return gender; } public void setGender(char gender){ this.gender = gender; } public String toString(){ return "name="+name+", age="+age+", gender="+gender; } //eat方法 public void eat(){ System.out.println("这是eat方法。。。"); } //sleep方法 public void sleep(){ System.out.println("这是sleep方法。。。"); }} |
定义一个子类Student,继承了父类Person,有自己的属性score,重写了父类的方法toString()和sleep()。
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public class Student extends Person{ //属性 private int score; int i = 10; //构造 public Student(){} public Student(String name, int age, char gender, int score){ super(name, age, gender); this.score = score; } //生成get/set方法 public int getScore(){ return score; } public void setScore(int score){ this.score = score; } public String toString(){ return "name="+getName()+", gender="+getGender()+", score="+score; } @Override public void sleep() { System.out.println("学生的sleep方法。。。"); } public void score(){ System.out.println("学生的score方法。。。"); }} |
定义一个测试类进行测试
|
01
02
03
04
05
06
07
08
09
10
11
|
public class Test { public static void main(String[] args) { //继承测试 Student stu = new Student("张三", 18, '男', 99); stu.score(); stu.eat(); stu.sleep(); System.out.println(stu.getName()); System.out.println(stu.i); }} |
首先是学生调用自己的方法score(),得到第一个结果;然后调用学生的eat()方法,首先检查自己没有eat()方法,会从父类调用eat()方法,得到第二个结果;然后调用学生重写父类的sleep()方法,得到第三个结果;第四个是继承自父类的name属性给自己使用得到的结果;第五个i的值父类子类都有,但有限考虑子类自己的变量i,得到10.
总结:从上面的代码可以看出,
继承是可以继承父类所有的属性和方法给自己使用的;
在子类重写了父类的方法后就优先调用子类的方法;
属性(变量名)相同也是优先考虑子类的变量,父类私有属性也能继承,但是不能直接修改使用,只能通过get/set方法使用和修改;
构造方法只能调用,没有继承;
子类创建对象调用构造方法首先调用父类的构造方法,然后再调用子类的构造方法;
this和super地址值都是一样的,都指向子类。

浙公网安备 33010602011771号