一、子类对象实例化:
public class Test {
public static void main(String[] args){
Student1 stu = new Student1();
stu.setName("张三");
stu.setAge(21);
stu.setSchool("某某大学");
System.out.println("学生信息:" + stu.getName() + " " + stu.getAge() + " " + stu.getSchool());
}
}
class Student extends Person{
private String school;
public Student(){
/*子类构造方法有一个隐式super()调用父类构造方法*/
System.out.println("子类构造方法被调用");
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
class Person{
private String name;
private int age;
public Person(){
System.out.println("父类的构造方法被调用!");
}
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 Person(String name, int age){
this.name = name;
this.age = age;
}
编译器会报错,如何解决这一问题?
(1)给父类添加无参构造器:
public Person(){}
(2)在子类构造器中,使用super调用父类构造器,并且必须放在第一行的位置:
public Student(String name, int age, String school){
super(name, age);
this.school = school;
}
二、构造方法的继承原则:
(1) 子类无条件地继承父类的不含参数的构造方法。
(2) 若子类没有定义自己的构造方法,它将继承父类无参数的构造方法作为自己的构造方法。
(3) 若子类定义了自己的构造方法,它先执行继承自父类的无参数构造方法,再执行自己的构造方法。
(4) 对父类含参数的构造方法,子类可以通过在定义自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。
(5) 子类构造方法没有显式调用父类构造方法,而父类又没有无参构造方法时,则编译出错。
三、成员变量的隐藏和方法的继承和重写:
3.1 成员变量的隐藏:
如果子类的成员变量和父类的成员变量重名,子类就会隐藏继承的成员变量,子类中访 问的是子类重新声明的成员变量。
3.2 方法的继承:
父类非私有方法均可被子类所继承。
3.3 方法的重写:
(1) 子类重写的方法与父类的方法名,参数表和返回类型均相同。
(2) 重写的方法不能比父类的方法有更严格的访问权限。
访问权限: private < default < public
方法重写的作用:不改变源代码的情况下,对某一模块的功能进行改造。
(3) 当子类想要访问父类被重写的方法时,需要通过super关键字来调用父类被重写的方 法,super关键字的使用有两种情况:
<1> 访问父类的成员变量和成员方法:
super.成员变量名
super.成员方法名([参数表])
<2> 调用父类构造方法:
super([参数表])
(4)final关键字:
在Java中可以使用final关键字定义类、方法、属性:
在声明一个常量的时候所有单词的字母都必须大写,如果要想声明一个全局常量的 话public static final声明。
public static final String INFO = "hello"