继承
继承又分子类(派生类)和父类(基类),子类通过extends关键字来继承父类的所有特性,且可以在此基础上增加自身的特性。一个子类只能有一个父类,但一个父类可以有多个子类。继承是类与类之间的关系
package oop.demo04;
public class Demo01 extends Application{
}
这样Demo01就为子类,通过extends继承了父类Application的所有属性。
需要注意!!在父类中如果有private的私有属性,子类则不能继承这个属性,只可以通过get/set来获得使用权限。
在java中,存在着一个Object的隐藏类,所有类都默认直接或间接的继承了这个类,比如String类这些系统里的类都继承了Object类。可以通过ctrl + H来查看类的继承关系。Object类代表了一个类的初始化功能。
super关键字
在继承中,除了extends的继承关键字,还有一个super调用的关键字。
1. super与this近似,this代表调用当前类的方法,super代表调用当前这个类的父类的方法。但如果父类的方法是private的私有属性,则super也不能调用。
2. 在继承关系中,子类的构造器内又包含了一个隐藏的super(); ,代表这个子类构造器中,默认将父类构造器一起调用了
3. 在构造器中,super与this都是只能放在第一个,先执行。所以证明在构造器中,不能同时调用子类和父类,只能选择其中一个进行调用。
父类无参构造
package oop.demo04;
public class Application {
public Application() {
System.out.println("父类无参构造");
}
}
子类无参构造
package oop.demo04;
public class Demo01 extends Application{
public Demo01() {
System.out.println("子类无参构造");
}
}
测试类
package oop.demo04;
public class Demo02 {
public static void main(String[] args) {
Demo01 demo01 = new Demo01();
}/*输出后结果为 父类无参构造
子类无参构造
*/
}
因为创建对象的本质就是在调用构造器,所以在测试类创建子类对象,就相当于调用了子类的构造器。
由此得出: 子类的构造器中,默认生成了一个super();来调用父类构造器,且这个super();排在最上面,第一个输出。
快捷键为 alt + Ins
方法重写
重写 Override idea快捷键 Ctrl + O eclipse快捷键 Alt + /
方法的重写是由子类改变父类的静态方法
如何重写:由子类输出一个和父类的静态方法一模一样的静态方法,此时子类的静态方法默认会输出父类的这个静态方法。而在子类中的这个静态方法中写入其他属性,就可以更改此次的父类方法结果。这就是方法的重写
父类静态方法
package oop.demo04;
public class Application {
public void ii() {//静态方法
System.out.println("父类");
}
}
子类静态方法
package oop.demo04;
public class Demo01 extends Application{
public void ii(){//静态方法
System.out.println("子类");
}
}
测试类
package oop.demo04;
public class Demo02 {
public static void main(String[] args) {
Demo01 demo01 = new Demo01();//输出Demo01的静态方法结果
demo01.ii();
Application application = new Demo01();//输出Application的静态方法结果
application.ii();
}
}//得出结果 子类
方法重写注意事项!!
-
所需重写的类之间必须为继承关系
-
方法必须为静态方法
-
方法名必须相同
-
参数列表必须相同
-
修饰符:范围可以扩大但不能缩小 public>protected>default> private
-
抛出异常:范围可以被缩小,但不能扩大
重写!子类的方法必须要与父类的方法一致,但方法体不同。
为什么要重写?