覆写

方法覆写与属性覆盖详解

清楚了继承的基本概念,此时就可能出现一种情况,如果子类定义了父类相同的方法或属性,这就成为覆写。

方法的覆写

方法的覆写是子类定义了与父类方法名称、参数类型及个数完全相同的方法,但是被覆写的方法不能够拥有比父类更为严格的访问控制权限。

范例: 简单的方法覆写

class Person {
	public void printInfo() {
		System.out.println("【Person类】printInfo()方法");
	}
}
class Student extends Person {
	public void printInfo() {
		System.out.println("【Student类】printInfo()方法");
	}
}
public class TestDemo {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.printInfo();
	}
} 

进行覆写方法使用的时候得注意两点:

  • 当前使用的对象是通过那个类new出来的
  • 当调用某一个方法,如果该方法已经被子类覆写了,则调用的一定是子类中覆写的方法。

在进行方法的覆写的时候也有一个明确的要求:被覆写的方法不能够拥有比父类更为严格的访问控制权限,private < default < pubic

那么也意味着如果父类中方法使用了public进行定义,那么子类中使用的权限只能是public,而如果父类中使用的是default权限,子类可以使用default或者public。方法一般也是public修饰的。属性基本用private修饰。

范例: 父类的方法使用private定义,子类同名方法使用public定义。

class Person {
	public void fun() {
		this.printInfo();
	}
	//如果现在父类中的方法使用了private定义,那么就表示该方法只能被父类所使用,
	//子类无法使用,也就是子类根本不知道父类有这样的方法。
	private void printInfo() {
		System.out.println("【Person类】printInfo()方法");
	}
}
class Student extends Person {
	//这个时候该方法只是子类定义的新方法而已
	//跟父类重名的方法没关系
	public void printInfo() {
		System.out.println("【Student类】printInfo()方法");
	}
}
public class TestDemo {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.fun();
	}
} 

例子: 重载与覆写的区别

No区别重载(Overload)覆写(Overwrite)
1概念方法名称,参数的类型和个数不同方法名称、返回值类型、参数的类型和个数完全相同
2范围发生在一个类之中发生在继承关系之中
3限制没有权限要求被覆写的方法不能拥有比父类更为严格的方位权限

方法重载的时候返回值可以不同,但是良好的设计上要求返回类型一致。

属性覆盖

当子类定义了和父类属性完全相同的属性的时候就是属性覆盖。

class Person {
	public String info = "mrbacker";
}
class Student extends Person {
	public int info = 100; //属性名称相同
	public void printInfo() {
		//按照就近取用的原则,取的是被覆盖的属性名称
		System.out.println(info);
	}
}
public class TestDemo {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.printInfo();
	}
}

这种操作本身是没有意义的,其核心的原因在于:所有类中的属性都要求使用private封装,那么一旦封装了,子类不知道父类的private属性,覆盖属性也就没有意义了,所以尽量不使用同名的属性。

super关键字

子类实例化的时候出现的super()的形式,其主要作用是由子类调用父类构造方法,进行覆写的操作过程之中,子类也可以使用super.方法()super.属性明确地调用父类中的方法或属性。

范例: 观察一下程序

class Person {
	public void printInfo() {
		System.out.println("1111");
	}
}
class Student extends Person {
	public void printInfo() {
		super.printInfo();
		System.out.println("2222");
	}
}
public class TestDemo {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.printInfo();
	}
}

如果此时写上了this.printInfo()操作,那么就表示先从本类查找所需要的方法,如果本类没有,则去找父类中指定的方法进行调用。如果是super.printInfo()表示的是不查找本类而调用父类中的方法。

范例: 观察调用父类属性

class Person {
	public String info = "mrbacker";
}
class Student extends Person {
	public int info = 100; //属性名称相同
	public void printInfo() {
		//不查找本类的属相,直接查找父类中的属性
		System.out.println(super.info);
		System.out.println(info);
	}
}
public class TestDemo {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.printInfo();
	}
} 

发现super和this使用形式上非常相似,但是最大的区别在于super是子类访问父类的操作,而this是本类的访问操作。

No区别thissuper
1概念访问本类中的属性、方法由子类访问父类中的属性、方法
2查找范围先查本类,如果本类没有则调用父类不查找本类而直接调用父类定义
3特殊表示当前对象

能使用super.方法()一定要明确标记出是父类的操作。

总结

  1. 子类覆写父类的方法是因为父类的方法功能不足,才需要覆写;
  2. 方法覆写的时候使用的是public权限,方法名字复制粘贴。
<think>好的,用户问的是队列的含义和实现方式。首先我需要明确“队列”这个术语的具体定义。在常规的数据结构教材中,可能没有直接提到“”这个词,但结合上下文,可能是指队列的入,比如循环队列在满时盖旧元素的情况。 用户之前的问题是关于队列的实现,所以这次可能想了解特定场景下的队列操作,比如当队列满了之后如何处理新元素。可能意味着当队列已满时,新加入的元素会盖掉最早的元素,这种结构通常称为循环队列或者环形缓冲区。 接下来要考虑实现方式。队列的基本操作是入队和出队,而的情况通常发生在固定大小的队列中。当队列满时,入队操作会导致队头元素被盖,同时调整队头和队尾指针。需要处理队列的空和满的状态判断,通常循环队列会浪费一个存储单元来区分空和满,但的情况下可能不需要,因为允许盖。 然后参考用户提供的引用内容,虽然引用[1]提到的是Java中列表转数组的方法,引用[2]讲的是栈的应用,可能与当前问题关联不大。但需要确保回答符合用户之前的问题历史,可能用户之前在了解数据结构的实现,比如栈和队列的基础代码。 接下来需要组织回答结构,先解释队列的含义,再说明实现步骤,包括初始化、入队、出队等方法。然后给出代码示例,比如用Java或Python实现循环队列,并处理的情况。最后生成相关问题,帮助用户深入理解。 要确保使用正确的中文术语,避免技术术语翻译错误。同时检查代码的正确性,比如循环队列的指针移动和条件判断。可能还需要比较普通队列和队列的区别,强调场景的应用,如实时数据流处理等。 总结步骤:定义队列,实现方式(初始化、指针管理、满队处理),代码示例,应用场景,相关问题。</think>### 队列的“”实现解析 “队列”通常指**固定大小的循环队列在满容量时自动盖最旧数据**的实现方式。这种设计常见于需要持续处理数据流的场景(如实时传感器数据缓存),其核心特征是新元素会盖过期数据。 --- ### 实现步骤及代码示例(Python) #### 1. 数据结构定义 初始化固定大小的数组,维护头尾指针: ```python class CircularQueue: def __init__(self, capacity): self.capacity = capacity self.queue = [None] * capacity self.head = 0 # 队头索引 self.tail = 0 # 下一个可入位置 self.size = 0 # 当前元素数量 ``` #### 2. 入队逻辑 当队列满时盖头部元素: ```python def enqueue(self, item): if self.size == self.capacity: # 队列已满时盖 self.head = (self.head + 1) % self.capacity self.size -= 1 # 丢弃队头元素 self.queue[self.tail] = item self.tail = (self.tail + 1) % self.capacity self.size += 1 ``` #### 3. 标准出队逻辑 ```python def dequeue(self): if self.size == 0: raise Exception("Queue is empty") item = self.queue[self.head] self.head = (self.head + 1) % self.capacity self.size -= 1 return item ``` #### 4. 状态查询方法 ```python def is_full(self): return self.size == self.capacity def is_empty(self): return self.size == 0 ``` --- ### 关键特性对比 | 特性 | 普通队列 | 队列 | |--------------------|------------------|----------------------| | 满队处理 | 拒绝入队/抛异常 | 盖最早元素 | | 内存占用 | 动态增长 | 固定预分配 | | 应用场景 | 任务调度 | 实时数据流处理 | --- ### 典型应用场景 1. **日志滚动记录**:保留最近N条日志 2. **音视频缓冲区**:持续盖过期帧数据[^2] 3. **实时监控系统**:仅显示最新指标 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值