一.为什幺继承?
继承就是当你写一个类时,虽然这个类满足了某些功能但是你又想拓展它的功能,此时你就可以使用继承机制在写一个该类的子类,
来完成你需要的功能,而不用重头到尾重新写,一旦子类继承了父类就拥有了父类的方法,在子类中也可以重写父类的方法,
覆盖父类中同名的方法,继承的优点是提高了代码的效率,避免了代码重写。
二.格式
public class 类名(子类、派生类、超类) extends 类名(父类、基类) {
}
子类只能继承一个父类(单继承),但可以连续继承。
三. 子类继承到了父类的所有属性和方法(private、默认的、protected、public)
但是,即使继承到了,也不一定可以使用,否则就会报错
这些是继承后不同的使用情况
同类中 同包中 不同包中 不同包但是有继承关系的子类中
private 可以 不可以 不可以 不可以
默认 可以 可以 不可以 不可以
protected 可以 可以 不可以 可以
public 可以 可以 可以 可以
四.方法重写
就是父类和子类有一个方法名是一样的,这时就是方法重写
1.必须要存在继承关系。
2.子类方法的访问修饰符要大于或者等于父类方法的访问修饰符。
3.子类方法的返回值类型、方法名、参数都必须要和父类的完全一致。
4.子类方法的方法体,必须要和父类方法的方法体不同。
五.自动转型
如有一个父类:
public class Person{
private int age;
private boolean sex;
public int getAge();{
return age;
}
public void eat();{
System.out.println("eat");
}
}
子类: public class student extends Person{
private String name;
public void eat();{
System.out.println("没吃!!"); //重写
}
在主函数中,如果我们这样:
Person A=new student();
是创建了一个子类对象并把它当成父类对象A用
此时,引用变量A有2个类型,编译时的类型为Person,运行时的类型为student.在代码编译过程中,Person只能调用属于
Person的方法. 不能调用student类里面的方法.注意,由于继承关系,如果student重写了Person的某个方法,比如说eat(),
而在代码编译过程中,A.eat()调用的是A的eat(),但在程序运行时,却运行的是student的eat(). 这就是多态
如果还有一个函数这样
public void geteat(Person person){
System.out.println(person.eat());
}
则这样调用
Person per1=new Person();
student stu1=new student():
student stu2=new student():
geteat(per1); // 调用的是per1的eat()
geteat(stu1); // 调用的是stu1的eat()
geteat(stu2); // 调用的是stu2的eat()
为什么geteat()的参数类型为Person,而student类型的也行呢?
这就是上面说的自动转型,也可以这样理解,因为student继承了Person,所以student包含了Person所以内容,能通过编译,
而在运行时,则是调用自己的方法。
继承就是当你写一个类时,虽然这个类满足了某些功能但是你又想拓展它的功能,此时你就可以使用继承机制在写一个该类的子类,
来完成你需要的功能,而不用重头到尾重新写,一旦子类继承了父类就拥有了父类的方法,在子类中也可以重写父类的方法,
覆盖父类中同名的方法,继承的优点是提高了代码的效率,避免了代码重写。
二.格式
public class 类名(子类、派生类、超类) extends 类名(父类、基类) {
}
子类只能继承一个父类(单继承),但可以连续继承。
三. 子类继承到了父类的所有属性和方法(private、默认的、protected、public)
但是,即使继承到了,也不一定可以使用,否则就会报错
这些是继承后不同的使用情况
同类中 同包中 不同包中 不同包但是有继承关系的子类中
private 可以 不可以 不可以 不可以
默认 可以 可以 不可以 不可以
protected 可以 可以 不可以 可以
public 可以 可以 可以 可以
四.方法重写
就是父类和子类有一个方法名是一样的,这时就是方法重写
1.必须要存在继承关系。
2.子类方法的访问修饰符要大于或者等于父类方法的访问修饰符。
3.子类方法的返回值类型、方法名、参数都必须要和父类的完全一致。
4.子类方法的方法体,必须要和父类方法的方法体不同。
五.自动转型
如有一个父类:
public class Person{
private int age;
private boolean sex;
public int getAge();{
return age;
}
public void eat();{
System.out.println("eat");
}
}
子类: public class student extends Person{
private String name;
public void eat();{
System.out.println("没吃!!"); //重写
}
在主函数中,如果我们这样:
Person A=new student();
是创建了一个子类对象并把它当成父类对象A用
此时,引用变量A有2个类型,编译时的类型为Person,运行时的类型为student.在代码编译过程中,Person只能调用属于
Person的方法. 不能调用student类里面的方法.注意,由于继承关系,如果student重写了Person的某个方法,比如说eat(),
而在代码编译过程中,A.eat()调用的是A的eat(),但在程序运行时,却运行的是student的eat(). 这就是多态
如果还有一个函数这样
public void geteat(Person person){
System.out.println(person.eat());
}
则这样调用
Person per1=new Person();
student stu1=new student():
student stu2=new student():
geteat(per1); // 调用的是per1的eat()
geteat(stu1); // 调用的是stu1的eat()
geteat(stu2); // 调用的是stu2的eat()
为什么geteat()的参数类型为Person,而student类型的也行呢?
这就是上面说的自动转型,也可以这样理解,因为student继承了Person,所以student包含了Person所以内容,能通过编译,
而在运行时,则是调用自己的方法。