继承
继承是什么?有什么好处?
1.继承是什么
从多个类当中抽离出多个相同的属性、方法作为父类然后直接继承他,自己就不用在写,减少了代码的冗余
继承父类,并在父类的基础上扩张某些功能
如图,把姓名、性别、年龄、身高、体重抽离到一个父类中
每次创建属于人的对象时,可以直接继承人这个父类,就不用去写这些属性和方法
减少代码的冗余,提高复用率
继承的语法
在定义子类的时候写上
extends 继承的父类
如:public class Student extends Proson(Proson就是父类,Studen继承了它)
public class Proson{
String name;
char sex;
int age;
public void eat(){
System.out.println("正在吃东西");
}
}
public class Student extends Proson { //extends继承Proson
int numberID;
int cclass;
public void study(){
System.out.println("正在学习!");
}
}
Student 中并没有name、sex、age属性和eat()方法,但是由于继承关系,实例出来的student却可以调用这些属性和方法
测试类:
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.name = "李华";
student.sex = '男';
student.age = 18;
System.out.println(student.name);
System.out.println(student.sex);
System.out.println(student.age);
student.eat();
}
}
遇到的问题
1.上面是父类中的属性和方法,子类中没有(或者说没有同名的,加入有同名的呢?)
比如:B继承A(B与A有同名属性和方法)
使用supper表示调用的是使用父类的属性和方法
父类代码:
public class Proson{
String name;
char sex;
int age;
public void eat(){
System.out.println("嘿嘿,父类正在吃东西");
}
}
//子类代码
public class Student extends Proson { //extends继承Proson
int numberID;
public void eat(){
System.out.println("哈哈,子类在吃饭");
super.eat(); //super关键字,表示此处调用的eat()是父类的eat()
}
public void study(){
System.out.println("正在学习!");
}
}
测试类:
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.eat();
}
}
运行结果
可以看到,经过super调用的会输出父类的方法,同理属性也如此
2.子类构造方法和父类构造方法先后执行的关系(在调用子类构造方法的时候会默认先调用父类的构造方法)
若自己没有定义子类的构造方法,程序在调用子类构造方法的时候会默认先调用父类的构造方法
父类:
public class Proson{
String name;
char sex;
int age;
public Proson() {
System.out.println("我是父类的构造方法");
}
}
子类:
public class Student extends Proson { //extends继承Proson
int numberID;
public Student() {
System.out.println("我是子类的构造方法");
}
}
测试类:
public class Test {
public static void main(String[] args) {
Student student = new Student();
}
}
运行结果:
在java中,当用户没有自己定义构造方法的时候,子类程序自动调用默认构造方法,会先调用父类的构造方法,在调用子类的构造方法
重写
1.是什么?
父类方法不符合子类的场景,子类定义同名同参数的方法对方法的实现进行修改(重写是对父类的方法进行扩展修改),且不会覆盖父类方法
2.语法使用
子类方法定义与父类相同(即方法名、返回值、参数都相同)
父类:
public class Proson{
String name;
char sex;
int age;
public void eat(){
System.out.println("人类吃东西");
}
}
子类:
public class Student extends Proson { //extends继承Proson
int numberID;
public void eat(){
System.out.println("学生正在食堂吃饭");
super.eat();
}
}
人类吃东西这个方法实现不适合学生的用餐
我们在学生类里面重写成,学生正在食堂用餐
测试类:
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.eat();
}
}
运行,结果如图
实现了对父类方法的重写,现在调用eat()方法就是调用的重写之后的方法
3.重写和重载只有一直只差,它们有什么区别呢?
语法角度:
重载是方法名相同,参数不同;重写是方法的定义完全相同
使用场景:
重载是在同一类中;重写是在子类继承父类的过程中,不在同一类
注意:子类重写父类方法的过程中,其修饰符的作用范围一定要比父类的作用范围大(比如父类为private,子类也要为private或者public)