一、继承
继承的限制:
限制1: 在Java中一个类只允许继承一个父类
class A{
}
class B extends A{
}
class C extends B{
}
虽然无法使用多重继承,但是可采用多层继承,但是注意,在进行多层继承的时候不要超过3层
限制2: 子类会继承父类的全部操作,对于父类的私有操作属于隐式继承,对于父类的非私有操作属于显示继承
错误示例:
class Person{
private String name;
}
class Student extends Person{
public void set() {
this.name="hello"
}
}
虽然不能访问,但是确实被继承下来了。
解决方案是写set()和get()方法,所以以上继承成为隐式继承。
限制3: 子类对象在进行对象实例化时,会默认调用父类构造(默认执行父类的无参构造方法),然后再调用子类构造为子类对象实例化
class Person{
public Person() {
System.out.println("***************");
}
}
class Student extends Person{
public Student() {
System.out.println("###############");
}
}
public class gogogo{
public static void main(String args[]) {
Student stu=new Student();
}
}
之所以这样是因为在子类构造方法中隐藏了super()语句,表示由子类调用父类的构造方法,如果没有参数则调用父类的无参构造方法,这样的语句只能够放在子类构造方法的首行。
- 这时出现了一个疑问,this和super都要放在首行,会发生冲突,如果在子类构造方法的首行里,写了this(),那是不是就表示不需要调用父类构造,就可以直接调用子类构造呢?
class Person{
public Person() {
System.out.println("***************");
}
}
class Student extends Person{
private String school;
public Student() {
this("hunanAgriculture");
System.out.println("###############");
}
public Student(String school) {
this.school=school;
}
}
public class gogogo{
public static void main(String args[]) {
Student stu=new Student();
}
}
之所以这样是因为在public Student(String school)这个有参构造方法中隐藏了super()语句。
错误示例:
class Person{
public Person() {
System.out.println("***************");
}
}
class Student extends Person{
private String school;
public Student() {
this("hunanAgriculture");
System.out.println("###############");
}
public Student(String school) {
this();
this.school=school;
}
}
public class gogogo{
public static void main(String args[]) {
Student stu=new Student();
}
}
编译无法通过。在使用this调用本类构造方法的时候,一定要为super留一个出口。即:子类构造之前一定要调用父类构造。
二、重写
重写的条件:
1.子类定义了和父类相同的方法名
2.返回值类型相同
3.参数列表相同
注:有了继承的概念之后,对于this和super的使用
- this:表示先从本类查找,如果本类没有再查找父类。
- super:表示不查找本类,直接查找父类。
如果是调用已经被子类重写的方法,一定要加上super关键字。
但是在进行方法重写的时候要注意权限的问题,被子类重写的方法不能使用比父类更严格的权限。
权限表如下:
权限排序:private < default < public
严格程度:private > default > public - 重载和重写的区别:
提问: 如果父类定义的方法是private权限,那么子类重写的方法是public,是否正确?看下例
class Person{
private void print(){
System.out.println("Person lei,public void print() ");
}
public void fun() {
this.print();
}
}
class Student extends Person{
public void print() {
System.out.println("Student lei,public void print() ");
}
}
public class gogogo{
public static void main(String args[]) {
Student stu=new Student();
stu.fun();
}
}
如果方法使用了private声明,那将不会存在重写这一概念,而在实际情况中也基本不会出现这种情况。
总结: this和super的区别
- this:调用本类属性(this.属性)、本类普通方法(this.方法())、调用构造(this(),必须放在首行)
- super:子类调用父类属性(super.属性)、调用父类的非私有方法(super.方法())、调用父类构造(super(),要放在子类构造首行)
- 当使用this和super调用构造的时候不能同时出现