子类不能继承父类中的构造方法
我们在什么时候可以使用继承呢?
当两个类之间存在"is a"的关系的时候,我们就可以使用继承
举例子:
人类
学生类
老师类
狗类
人类 is a 学生类 XXX 所以人类不能继承学生类
人类 is a 老师类 XXX 所以人类不能继承老师类
人类 is a 狗类 XXX 所以人类不能继承狗类
学生类 is a 人类 所以学生类可以继承人类
学生类 is a 老师类 XXX 所以学生类不能继承老师类
学生类 is a 狗类 XXX 所以学生类不能继承狗类
老师类 is a 人类 所以老师类可以继承人类
老师类 is a 学生类 XXX 所以老师类不能继承学生类
老师类 is a 狗类 XXX 所以老师类不可以继承狗类
class Person {}
class Student extends Person {}
class Teacher extends Person {}
class Dog {}
注意:我们不能单单为了获取某个功能而瞎去继承一个类
class Bird {
public void fly() {
}
}
class Person extends Bird {
/*
public void fly() {
}
*/
}
class Demo {
public static void main(String[] args) {
Person p = new Person();
p.fly();
}
}
在子父类继承中成员变量的关系?
在父类中有一个成员变量,在子类中有一个成员变量,在子类的成员方法中有一个局部变量
如果这三个变量的名字都不同的话:
class Fu {
int i = 1;
}
class Zi extends Fu {
int j = 2;
public void print() {
int a = 3;
System.out.println(a);//3
System.out.println(j);//2
System.out.println(i);//1
}
}
class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.print();
}
}
如果这三个变量的名都相同的话:
class Fu {
int i = 1;
}
class Zi extends Fu {
int i = 2;
public void print() {
int i = 3;
System.out.println(i);//3
System.out.println(i);//3
System.out.println(i);//3
}
}
class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.print();
}
}
结果打印是3,那如果想要分别打印出1,2,3该怎么办?
class Fu {
int i = 1;
}
class Zi extends Fu {
int i = 2;
public void print() {
int i = 3;
System.out.println(i);//3
System.out.println(this.i);//2
System.out.println(super.i);//1
}
}
class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.print();
}
}
在子父类继承中构造方法的关系?
1.子类在中的所有的构造方法的第一行,默认都有一个super()
class Fu {
String name;
public Fu() {
}
}
class Zi extends Fu {
public Zi() {
//super();//调用父类的空参构造
}
public Zi(String name) {
//super();//调用父类的空参构造
}
public Zi(int age) {
//super();//调用父类的空参构造
}
public Zi(String name, int age) {
//super();//调用父类的空参构造
}
}
class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
System.out.pintln(zi.name);//null
}
}
为什么会有这样的现象呢?
因为有继承,说明子类可以使用父类的成员变量,那也就意味着父类的成员变量一定要有一直才可以被
使用,所以在创建类对象的时候,会调用子类的构造方法,而子类的构造方法中会先去调用父类的构造
方法,目的就是给父类的额成员变量默认初始化
2.子类中的所有的构造方法中,第一行要么是super(参数),要么是this(参数),他们不可以共存
class Fu {
}
class Zi extends Fu {
public Zi() {
this("");//调用了下面的有参构造方法
}
public Zi(String name) {
//super();
}
}