继承 在 Java 中,类的继承只能是单一继承,也就是说,一个子类只能拥有一个父类。
Java 中用 extends 关键字来实现继承。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class Father { private String name; private int age; public Father (String name,int age) { this .name = name; this .age = age; } 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; } }
1 2 3 4 public class Son extends Father {}
继承的特点:
子类拥有父类非 private 的属性和方法
子类可以拥有自己的属性和方法
子类可以用自己的方式实现父类的方法
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类
Java 中用 extends 关键字来实现继承,用 super 关键字来实现对父类成员的访问,用来引用当前对象的父类,用 this 关键字指向自己的引用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class Son extends Father { private String fatherName = "baba" ; public Son (String name,int age,String fatherName) { super (name,age); this .fatherName = fatherName; } public String getFatherName () { return fatherName; } public void setFatherName (String fatherName) { this .fatherName = fatherName; } public static void main (String[] args) { Son s = new Son("sillywa" ,23 ,"myfatyher" ); System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getFatherName()); } }
*子类是不能继承父类的构造方法的,它只是隐式调用。如果父类的构造方法带有参数,则必须在子类的构造器中显式通过 super 关键字调用父类的构造方法并配有适当的参数。且必须在子类构造方法的第一行**
如果父类构造方法没有参数,则在子类的构造方法中不需要使用 super 关键字调用父类构造方法,系统会自动调用父类的无参构造方法。
Java 中所有的类都继承 Object 类,如果一个类没有使用 extends 关键字明确标识继承另一个类,那么这个类默认继承 Object 类。
Object 类的 toString() 方法返回对象的哈希 code 码(对象地址字符串)。
Object 类的 equals() 方法比较对象的引用是否指向同一块地址。
覆盖方法 当父类中的有些方法对子类并不适用时,子类可以重写父类的方法。
1 2 3 4 5 6 7 8 9 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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 public class Father { private String name; private int age; public Father (String name,int age) { this .name = name; this .age = age; } public String showDescription () { return "我是父亲:" + name; } 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; } } ```` ```java public class Son extends Father { private String fatherName = "baba" ; public Son (String name,int age,String fatherName) { super (name,age); this .fatherName = fatherName; } @Override public String showDescription () { return "我是儿子:" + this .getName(); } public String getFatherName () { return fatherName; } public void setFatherName (String fatherName) { this .fatherName = fatherName; } public static void main (String[] args) { Son s = new Son("sillywa" ,23 ,"myfatyher" ); System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getFatherName()); System.out.println(s.showDescription()); } }
在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别地,如果超类方法是 public,子类方法一定要声明为 public。
阻止继承:final类和方法 有时候可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为 final 类。如果定义类时使用了 final 修饰符就表明这个类是 final 类。例如希望阻止人们定义 Son 类的子类,就可以在定义这个类时使用 final 修饰符。
1 2 3 public final class Son extends Father { ... }
类中的方法也可以被声明为 final。如果这样做,子类就不能重写这个方法(final 类中的所有方法自动地成为 final 方法,不包括成员变量)。