继承
1.概念
-
子类继承父类,就可以拥有父类的属性和方法,私有的除外.属于单继承关系,一个类只能继承一个父类.
-
把多个子类共有的属性和方法抽取出来放到父类里面,提供给子类使用,私有的除外.
-
优点:代码重用,提高了工作效率,扩展性变强.
-
父类叫基类,也叫超类。子类也叫派生类。
-
示例:
(1)父类-人类
/** * 父类 人类 * * */ public class Person { private String name; private int age; private char sex; public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public Person(String name, int age, char sex) { super(); this.name = name; this.age = age; this.sex = sex; } public void study() { System.out.println("我是人,我可以学习!"); } }
(2)子类1-学生类
package day19; /** * 学生类继承父类Person * * */ public class Student extends Person { public Student(String name, int age, char sex) { super(name, age, sex); } public Student() { } //学费 double money; public void playGame() { super.study();//调用父类的方法 System.out.println("我是学生可以打游戏!"); System.out.println("学生信息:姓名:" + super.getName()+"年龄:"+ super.getAge()+"性别:" + super.getSex()+"我的学费:" + this.money); } }
(3)子类2-老师类
/** * 老师类 * * */ public class Teacher extends Person{ //工资 double money; private Teacher(String name, int age, char sex) { super(name, age, sex); } Teacher() { super(); } //做足疗 public void foot() { System.out.println("我是老师,我可以做足疗!"); System.out.println("老师信息:姓名:" + super.getName()+"年龄:"+ super.getAge()+"性别:" + super.getSex()+"我的工资:" + this.money); } }
(4)测试
public class Test { public static void main(String[] args) { //子类可以继承父类的属性和方法 Student stu = new Student(); stu.setName("张三"); stu.setAge(21); stu.setSex('男'); stu.money= 1000; stu.study(); stu.playGame(); Teacher ter = new Teacher(); ter.setName("李四"); ter.setAge(42); ter.setSex('男'); ter.money = 5000; ter.study(); ter.foot(); } }
2.this和super的区别
- this:代表当前的对象的引用,this可以调用到本类的属性和方法,this(name,age)也可以调用本类的构造方法
- super:调用父类属性和方法以及super(name,age)调用父类的构造方法
- 在子类没有重写父类的情况下,也可以通过this调用父类的方法.
3.方法执行顺序
继承关系下,会优先走父类的无参构造方法,再去走子类的无参构造方法,后期可以把一些初始化值的工作给子类
4、方法重写与方法重载的区别
- 方法重载overloding
- 在同一个类中,多个方法名相同,但参数的顺序、类型、个数不同,与返回值无关,叫做方法重载。
- 方法重写override
- 在继承关系下,子类和父类(基类)的方法名相同、参数、个数都相同,具体实现不同,叫做方法覆盖,也叫方法重写
- 优点:扩展性更强
5.abstract修饰抽象类和抽象方法
- abstract修饰的类叫抽象类,abstract修饰的方法叫抽象方法
- 抽象方法没有方法体,不做具体的实现,继承该类的子类必须重写父类的抽象方法,优势:扩展性强
- 抽象类不能被实例化
- 抽象类不仅可以有抽象方法,也可以有普通方法
/**
* abstract修饰的类叫抽象类
* 抽象类不能被实例化
* 抽象类不仅可以有抽象方法,也可以有普通方法
*
*/
public abstract class Person {
private String name;
private int age;
//抽象方法
public abstract void eat();
public void sleep() {
System.out.println("抽象类中的普通方法,人睡觉");
}
}
6. 向上转型和向下转型
-
创建子类以父类类型接受,叫向上转型
-
可以调到被重写的方法和父类特有方法,
-
调用不到子类的特有方法,需要将父类类型的对象向下转型
public class Test { public static void main(String[] args) { //abstract修饰的类不能实例化 //Person per = new Person(); //创建子类以父类类型接受,叫向上转型 //可以调到被重写的方法和父类特有方法, //调用不到子类的特有方法,需要将父类类型的对象向下转型 Person per = new Student(); per.eat(); per.sleep(); //向下转型 Student student = (Student)per; student.showStudent(); } }
7.Object类
Object类型是所有类的父类,也可以叫所有类的根类,所有的类都继承与它.子类默认Object类提供的一些方法,比如equals()、toString()方法,具体查API.