论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
java笔记(this,super,override,instanceof,static) ...
java笔记(this,super,override,instanceof,static)
天空闲话
金牌会员
|
2023-4-4 14:39:15
|
显示全部楼层
|
阅读模式
楼主
主题
969
|
帖子
969
|
积分
2907
super关键字的一些注意事项
子类在执行构造方法时,如果显式使用super()显式调用父类构造方法,则该调用必须放代码块在第一行
super必须出现在子类的方法或者构造方法中
使用this()显示调用构造方法,则该调用必须放在代码块第一行
由于第一条和第三条限制,super和this不能同时调用构造方法
class P1{
public P1(){
//this(); //不可以递归调用构造方法
}
public P1(String str){
this();//可以调用重载的构造方法,该调用必须放在第一行
}
}
class S1 extends P1{
public S1(){
super();//显式调用父类构造方法,该调用必须放在第一行
}
public S1(String str){
this();//无论调用自己的构造方法还是父类的构造方法,都要求在第一行,因此只能调用其中一个
System.out.println("constructor with parameter");
}
}
复制代码
super 和 this的不同
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的引用
使用的前提不一样:
this没有发生继承也可以使用
super只有在发生继承时才可以使用,用来表示父类
构造方法不一样:
this() 调用本类的构造方法
super() 调用父类的构造方法
方法重写
方法重写是多态的一个前提,需要在有继承关系的前提下,由子类重写父类的方法,并且存在几点要求:
方法名必须相同
参数列表必须相同
重写的方法修饰符范围可以扩大: public>protected>default>private
抛出的异常范围可以缩小,但不能扩大:ClassNotFoundException(小) ==> Exception(大)
返回值类型可以缩小
class P2{
protected S1 run() throws Exception{
System.out.println("Father running!");
return new S1();
}
}
class S2 extends P2{
//修饰符范围可以扩大,抛出异常范围可以缩小
//子类方法与父类方法方法名、参数列表必须完全一致
public P1 run() throws ClassNotFoundException{
System.out.println("Son running!");
return new P1();//返回值范围可以缩小
}
}
复制代码
多态注意事项
多态是方法的多态,属性没有多态
如果没有继承关系的类强制转换,会导致ClassCastException类型转换异常
多态的存在条件:继承关系、方法重写、父类引用指向子类对象, Father f1 = new Son();
因此,有一些方法是不能实现多态的:
static 方法不能实现多态,因为static方法是属于类的,不属于实例,当子类定义同名static方法时,会隐藏父类的同名方法。
final 修饰的类和方法。因为final修饰的类为最终类,不能被继承,断子绝孙了,不能满足继承关系,自然也就无法实现多态;final修饰的方法不能被重写,也不能实现多态
private 修饰的方法。这类方法子类无法访问,无法产生重写,因此无法产生多态。
在实验中,笔者注意到父类中 protected 修饰的方法在重写后,只有在父类包路径中可以实现多态,当实例范围超出父类的包之后,该方法即只能被子类实例调用,父类引用指向的子类实例此时不能再调用该方法。
public class Test{
public static void mail(String args[]) throws Exception{
S2 stu = new S2();
stu.run();//无论在哪里都可以正常调用
P2 per = stu;//父类引用指向子类实例,此时发生多态
per.run();//只有当Test与父类P2在同一个包中时,父类引用per才可以访问重写的run()方法。
}
}
复制代码
instanceof
instanceof的作用是判断实例的类型
当类型由低向高转化时,如子类型转化为夫类型,直接使用父类引用指向子类实例即可。
当类型由高向低转化时,需要进行强制类型转换。这是因为子类实例一定是父类的实例,包含父类的所有域,而父类实例不一定时子类型的实例,包含的域可能更小。
子类转换为父类时,可能丢失自己的方法。
class P3{
}
class S3 extends P3{
static void talk(){
System.out.println("Son talk sth");
}
public class Test{
public static void main(String[] args){
S3 son = new S3();
//此的S3的类方法talk()
son.talk();
P3 per = son;//直接使用父类应用指向子类对象,即完成了类型由低到高的转换
//转换成更高等级的父类后,子类中的talk不能被访问了
//per.talk()//不能访问
S3 son1 = (S3)per;//由父类型向子类型转换则需要强制类型转换
}
}
}
复制代码
static
static在类加载时的一些作用
public class P4{
{
System.out.println("Anonymous code block!");
}
static {
System.out.println("Static anonymous code block!");
}
public P4(){
System.out.println("No parameter constructor!");
}
public static void main(String[] args){
P4 per1 = new P4();
System.out.println("==============");
P4 per2 = new P4();
}
}
复制代码
执行结果如下:
可见静态代码块在类加载时首先执行,且在类生命周期中只被执行一次,而匿名代码块则在构造方法之前执行,且每次实例化都会执行。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
天空闲话
金牌会员
这个人很懒什么都没写!
楼主热帖
css过渡样式
Mysql终端Terminal操作
【数据库】数据库课程设计一一疫苗接种 ...
编程能力提升系列:1. 二维矩阵的最大 ...
C语言执行过程
罗景:连接效率优化实践
Java EnumMap values()方法具有什么功 ...
Kubernetes(K8S) Controller - Statefu ...
如何精简 Prometheus 的指标和存储占用 ...
MySQL数据库设计概念(多表查询&事务操 ...
标签云
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表