面向对象的特征之二:继承性
继承性的有优势
1.减少代码的冗余,提高代码的复用性
2.便于功能的扩展
3.为多态性的使用,提供了前台
继承性的格式 :class A extends B{}
A:子类、派生类 、subclass
B: 父类 、超类、superclass
体现: 一旦子类A继承父类以后,子类A中就获取了父类B中声明的结构,属性、方法;
特别的父类声明private的属性或方法,子类继承父类以后,仍然认为获取父类中私有的结构
只是因为封装性的影响,不能直接调用
子类继承父类后,还可以声明自己额外的属性和方法
继承性的规定
一个父类可以有多个子类
一个子类只能有一个父类
子父类是相对的概念
可以多层继承
继承性关键字
子类直接继承的类:称为直接父类;间接继承:间接父类
子类继承父类后,就获取了父类的所有属性和方法以及所有间接父类的所以属性和方法
如果一个类没有显示声明一个类的父类,则默认继承java.lang.Object类
所有类都直接或间接继承Java.lang.Object类
父类
package com.chenxi.java; public class Person { String name; int age; public Person(){ } public Person(String name,int age){ this.name=name; this.age= age; } public void eat(){ System.out.println("吃饭"); } public void sleep(){ System.out.println("睡觉"); } }
子类
package com.chenxi.java; //extends 继承性关键字 public class Student extends Person { // String name; // int age; String major; public Student(){ } public Student(String name,int age,String major){ this.name= name; this.age= age; this.major=major; } // public void ead(){ // System.out.println("吃饭"); // } // public void sleep(){ // System.out.println("睡觉"); // } public void study(){ System.out.println("学习"); } }
测试代码
package com.chenxi.java; public class ExtendsTest { public static void main(String[] args) { Person p1 = new Person(); p1.age = 1; p1.eat(); Student s1 =new Student(); s1.eat(); s1.sleep(); } }
测试结果
吃饭 吃饭 睡觉
修改代码
父类
package com.chenxi.java; public class Person { String name; private int age; public Person(){ } public Person(String name,int age){ this.name=name; this.age= age; } public void eat(){ System.out.println("吃饭"); } public void sleep(){ System.out.println("睡觉"); } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }
子类
package com.chenxi.java; //extends 继承性关键字 public class Student extends Person { // String name; // int age; String major; public Student(){ } // public Student(String name,int age,String major){ // this.name= name; //// this.age= age; // this.major=major; // // } // public void ead(){ // System.out.println("吃饭"); // } // public void sleep(){ // System.out.println("睡觉"); // } public void study(){ System.out.println("学习"); } }
测试
package com.chenxi.java; public class ExtendsTest { public static void main(String[] args) { Person p1 = new Person(); // p1.age = 1; p1.eat(); Student s1 =new Student(); s1.eat(); s1.sleep(); s1.setAge(9); System.out.println(s1.getAge()); } }
结果
吃饭 吃饭 睡觉 9
间接父类
package com.chenxi.java; public class Creatuer { public void breath(){ System.out.println("呼吸"); }
直接父类
package com.chenxi.java; public class Person extends Creatuer { String name; private int age; public Person(){ } public Person(String name,int age){ this.name=name; this.age= age; } public void eat(){ System.out.println("吃饭"); } public void sleep(){ System.out.println("睡觉"); } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }
子类
package com.chenxi.java; //extends 继承性关键字 public class Student extends Person { // String name; // int age; String major; public Student(){ } // public Student(String name,int age,String major){ // this.name= name; //// this.age= age; // this.major=major; // // } // public void ead(){ // System.out.println("吃饭"); // } // public void sleep(){ // System.out.println("睡觉"); // } public void study(){ System.out.println("学习"); } }
测试
package com.chenxi.java; public class ExtendsTest { public static void main(String[] args) { Person p1 = new Person(); // p1.age = 1; p1.eat(); Student s1 =new Student(); s1.eat(); s1.sleep(); s1.setAge(9); System.out.println("-----------------"); s1.breath();//间接父类继承 System.out.println(s1.getAge()); } }
结果
吃饭 吃饭 睡觉 ----------------- 呼吸 9