学习笔记——覆写(方法、属性)

定义:子类与父类产生继承关系以后,会继承父类的全部操作。如果子类发现父类不足进行补充修改,但是需要保留父类属性和方法,就进行覆写。


方法覆写

方法的覆写:当子类定义了与父类方法名称相同,参数类型及个数完全相同的时候就称为覆写。
例子:

class Lianjie{
public void connect(){
System.out.println("【父类】连接所有资源");
  }
}
class Lianjieshujuku extends Lianjie{
public void connect(){  //保留已有方法名称,而后进行覆写
System.out.println("【子类】连接数据库 ");
  }
}
public class Jicheng{
public static void main(String args[]){
	Lianjieshujuku a=new Lianjieshujuku();
	a.connect();
  }
}

输出结果:【子类】连接数据库

由于实例化的是子类对象,所以优先调用的是覆写以后的子类方法,如果子类没有进行方法覆写,则调用父类方法。覆写的意义在于优化父类功能。
如果在进行方法覆写之后,需要继续调用父类方法,就需要使用super.方法( )
例子:

class Lianjie{
public void connect(){
System.out.println("【父类】连接所有资源");
	}
}
class Lianjieshujuku extends Lianjie{
public void connect(){  //保留已有方法名称,而后进行覆写
super.connect();//调用父类方法 
System.out.println("【子类】连接数据库 ");
	}
}
public class Jicheng{
public static void main(String args[]){
	Lianjieshujuku a=new Lianjieshujuku();
	a.connect();
    }
}

输出结果:
【父类】连接所有资源
【子类】连接数据库
此时在覆写过程中调用父类方法,即输出子类覆写以后的方法,又调用了父类以前的方法。


方法覆写限制

覆写要求:覆写的方法不能拥有比父类严格的访问控制权限。
已接触过访问控制权限:public > default > private
如果父类定义了default类型,那么子类只能使用default或者public定义。如果父类定义了public,那么子类是能是public。
private既可以定义与属性也可以定义于方法,但是覆写时不使用private,例子如下:

class Lianjie{
private void connect(){
System.out.println("【父类】连接所有资源");//父类权限为private
    }
public void sun(){
this.connect();
    }
 }
class Lianjieshujuku extends Lianjie{
//此时并不是覆写,因为父类方法不可见,覆写时不牵扯private
public void connect(){  //保留已有方法名称,而后进行覆写
System.out.println("【子类】连接数据库 ");
	}
 }
public class Jicheng{
public static void main(String args[]){
	Lianjieshujuku a=new Lianjieshujuku();
	a.sun();
	}
}

输出结果:【父类】连接所有资源
此时子类对象a调用sun()方法,完全执行的是父类方法。覆写此时无效,因为父类方法为private,覆写时无法调用。
因为父类方法不可见,此时也不是覆写,如果用super调用父类方法,程序会发生错误。覆写时不牵扯private权限。


属性覆盖

定义:当子类定义了与父类相同名称的成员的时候就称为属性覆盖。
注意:
·this在使用过程中,调用的对象是当前类中的属性方法,如果当前类中没有进行覆写,则使用父类中的属性方法。所以通过this调用本类中属性进行覆写,对于覆写属性必须放在本类方法之外。
·如果对父类进行封装,则子类无法调用其属性成员,但是可以通过定义public方法返回父类属性成员,子类通过调用父类方法获得父类成员属性。

class Lianjie{
private String b="工大";
  public String getInfo(){
  return this.b;
   }
  }
class Lianjieshujuku extends Lianjie{
String b="京大";
public void sun(){
String b="州大";
System.out.println(super.getInfo());//定义普通方法返回父类b进行调用_工大
System.out.println(this.b);//调用子类中b_京大
System.out.println(b);//调用子类本方法中b_州大
	}
  }
public class Jicheng{
public static void main(String args[]){
	Lianjieshujuku a=new Lianjieshujuku();
	a.sun();
	}
}

子类定义了与父类相同的属性,在方法使用过程中:
如果通过super调用属性,则优先输出父类属性值;
如果使用this调用属性,优先输出本类中的属性值;
如果直接输出属性值,则优先输出本方法中的属性值。(即最小花括号范围内的值)

你可能感兴趣的:(Java语言基础)