覆写

方法覆写(重点)

当子类定义了与父类中完全一样的方法时(方法名称,参数类型,参数个数,返回值类型完全一致),这样的操作就称为方法的覆写。
范例:观察方法覆写

class A {
	public void print(){
		System.out.println("*************A*************");
	}
}
class B extends A{
}
public class Hello{
	public static void main(String args[]){
		B b = new B();
		b.print();
	}
}

在这里插入图片描述
此时B是A的子类,并且B中没有定义任何方法。此时B类将直接继承A类的print方法执行。
范例:发生覆写

class A {
	public void print(){
		System.out.println("*************A*************");
	}
}
class B extends A{
	public void print(){//与父类方法完全相同
		System.out.println("@@@@@@@@@@@@@A@@@@@@@@@@@@@");
	}
}
public class Hello{
	public static void main(String args[]){
		B b = new B();
		b.print();
	}
}

在这里插入图片描述
此时程序之中使用了B类进行对象的实例化操作,并且在B类中已经明确的覆写了A类中的print()方法,那么最终调用的一定是覆写过的方法。
范例:分析方法覆写的含义

class Person{
	private String name;
	private int age;
	public void setName(String name){
		this.name = name;
	}
	public void setAge(int age){
		this.age=age;
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
	public String getInfo(){
		return "姓名:"+this.name+",年龄:"+this.age;
	}
}
class Student extends Person{//Student是Person的子类
	//此时并没有在Student类中定于任何操作
	private String school;//子类自己扩充属性
	public void setSchool(String school){
		this.school=school;
	}
	public String getSchool(){
		return this.school;
	}
	public String getInfo(){
		return super.getInfo()+",学校是"+this.school;
	}
}
public class Hello {
	public static void main(String args[]){
		Student stu = new Student();//实例化子类对象
		stu.setName("张三");//通过Person类继承而来
		stu.setAge(12);//通过Person类继承而来
		stu.setSchool("清华大学");//Student类自己扩充的方法
		System.out.println(stu.getInfo());
	}
}

在这里插入图片描述
实际上所谓的方法覆写的原因是:父类中定义的方法名称是其他程序所认可的名称,属于使用的习惯,但是子类在使用的过程之中,发现原始的方法不能够支持自己的操作,而且又需要保留住方法名称,这样才出现了覆写的概念。
并且通过以上的分析可以发现一点:

  • this.方法():会先找本类中是否有指定的方法,如果本类没有,则使用父类继承而来的方法;
  • super.方法():不查找本类的方法,而直接找父类的方法。
    但是覆写本身也是有严格要求的:被覆写的方法不能够拥有比父类更为严格的访问权限。访问控制权限一共有四个,已经学过的有三个:private<default(friend)<public.按照以上的思路,如果父类的方法使用了public访问权限声明,那么子类只能够使用public声明。而如果父类的方法使用了default访问权限声明,那么子类只能够使用public或default声明
    范例:错误的覆写
class A {
	public void print(){
		System.out.println("*************A*************");
	}
}
class B extends A{
	void print(){//此时方法的访问权限严格了
		System.out.println("@@@@@@@@@@@@@A@@@@@@@@@@@@@");
	}
}

在这里插入图片描述
但是此时会出现这样一种情况,如果父类中的方法使用private呢?那么子类覆写方法时如果也使用了default也属于权限扩大,这样可以覆写吗?
范例:正常覆写

class A {
	public void fun(){
		this.print();
	}
	public void print(){
		System.out.println("*************A*************");
	}
}
class B extends A{
	public void print(){
		System.out.println("@@@@@@@@@@@@@A@@@@@@@@@@@@@");
	}
}
public class Hello{
	public static void main(String args[]){
		B b = new B();
		b.print();
	}
}

在这里插入图片描述
下面将父类中print()方法的权限修改成private。从权限的角度应该符合覆写要求。
在这里插入图片描述
通过结果可以发现,此时子类并没有进行方法的覆写。所以就可以得出结论:父类中private声明的方法不能够杯子类所覆写,而且最重要的是这样的操作几乎没有意义。
在实际之中对于方法的定义,95%的情况下都会使用public声明。
面试题:请解释Overloading与Override的区别?在进行Overloading时,能否改变返回值类型?

No区别方法重载方法覆写
1单词OverloadingOverride
2范围发生在一个类之中发生在继承类之中
3定义方法名称相同,参数的类型及个数不同方法名称、参数类型、个数及返回值类型全部相同
4权限没有权限要求被覆写的方法不能拥有比父类更为严格的访问控制权限

在进行方法重载的时候可以使用不同的返回值类型,但是从设计的角度不建议。

属性覆盖(了解)

当子类定义了与父类属性名称相同的属性时,就称为属性的覆盖。
范例:观察属性的覆盖

class A {
	String info="Hello World";
}
class B extends A{
	int info=100;//名称相同
	public void print(){
		System.out.println(this.info);//100,本类属性
		System.out.println(super.info);//Hello World,父类属性
	}
}
public class Hello{
	public static void main(String args[]){
		B b = new B();
		b.print();
	}
}

从实际开发的标准要求来讲,类中属性必须使用private封装,那么一旦使用了private封装属性,覆盖就没有意义了。
面试题:请解释this与super的区别

No区别thissuper
1概念表示调用本类属性(this.属性)、本类方法(this.方法()、this())表示调用父类属性(super.属性)、父类方法(super.方法()、super())
2构造要求调用构造方法时必须放在构造方法的首行,所以this()与super()不能够同时出现,但是子类永远回去调用父类的构造方法调用构造方法时必须放在构造方法的首行,所以this()与super()不能够同时出现,但是子类永远回去调用父类的构造方法
3特殊要求当前对象-

使用this实际上会先从本类开始查找所需要的内容,如果没有则去查询父类,而如果使用的是super,则表示不查询本类,直接查询父类的定义。

总结

在这里插入图片描述
+有,则使用从父类继承而来+

### 定义 节点通常指在数据结构、分布式系统或编程中,对已存在的节点信息进行重新定义或修改。在不同的场景下,节点代表不同的含义,比如在树形结构中,节点可以是树的一个分支;在分布式系统里,节点可能是一个服务器。节点就是用新的属性、方法或数据替换原节点的对应内容。 ### 实现方式 - **编程层面**:在面向对象编程中,通过子类继承父类的节点类,并重其方法来实现节点。例如在 Java 中: ```java class ParentNode { public void printInfo() { System.out.println("This is a parent node."); } } class ChildNode extends ParentNode { @Override public void printInfo() { System.out.println("This is a child node with overridden info."); } } ``` - **分布式系统层面**:在分布式文件系统如 HDFS 中,若要对某个数据节点的配置进行,可通过修改配置文件或使用管理工具进行操作。例如在 HDFS 中修改某个数据节点的存储路径配置,就相当于对该节点的配置信息进行。 ### 应用场景 - **系统升级与扩展**:当系统需要添加新功能或改进现有功能时,可通过节点来实现。比如在一个大型软件系统中,对某个模块的节点进行,以添加新的业务逻辑。 - **故障恢复与容错**:在分布式系统中,当某个节点出现故障时,可使用备用节点故障节点,保证系统的正常运行。就像 HDFS 2.0 中,当活跃名称节点出现故障时,待命名称节点可活跃节点继续提供服务 [^2]。 - **定制化需求**:根据不同用户或业务的需求,对节点进行以满足特定的功能。例如在一个通用的电商系统中,不同商家可能有不同的商品展示需求,可通过商品展示节点来实现个性化展示。 ### 相关技术 - **版本控制**:在进行节点时,为了避免数据丢失或冲突,常使用版本控制技术。如 Git 可对节点的不同版本进行管理,方便回溯和比较。 - **分布式锁**:在分布式系统中进行节点时,为了保证数据的一致性和完整性,会使用分布式锁。例如 Redis 分布式锁可防止多个节点同时对同一节点进行操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值