网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月08日漏签0天
javase吧 关注:61,890贴子:983,749
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 19回复贴,共2页
  • ,跳到 页  
<<返回javase吧
>0< 加载中...

建议33:不要覆写静态方法(原文拷贝)

  • 只看楼主
  • 收藏

  • 回复
  • 典勇嘉谋
  • 六年级
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我们知道在 Java 中可以通过覆写(Override)来增强或减弱父类的方法和行为,但覆写
是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方
法(static 修饰的方法,也叫做类方法) ,为什么呢?我们先看一个例子,代码如下:
public class Client {
public static void main(String[] args) {
Base base = new Sub();
// 调用非静态方法
base.doAnything();
// 调用静态方法
base.doSomething();
}
}
class Base{
// 父类静态方法
public static void doSomething(){
System.out.println("我是父类静态方法");
}
// 父类非静态方法
public void doAnything(){
System.out.println("我是父类非静态方法");
}
}
class Sub extends Base{
//子类同名、同参数的静态方法
public static void doSomething(){
System.out.println("我是子类静态方法");
}
//覆写父类的非静态方法
@Override
public void doAnything(){
System.out.println("我是子类非静态方法");
}
}
注意看程序,子类的 doAnything 方法覆写了父类方法,这没有任何问题,那 doSomething
方法呢?它与父类的方法名相同,输入、输出也相同,按道理来说应该是覆写,不过到底是不是覆写呢?我们先看输出结果:
我是子类非静态方法
我是父类静态方法
这个结果很让人困惑,同样是调用子类方法,一个执行了子类方法,一个执行了父类方
法,两者的差别仅仅是有无 static 修饰,却得到不同的输出结果,原因何在呢?
我们知道一个实例对象有两个类型 :表面类型(Apparent Type)和实际类型(Actual
Type) ,表面类型是声明时的类型,实际类型是对象产生时的类型,比如我们例子,变量
base 的表面类型是 Base,实际类型是 Sub。对于非静态方法,它是根据对象的实际类型来执行的,也就是执行了 Sub 类中的 doAnything 方法。而对于静态方法来说就比较特殊了,首先静态方法不依赖实例对象,它是通过类名访问的 ;其次,可以通过对象访问静态方法,如果是通过对象调用静态方法,JVM 则会通过对象的表面类型查找到静态方法的入口,继而执行之。因此上面的程序打印出“我是父类静态方法” ,也就不足为奇了。在子类中构建与父类相同的方法名、输入参数、输出参数、访问权限(权限可以扩大) ,并且父类、子类都是静态方法,此种行为叫做隐藏(Hide) ,它与覆写有两点不同:
表现形式不同。隐藏用于静态方法,覆写用于非静态方法。在代码上的表现是 :@
Override 注解可以用于覆写,不能用于隐藏。
职责不同。隐藏的目的是为了抛弃父类静态方法,重现子类方法,例如我们的例子,
Sub.doSomething 的出现是为了遮盖父类的 Base.doSomething 方法,也就是期望父类
的静态方法不要破坏子类的业务行为 ;而覆写则是将父类的行为增强或减弱,延续父类的职责。解释了这么多,我们回头看一下本建议的标题:静态方法不能覆写,可以再续上一句,虽然不能覆写,但是可以隐藏。顺便说一下,通过实例对象访问静态方法或静态属性不是好习惯,它给代码带来了“坏味道” ,建议读者阅之戒之。


  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
除了转载,你可以自己写文章写心得啊


2025-06-08 23:20:13
广告
  • 典勇嘉谋
  • 六年级
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不知道怎么写,之前我还去申请了个贴吧,想自己写点东西的,但是想了想,好麻烦,每个人学习的进度都不一样,自己会的还不多,就放弃了。之前转载的时候我都加入了自己的小部分想法,不能完全说是转载,今天的这个才是原文。
刚刚看到个用jquery写的全选功能。但是后面似乎是当不是全选时,则全选的按钮就会取消选中,可是实际却没有效果。
帮我看看:几个属性不用我解释吧,字面意思就是。
$(function(){
$("#allselectbox").click(function(){
$(":checkbox[name=userIds]").attr("checked", $(this).attr("checked"));
});
----------------------------下半个不明了的代码----------------------------------
$(":checkbox[name=userIds]").click(function(){
$("#allselectbox").attr("checked",
($(":checkbox[name=userIds]").length == $(":checkbox[name=userIds]:checked").length));
});
}


  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
每个人学习的进度都不一样
心得写的是自学过程的心得,别把他当做教学


  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个你单独发帖提问嘛


  • 典勇嘉谋
  • 六年级
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好吧。。


  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
$this.attr('checked', 'checked');
$this.attr('checked', false);
@itianda



  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
// Check #x $('#x').attr('checked', true);
// Uncheck #x $('#x').attr('checked', false);
Add or remove the 'checked' attribute:
// Check #x
$("#x").attr('checked', 'checked');
// Uncheck #x
$("#x").removeAttr('checked');



2025-06-08 23:14:13
广告
  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
应该是你人品问题。
你在哪看到的。


  • 典勇嘉谋
  • 六年级
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
公司的一个项目里


  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
问写的那个人。


  • 典勇嘉谋
  • 六年级
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
有道理。我在想那人是不是随便从网上找来的。


  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
但是我觉得代码没问题


  • itianda
  • 五年级
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
?


2025-06-08 23:08:13
广告
  • JinCeon
  • 初一年级
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没事,突然想起你的tiebamanager,就召唤你了
话说我有时用attr("checked",true)
有时用attr("checked","checked")搞得我有时都很混乱


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 19回复贴,共2页
  • ,跳到 页  
<<返回javase吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示