1、子类对象实例化过程
在继承操作中,实例化子类对象的时候,会先调用父类的构造方法,然后再调用本类的构造方法。
class Person{
private String name;
private int age;
public Person(){
System.out.println("父类构造方法");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student extends Person{
private String school;
public Student(){
// super(); 默认隐藏了调用父类构造方法的super方法
System.out.println("子类构造方法");
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
public class InstanceDemo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("张三");
stu.setAge(18);
stu.setSchool("NanKai");
System.out.println("姓名:" + stu.getName() + " 年龄:" + stu.getAge() + " 学校:" + stu.getSchool() );
}
}
// 运行结果:
父类构造方法
子类构造方法
姓名:张三 年龄:18 学校:NanKai
2、方法的覆写
所谓方法的覆写就是子类里定义了和父类一样名称的方法,但是子类同名方法的权限不能拥有比父类方法更加严格的访问权限。访问权限有三种,private, default, public。
比如父类一个方法的访问权限是public,那么子类覆写该方法的权限只能是public,否则编译会报错。
class Person{
void print(){
System.out.println("Person --> void print()");
}
}
class Student extends Person{
public void print(){
System.out.println("Student --> void print()");
}
}
public class OverrideDemo{
public static void main(String args[]){
Student s = new Student();
s.print();
}
}
// 运行结果
Student --> void print()
如果想要调用父类的方法该怎么办?我们可以用super关键字
class Person{
void print(){
System.out.println("Person --> void print()");
}
}
class Student extends Person{
public void print(){
super.print();
System.out.println("Student --> void print()");
}
}
public class OverrideDemo{
public static void main(String args[]){
Student s = new Student();
s.print();
}
}
// 运行结果
Person --> void print()
Student --> void print()
如果将父类的方法设置为private访问权限,子类覆写的方法设置为default权限,是否可以继承呢?
class Person1{
private void print(){
System.out.println("父类print方法");
}
public void fun(){
this.print();
}
}
class Student1 extends Person1{
void print(){
System.out.println("子类print方法");
}
}
public class OverrideDemo {
public static void main(String[] args) {
Student1 s = new Student1();
s.fun();
}
}
// 运行结果:
父类print方法
可以看到,子类覆写了父类的print方法,子类实例化对象调用父类的fun方法,而fun方法的功能是调用print方法,但是由于父类否print方法是private访问权限,因此子类所谓的覆写其实并没有覆写,而是相当于在子类里又重新定义了一个方法。
3、覆写和重载的区别
4、super关键字
super表示的是从子类调用父类的指定操作,例如调用属性,方法,构造等。而子类在实例化对象的时候会先调用父类无参的构造方法,如果希望调用有参的构造方法,则必须在子类中声明
class Person1{
private String name;
private int age;
public Person1(String name,int age){
this.setName(name);
this.setAge(age);
}
// setter & getter 方法
}
class Student1 extends Person1{
private String school;
public Student1(String name,int age,String school){
super(name,age); // 明确调用父类中有两个参数的构造
this.school = school;
}
// setter & getter 方法
}
public class OverrideDemo {
public static void main(String[] args) {
Student1 s = new Student1("张三",20,"Tsing U");
}
}
this 和 super关键字的区别