1.为什么要有继承
- 根据访问权限修饰符的不同,子类可以继承父类中某些成员变量和方法,提高了代码的重用性,子类也可以添加新的成员变量和方法
如下面是父亲的
public class Father {
String name;
String number;
String mobile;
public void eat() {
System.out.println("使用筷子吃饭......");
}
}
则在继承父类的某些方法或属性时就可以这样简化代码:
public class Student extends Father{
public static void main(String[] args) {
Student student=new Student();
student.eat();
}
}
运行结果则为父类的方法,即为用筷子吃饭......
2.什么是继承
- 继承是面向对象编程的三大特征之一,是一种基于已有类来创建新类的机制。由继承而得到的类称为子类(或派生类),被继承的类称为父类(或超类)。
- Java中每个类只允许有一个父类。语法如下:class <子类> extends <父类>
3.其他
- 继承是创建类的一个新的方式
- 如果一个类没有显示继承某个类,则该类默认继承Object类,且需要注意的是Object类是所有类的直接父类或间接父类
- 子类可以继承父类的某些方法和属性,但一定不能是private
- 如果子类中属性与父类中属性重复,则子类对象调用该属性使用的是子类的属性,这时如果必须调用父类中的属性,则有:
子类非静态方法或代码块使用super;如果是静态代码块或静态方法,则新建父类对象;
- 如果类被final修饰,则该类不能被继承:
public final class Father {
String name;
String number;
String mobile;
public void eat() {
System.out.println("使用筷子吃饭......");
}
}
此时Student在继承该父类时就会报错
- Java中已有的类(诸如Void、String、Class、Scanner、System、8种基本数据类型对应包装类等类)已经被final修饰,所以这些类不能被继承。
- 如果父类拥有无参构造方法(无论隐式的还是显式的)且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中没有调用该子类其它构造方法的构造方法使用super()隐式调用父类的无参构造方法,如下代码:
public Student(String id, String headmasterId) {
super();//必须放在有效代码的第一行
System.out.println("子类构造方法......");
this.id = id;
this.headmasterId = headmasterId;
}
public class Person {
String name; //姓名
String certificateId;//身份证id
public Person(){
System.out.println("父类中无参构造方法......");
}
}
public class Student extends Person{
String id; //学号
String headmasterId;//班主任id
public Student(){
System.out.println("子类无参构造方法......");
}
public Student(String id){
this();
this.id = id;
System.out.println("子类有参构造方法......");
}
public static void main(String[] args) {
new Student("2012090203118");
}
}
- 如果父类没有无参构造方法(无论隐式的还是显式的),则要求子类构造方法必须直接或间接指定调用父类哪个构造方法并且放在有效代码第一行,如下代码:一句话:子类必须调用父类的构造方法。
- 当子类成员变量和父类成员变量同名时,对子类对象来讲,父类的成员变量不能被子类继承(即子类的成员变量覆盖了父类的成员变量),此时称子类的成员变量隐藏了父类的成员变量。
- 如果要在子类非static修饰的代码块或方法中使用被隐藏的父类成员变量可以通过super关键字实现。