2021-11-20(继承、重写、上转型、下转型)

本文深入解析了面向对象编程中的继承机制,包括单一继承与多重继承的特点,以及重写规则,如访问权限、方法返回值和异常处理。此外,讲解了上转型和下转型的概念,以及属性隐藏现象,并通过实例演示了方法重写和类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象

继承

一个类只能继承一个类,不能同时继承多个类,但是一个类可以被多个类继承
!!继承后在子类中会自动创建父类的属性,<不论是什么访问权限>。

重写

  • 重新方法的访问权限修饰符一定要不小于被重写方法的访问修饰符(public>protected>default>private)。
  • 重写方法的返回值必须和被重写方法的返回值一致或者是原类型的子类
  • 重写方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类
  • 被重写的方法不能为private,因为默认为fianl无法继承,只是新定义了一个同名方法没有重写
  • !!静态方法不能被重写,只能用同名静态方法隐蔽,不会触发多态性
  • !!非静态方法不能被重写为静态的方法(会编译出错)

上转型|下转型

父类的变量指向了子类的对象

  • 属性隐藏
class Fu{
		public String a="fu";
}
class Zi{
		public String a="Zi";
}
--------------------------------

Fu fu= new Fu();
Zi zi = new Zi();
System.out.println(f);
System.out.println(d);
System.out.println("------");
fu = zi;
System.out.println(f);
System.out.println(d);
System.out.println(fu.a);//访问父类被隐藏的a数据

Fu fu= new Fu();
Zi zi = new Zi();
fu = zi;

也可以写为

Zi zi = new Zi();
Fu fu= zi;

结果为

demo.fu@15db9742
demo.Zi@6d06d69c
------
demo.Zi@6d06d69c
demo.Zi@6d06d69c
fu

  • 方法重写
class Fu{
		public void say() {
		System.out.println("Fu");
	}
}
class Zi{
		public void say() {
		System.out.println("Zi");
	}
}
--------------------------------

Fu fu= new Fu();
Zi zi = new Zi();
fu = zi;
fu.say();

结果为

Zi

!!下转型,不存在无中生有的下转型,一切的下转型都是上转型的逆操作。
现在的fu变量中 保存的是子类对象的地址,这就是经过上转型的数据
将其转存回zi类中的变量中,就是下转型。下转型需要强制类型转换

zi=(Zi) fu;//下转型,逆操作前面必须要有fu = zi;

如果没有fu = zi;,!!下转型不能无中生有出来。
会出现报错
这不是下转型,这是错误的。

Exception in thread "main" java.lang.ClassCastException: demo.fu cannot be cast to demo.Zi
	at demo.Zi.main(Zi.java:24)

可以使用 instanceof 关键字
判断当前对象是否属于某一个类
使用方法:对象 instanceof 类名

if (fu instanceof Zi) {
			zi=(Zi) f;
		}
fu instanceo![请添加图片描述](https://img-blog.csdnimg.cn/898d64268bb24abea8146e6e7d198266.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAeWVfeWV5ZV95ZQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
f Zi//的值为false
  • 个人理解
public class Father {
    String name = "爹";
    public void say(){
        System.out.println("我是"+name);
    }  
}
public class Son extends Father {
    String name = "儿";
    public void say(){
        System.out.println("我是"+name);
    }
}
  • test
		Father father = new Father();
        System.out.println(father.name);
        father.say();


        Son son = new Son();
        father = son;
        System.out.println(father.name);
        father.say();
  • 结果
爹
我是爹
爹
我是儿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值