继承
-
继承的本质是对类的抽象,就比如动物类里面有胎生类,卵生类,然后还可以往下细分出一些其他的爬行类等等,后面派生出的类都继承了前类的一些特性,可以类比于对象与类的关系。
-
继承是一种类与类之间的关系(子类与父类之间从意义上讲有一种“is a”的关系),类与类之间的关系还有依赖,聚合,组合等。
-
继承的关键字是 extends ,该单词意思为“拓展”,即子类是父类的拓展。
-
extands继承存在于类与类之间,一个子类(派生类)不能继承多个父类(基类),但是一个父类可以被多个类继承,即一个儿子只能有一个亲爸爸,但是一个爸爸可以有多个亲儿子。
-
子类如果继承了父类,则可以调用父类中的所有构造方法 与 public、protected、默认(default)修饰符修饰的类,如果父类中的一些属性被private修饰符修饰,则子类无法继承这些属性。
-
在Java中所有类都直接或间接的默认继承Object 类,即Object是所有类的老祖宗。
源码为:
public class Application {
public static void main(String[] args) {
Cat cat = new Cat();
cat.age=1;
cat.name="小猫咪~";
System.out.println("cat的年龄为:"+cat.age);
System.out.println("cat的名字为:"+cat.name);
cat.Cry();
}
}
class Cat extends Animal{
//子类继承了父类,即使子类什么都没写也有可以调用的属性与方法
}
class Animal /*extends Object 本身就是默认继承Object类*/{
public int age;
public String name;
public void Cry(){
System.out.println(this.name+" is crying");
}
}
IDEA中Ctrl+H可以展示出当前类的继承关系的树形图
super关键字
- super与this关键字都不能在静态方法中被使用。
super 父类 - this 当前类 - 针对于父类与子类的属性的调用
源码如下:
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.Print("主类的name");
}
}
class Person{
String name="父类的nanme";
}
class Student extends Person{
String name="子类的name";
public void Print(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
- 针对于父类与子类的方法的调用
源码如下:
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test();
}
}
class Person{
public void Print(){
System.out.println("这是父类");
}
}
class Student extends Person{
public void Print(){
System.out.println("这是子类");
}
public void test(){
Print();
this.Print();
super.Print();
}
}
- 子类与父类中无参构造方法的执行情况
源码如下:
public class Application {
public static void main(String[] args) {
//使用new关键词,默认调用无参构造函数
Student student = new Student();
}
}
class Person{
public Person() {
System.out.println("父类中无参构造函数被调用");
}
}
class Student extends Person{
public Student() {
System.out.println("子类无参构造函数被被调用");
}
}
-
问题:new了一个student类,它的无参构造函数被调用了,但是其父类也被调用了,而且还是在子类被调用之前被调用的。
-
解析:其原因是因为使用继承关系的子类的无参构造方法中都有一个super();(调用父类的无参构造方法) 方法,且位于子类无参构造方法的模块之首。相当于是一个隐藏的方法。
利用super(); this();在无参构造函数中调用子类以及父类的构造函数的话,必须放在无参构造函数之首,且两者不可同时在子类的无参构造方法中出现,单个出现是可以的。
以下图片是对上段话的演示:
this与super使用方法总结:
- super:
1、super调用父类的构造方法,必须在构造方法的第一个
2、super必须只能出现在子类的方法或者构造方法中
3、super和this不能同时出现在调用构造方法
this与super的一些区别:
- 代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用 - 前提:
this:没有继承也可以使用
super:只能在继承条件下才可以使用 - 构造方法:
this():本类的构造
super():父类的构造