Java继承详解

1.什么是继承?
把若干个类的共同属性和方法提取出来,放到一个类中。利用extends关键字实现子类继承父类,子类继承父类的属性和方法,这就是继承。
2.使用继承的好处?
提高代码的复用性;
为多态打基础,有继承才会有多态,没有继承就没有多态。
3.使用继承的注意事项
java只支持单继承;
子类继承父类属性和方法,如果有方法重写了,有属性同名,优先使用子类的属性和方法;
子类对象的创建,要先看父类是怎么创建的;
看下面的代码

[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()方法。

[Java] 纯文本查看 复制代码
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()。

[Java] 纯文本查看 复制代码
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方法。。。");
        }
}


定义一个测试类进行测试

[Java] 纯文本查看 复制代码
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地址值都是一样的,都指向子类。

posted @ 2020-03-17 09:51  幽暗森林之猪大屁  阅读(350)  评论(0)    收藏  举报