继承是java面向对象编程的基石,继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
本质是复用已存在的方法和域
public class Person {
public void run() {
System.out.println("任何人都可以跑。。。");
}
}
class Student extends Person{
private void eat() {
System.out.println("学生正在吃。。。。");
}
public static void main(String[] args) {
Student student = new Student();
student.run();
student.eat();
}
}
方法重载与方法覆盖
1.方法重载![](https://i-blog.csdnimg.cn/blog_migrate/edee462089be3fd102c106b99b5ef0d3.jpeg)
public class Overloading {
public int test(){
System.out.println("test1");
return 1;
}
public void test(int a){
System.out.println("test2");
}
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}
public String test(String s,int a){
System.out.println("test4");
return "returntest4";
}
public static void main(String[] args){
Overloading o = new Overloading();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
}
2.方法覆盖
在有些时候,子类当中需要调用父类当中的方法,但是父类当中的方法对子类来说并不一定适用。这个时候我们就需要使用到方法的覆盖。例如
public class Person {
public void run() {
System.out.println("任何人都可以跑。。。");
}
}
class Student extends Person{
public void run() {
System.out.println("这个学生在跑。。。");
}
private void eat() {
System.out.println("学生正在吃。。。。");
}
public static void main(String[] args) {
Student student = new Student();
student.run();
student.eat();
}
}
//方法的覆盖
//子类和父类当中都有相同的方法,
//子类通过重写父类方法实现方法的覆盖
public void getRun() {
System.out.println("所有小猫杜能跑。。。。");
}
//一个方法的签名是由方法名称以及参数列表所组成
//方法的重载是指在一个类当中有相同的方法名不同的参数列表
public void getRun(int s) {
System.out.println("所有小猫杜能跑。。。。"+s);
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.getRun();
}
你看run里面的方法发生了变化,这就是方法覆盖,调用了自己的方法
重载和重写的区别
重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序
不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父
类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类
方法访问修饰符为 private 则子类就不能重写该方法。
super关键字
super可以通过调用父类方法,较为简便,以下的图Student调用了Person的Run方法
继承层次
继承只能为单继承(因为多继承太过雍容复杂,java进行了淘汰),但仍可通过接口进行多继承