类的继承
【类的继承】
**1. 继承的概念及作用:
继承:让一个类(子类)拥有另一个类(父类)的属性及方法,每个类只可有一个父类。
子类可以继承父类中所有非私有的属性和方法,同时也可以重新定义与父类同名的属性变量和方法。
Object类:所有Java类的最原始的父类,一个类没有明确指定继承关系时,则默认该类继承Object类,Object类包含了所有Java类的公共属性和方法。
继承作用:通过继承可以减少子类中部分属性及方法的重复编写,简化程序,同时也能很好的体现父类和子类之间的关系。
**2. 继承的使用:
格式:public class 子类名 extends 父类名 { }
**3. 访问权限:
当前类中 | 同一包下的子类 | 不同包下的子类 | 其他 | |
public(所有) | √ | √ | √ | √ |
protected(所有子类) | √ | √ | √ | × |
缺省(包访问) | √ | √ | × | × |
private(当前类) | √ | × | × | × |
**4. 属性变量的继承:子类可以继承父类中所有非私有的属性变量,当子类中定义与父类同名的属性变量时,在子类中将隐藏父类的同名属性。
方法的继承:子类中可以继承父类中所有非私有的方法。
重写:在子类中对父类中定义的方法重新定义,在子类中将隐藏来自父类的同形态方法。
方法重写之后,子类调用方法时调用的是重写之后的方法,若需要调用父类中的方法可以通过super来调用。
重写要求:① 必须有继承关系;② 方法的声明:访问权限可以扩大,其他必须保持一致。
**5. 自动转型:
①子类的对象可以自动转型为父类的对象
②自动转型后方法的调用以子类为准
③子类自动转型为父类之后不能调用子类独有的方法和属性,若要调用需将父类类型的对象强制转型为子类类型的对象
**6. 方法的重载:在同一类中定义多个同名的不同形态的方法
方法调用参数匹配原则:首先按照“精确匹配”原则去查找,再按照“自动类型转换匹配”原则去查找。
【实例一】
【程序】
//定义学生类 public class student { // 定义学生类属性 public int garde; public int age; public String name; public String banji; // 定义学生类的方法 public void setname(String n) { name = n; } public void study() { System.out.println(name + "在学习!"); } }
// 定义学生类后,要再对大学生类进行定义,大学生是学生的一种,学生所有的属性和方法大学生都具备,引入继承,让大学生类继承学生类,则学生类中的所有非私有属性及方法大学生类都继承。同时大学生类还有一些属性、方法是学生类不具备的,在大学生类中再对大学生独有的属性和方法进行定义!
// 定义大学生类 public class UNstudent extends student { // 大学生新属性的定义 public String major; // 方法的定义 public void setmajor(String maj) { major = maj; } // 方法的重写 public void study() { System.out.println("大学生" + name + "在学习!"); } public static void main(String[] args) { student stu = new student(); // 创建学生对象 stu.setname("张三"); // 方法的调用 stu.study(); student UNstu = new UNstudent(); // 创建大学生类,将大学生类自动转型成学生类 UNstu.setname("李四"); // 方法的调用 UNstu.study(); // 自动转型后调用的内容以子类为准,即UNstu调用的study为子类中重写的方法 UNstudent UNstu2 = (UNstudent) UNstu; // 自动转型后不能直接调用子类中特有的属性及方法,需要进行强制转型 UNstu2.setmajor("自动化"); // 调用子类中特有的方法 System.out.println("大学生" + UNstu.name + "主修" + UNstu2.major); } }
// 大学生类中有与学生类中相同的方法,但执行方式不同,例如:“学习”方法,学生类与大学生类的学习方法不同,于是在大学生类中需要对“学习”方法进行重写。
【输出结果】
【实例二】
【程序】
public class A { public void test(int x){ System.out.println("int:"+x); } public void test(double x){ System.out.println("double:"+x); } public static void main(String[] args){ A a = new A(); a.test(5); a.test(5.0); } }
【输出结果】
// 方法重载之后,根据参数类型进行方法的选择调用