Day6 面向对象的学习super
Day6
面向对象学习
super学习
是子类调用父类的方法。比如子类有一个和父类名字相同的属性,通过super就可以调用父类的属性。
因为私有的东西无法被继承
所以super也不能调用super、 super只能出现在子类
super() 调用了父类的构造方法 而且调用父类的构造器必须放在代码的第一行
而this也是一样,只能够在第一行,所以在调用构造器的时候,super和this只能选一个
只要写了有参构造,无参构造就没了。
父类没有无参构造,所以子类也不能写无参构造
所以以后要写有参构造的时候,必须还要再加一个无参的手写的构造。以防止子类错误。
方法重写
重写都是方法的重写,和属性没关系
父类的引用指向了子类
@override 重写
子类重写了父类的方法 与非静态方法有关。
重写的关键词只能用public。
重写的范围可以扩大,比如私有的重写为public 但是public不能重写成private。
抛出的异常可以被缩小,但不能被扩大。
总的来说重写,子类的方法必须要和父类的一致。而方法体不同,即内容不一样就重写。
重写的缘由
父类的功能子类不一定需要。所以需要子类去重写来满足子类自己的需求。
多态
子类重写了父类的方法,所以就执行子类重写后的方法。
对象能执行哪些方法主要看左边的类型,和右边关系不大。
多态是方法的多态,和属性没关系。类型转换异常 ClassCastException
多态的存在条件
- 存在继承关系
- 方法需要重写 而static类,不属于实例 final则是常量也不行 private是私有,传不到子类
- 父类引用指向子类对象 Father f1=new Son()
多态会让程序变的更灵活
Instanceof 类型转换
是引用类型,然后判断一个对象是什么类型。
如果满足父子关系,返回一个true ,不满足则false
必须要有联系才能编写,不然直接报错
System.out.println(X instanceof Y);//能不能编译通过,取决于X和Y是否存在父子关系
基本类型转换就是高转低,高的转化为低的就能强转。 低转高就不需要
而类的转化也差不多 父 与 子
父转子需要强转转换
((Student) s2).eat();//强转转换 才能使用子类的函数
子类转换为高类型即父类,可以直接转换,不过会丢失子类的方法。
static关键字
从刚学java就有这个疑惑,这个static 是定义静态的,细节是什么。
如果定义方法就是静态方法,定义变量就是静态变量
非静态的方法可以调用静态方法。
代码块可以加载一些初始化的数据
静态代码块是在类加载就会被执行,且永久被执行一次,没有加static的代码块程序是不会主动调用的。
先执行静态代码块再执行匿名代码块最后执行构造方法。
静态导入包
import static java.lang.Math.random;
这样可以直接调用random方法,而不用加前缀math
通过final被修饰的类就不能被继承,没有子类。
思考
继承后的多态,父与子之间的关系。大部分都很好理解,子继承父的东西,父亲里的公开的属性和方法都能够被子所用,但是父里的私有和final常量缺不会被继承。子可以重写父的方法,要求名字一样参数相同,唯一不同就是方法体也就是内容要不一样,instanceof就是来判断类之间的关系,但是一点关系都没有的是无法所用这个方法。类的类型转换也和基本的类型转换相似,子转父可以直接转无需强制转换,父转子则需要强制转换。static关键字,基本理解,等到线程里面再深入研究,至于用法就是,被static修饰的就是静态的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗