Java学习笔记之继承和方法重写

一、继承
继承的限制:
限制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调用构造的时候不能同时出现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅破苍穹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值