目录 
如果父类中没有无参构造方法,创建子类时怎么调用父类构造器呢?
1.了解继承
继承是面向对象的三大特征之一.继承关系就如生活中的爸爸的东西,儿子可以继承下来一样.继承体现了一种"is a"的思想,比如猫咪是动物的一种,动物就是父类,猫咪则是子类.还有狗狗是动物的一种,动物就是父类,狗狗则是子类.
在java中,多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可,而这个类就是父类。就比如猫咪和狗狗都会睡觉.抽取到动物类中就可以.动物类就是父类.单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。在java中,子类可以继承父类的成员.
2.extends关键字
通过extends关键字可以实现类与类的继承
格式: class 子类名 extends 父类名 {}
来个继承的案例哈!定义父类Person,子类Student和Teacher.子类Student和Teacher继承父类Person.
当子类不满足父类的功能,子类就会重写父类的功能!(重写的相关介绍 ------ > 点击这里)
public class Person { //父类
String name;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void yule(){
System.out.println("喜欢打牌");
}
}
public class Student extends Person { //Student继承Person类
@Override
public void yule() { //重写并沿袭父类功能
super.yule();
System.out.println("学生打游戏");
}
public void study(){ //子类独有的方法
System.out.println("学习!");
}
}
public class Teacher extends Person{
public void teach(){ //子类独有的方法
System.out.println("教书");
}
@Override
public void yule() { //方法完全重写
System.out.println("老师看书!");
}
}
public class Test {
public static void main(String[] args) {
Student student=new Student();
student.name="张三";
System.out.println(student.name);
student.sleep(); //继承父类的方法
student.study(); //Student类独有的方法
student.yule(); //Student类重写后的方法
System.out.println("==================");
Teacher teacher=new Teacher();
teacher.name="李四";
System.out.println(teacher.name);
teacher.eat(); //继承父类的方法
teacher.teach(); //Teacher类独有的方法
teacher.yule(); //Teacher类重写后的方法
}
}
//输出结果
/*
张三
睡觉
学习!
喜欢打牌
学生打游戏
==================
李四
吃饭
教书
老师看书!
*/
3.继承的好处
- 提高了代码的复用性(将多个类中相同的属性和行为抽取到单独一个类中)
- 提高了代码的维护性(需要修改多个子类的共同功能时,只需要修改父类中的功能即可)
- 是多态的前提(多态只能在继承环境中产生)
4.继承的弊端
让类与类之间产生了关系,类的耦合性增强了。
开发的原则:高内聚,低耦合。(类与类的关系越松散(低耦合),并且独立完成某件事情的能力越强(高内聚)越好)
5.继承的注意事项
- Java只支持单继承,不支持多继承。(只能有一个父类)
- Java支持多层继承(继承体系)(就是子类有一个父类,而父类又有一个它自己的父类,对于子类来说就是继承了两层父类,继承了父类的父类!)
- 子类只能继承父类所有非私有的成员(成员方法和成员变量),私有的不能继承
- 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
- 不要为了部分功能而去继承(毕竟继承会增加耦合性,扩展力会变差)
(补:Object类时所有类的顶层父类,所有类都直接或间接继承该类哦!)
父类构造器的作用
创建子类对象时,会先调用父类的构造方法,完成父类的数据初始化!
public class Animal { //父类
//父类构造方法
public Animal(){
System.out.println("父类构造方法调用了!");
}
}
public class Cat extends Animal { //子类继承父类
//子类构造方法
public Cat(){
System.out.println("子类构造方法调用了");
}
}
pubic class Test{
public static void main(String[] args) {
Cat cat=new Cat();
}
}
那么创建子类对象时,为什么会先调用父类构造方法呢?
因为子类继承了父类的数据,甚至还要使用父类的数据,那如果说,父类没有先完成数据的初始化,子类何谈继承父类的数据,甚至要使用父类数据呢。所以我们在创建子类对象时,应该先完成父类数据的初始化,怎么完成,先调用父类的构造来完成父类数据的初始化。
如果父类中没有无参构造方法,创建子类时怎么调用父类构造器呢?
方法一: 在父类中添加一个无参的构造方法
方法二: 子类通过super去显示调用父类的带参的构造方法
(补: 子类通过this去调用的是本类的有参构造方法,而本类有参构造也必须首先访问父类构造方法)
注意事项: super(…)或者this(….)必须出现在第一条语句上.
(小编也在努力学习更多哟!以后会多多分享哒!)
希望对友友们有所帮助!!!!