静态隐藏与覆盖的不同

By heiry on 2019-08-04 [ in 技术 ]

java中,静态方法属于类,直接使用”类名.静态方法”方式访问,也可以通过”实例.方法”访问,后者一般不推荐,但是也是合法的:

package com.mosang.staticInheri;

public class Fu {
  public String a="fu";
  public void ordinaryMethod() {
    System.out.println("Fu ordinaryMethod");
    
  }
  public static void staticMethod() {
    System.out.println("Fu static method");
  }

}
package com.mosang.staticInheri;

public class Demo {
  public static void main(String[] args) {
    Fu f=new Fu();
    f.staticMethod();//使用实例方式访问
    Fu.staticMethod();//使用类名直接访问
  }

}

输出如下:

Fu static method
Fu static method

需要注意的是,在存在静态方法情况下的继承,静态方法不能被子类覆盖,即使子类有与父类相同的静态方法(同覆盖规则),也不是覆盖重写,如有Zi类继承如下:

package com.mosang.staticInheri;

public class Zi extends Fu{
  public String a="zi";
  public void ordinaryMethod() {
    System.out.println("Zi ordinaryMethod"); //实例方法,覆盖重写
    
  }
  public static void staticMethod() {
    System.out.println("Zi static method"); //与父类相同的静态方法(方法名、返回值、参数均相同)
  }

}

通过两种方式创建子类实例:

package com.mosang.staticInheri;

public class Demo {
  public static void main(String[] args) {
    Fu f1=new Zi();//多态方式创建对象
    Zi f2=new Zi();//普通方式创建对象
    f1.ordinaryMethod(); //输出Zi ordinaryMethod
    f1.staticMethod();//输出Fu static method
    f2.ordinaryMethod();//Zi ordinaryMethod
    f2.staticMethod();//Zi static method
  }

}

输出结果

Zi ordinaryMethod
Fu static method
Zi ordinaryMethod
Zi static method

从上输出结果可看到,父类的静态方法并不能被覆盖,只是被隐藏。

同样,静态成员变量也是一样的道理。出现相同静态字段时父类字段不会将子类字段覆盖,而只是将其“隐藏”。

>> 阅读全文  >>

无题

By heiry on 2019-07-31 [ in 生活, 随写 ]

>> 阅读全文  >>

智慧

By heiry on 2019-07-29 [ in 生活, 管理, 随写 ]

大学时,学校有个名家讲坛,有很多名人来演讲,包括袁隆平、王石、白岩松、唐骏、王蒙、余秋雨、陈鲁豫,俞敏洪、李开复。。。等等,其中特别多的是央视名嘴,和很多懵懂的大学新生一样,我很热衷于听这样的讲座,想着从中吸取到这些成功人士的思想智慧。然而,更多留下的印象是他们在讲那些所谓光辉往事,多年后想起来,这些花去了大量时间的名人讲座对我毫无帮助,大脑中对这些讲座的印象已经趋近于零,有很多后来还因为人设的坍塌而起了反效果。相反,有一堂看似不起眼的财务管理会计实操课,对我印象深刻。那次老师邀请了一家证券公司的专业财税人员来给我们讲解,讲课人干净利落的职业着装,口齿清晰的表达,逻辑清晰且优美的PPT,娴熟的软件操作,给我留下了极深的印象,第一次觉得财务课程还可以不沉闷,还可以有如此专业深度,这么多年过去,那次课我依然记忆犹新。

我们常常在网上、在节目访谈中,在演讲上,在他人写的书中,看到或听到各种诗般的旅行体验,传奇的创业故事,艰苦奋斗的历程,力挽狂澜的励志片段、远见卓识的前瞻思维、开山劈地般的气魄,这些让你的神经猛然得到刺激,鸡汤效应让人一时间兴奋起来。然而当你走近或去经历的时候,才发现所有这些,都与你想的相去甚远。几乎每个给别人讲故事的人,都不由自主地往其中添加了或多或少的兴奋剂,有的甚至只剩下兴奋剂了。 (更多…)

>> 阅读全文  >>

无题

By heiry on 2019-07-29 [ in 生活, 随写 ]

>> 阅读全文  >>

史上最简明易懂的正则表达式教程08

By heiry on 2019-05-04 [ in 技术 ]

1.运算符优先级

默认情况下,和算术表达式类似,正则表达式按照从左到右顺序计算或匹配,相同优先级的从左到右进行运算,不同优先级的运算先高后低。

从高到低各种正则表达式运算符的优先级如下所示(注:表格数据来源于w3school):

或运算符(也称为选择运算符)在正则表达式中具有最低的优先级,也就是说,它告诉引擎要么匹配选择符左边的所有表达式,要么匹配右边的所有表达式。

比如有正则表达式 abc|edf,按照优先级,它要么匹配abc要么匹配edf,而不是在c和e之间择其一。

 

2. 零宽度断言

正则表达式中,有一类是标明位置而不匹配具体字符的特殊标识符。

>> 阅读全文  >>

史上最简明易懂的正则表达式教程07

By heiry on 2019-05-03 [ in 技术 ]

1.  数量限定符

数量限定符用来指定其紧邻的前表达式的出现次数,数量限定符主要有如下:

以上表格是多数书籍或网上教程对限定符的释义。其中最容易令人产生疑惑的“重复”二字,初学者往往理解为相同内容出现次数,个人认为这个词用得很不好。

对于正则表达式 \d{3},等同于\d\d\d,但用“重复”来强调,容易让人理解为相同结果重复三次,类似于(\d)\1\1的效果。

举例来说,\d{3},匹配123、673、222,但(\d)\1\1只能匹配这三个字符串中的222。而很多初学者往往理解“重复”为后者。

所以,有必要强调,限定符的重复次数是指表达式重复而不是结果重复。

值得注意的是,上下限限定符可以有{n}、{n,m}、{n,}等形式,但是不存在{,m}这种形式,这是一种错误的写法。另外,上下限量词与逗号之间不能有空格,如\d{3, 6}是错误的写法,将无法实现目标匹配:

 

2.贪婪模式与懒惰模式

“{m,n}”、“{m,}”、“?”、“*”和“+” 为贪婪模式的限定词,也叫做匹配优先量词。被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Exp)+”。

在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:

“{m,n}?”、“{m,}?”、“??”、“*?”  与 “+?”

贪婪模式总是试图尽可能多地匹配目标字符串,如以下HTML代码:

abc<p>第一段</p><p>第二段</p><p>第三段</p>def

我们用正则<p>.*</p> 去匹配

这是一种贪婪模式的匹配得到的匹配结果为:

 

贪婪模式下它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。用通俗一点的话来说,在拿不准是否要匹配的情况下,优先尝试匹配,并记下这个状态,以备将来“后悔”(也就是回溯)。

我们把正则更改为<p>.*?</p> ,匹配结果如下:

可以看到,在懒惰模式下,它会尽可能少地重复限定量,只要匹配到一个就返回了结果。

我们再更改下正则:<p>.*?</p>def,再看匹配结果:

可以看到,在“整个表达式匹配成功”的前提下,非贪婪模式才真正的影响着子表达式的匹配行为,如果整个表达式匹配失败,非贪婪模式无法影响子表达式的匹配行为。

>> 阅读全文  >>

史上最简明易懂的正则表达式教程06

By heiry on 2019-05-03 [ in 技术 ]

1. 分组与向后引用

把正则表达式的一部分放在圆括号内,每个括号内的表达式就是一个组。

对于每个组,系统会自动给之一个组编号以便在后文引用,第一个编为1号,第二个为2号,以此类推。。。

例如,对于正则表达式 (agriculture|industry)-(China|Japan|India)其结构如下:

在表达式的后文,以使用\num的格式引用某个分组(其中num为正整数,表示第几个分组),如 (agriculture|industry)-(China|Japan|India)-\1,其结构变成了如下图:

(agriculture|industry)-(China|Japan|India)-\1能匹配字符串agriculture-China-agriculture:

其中\1就是第一个分组的引用,以agriculture开头就必须以agriculture结束。

如果我们不想使用系统自动生成的编号,或者由于组数太多不便一个个数,可以使用给组命名的方式实现向后引用,命名格式为:

(?<groupName>expression)

引用格式为:

\k<groupName>

如有如下正则表达式,可匹配HTML的标签:

^<(.+)\s.*>\w+<\/\1>$

其中:

^ 表示行的开始

< 表示HTML的开始标签

(.+) 为标签名,如可匹配a、ul、font、...等标签名

\s 表示一个空格
 
.* 表示标签内的任意字符,可以匹配属性及属性值等内容

\w+ 为标签内的文字

<\/为结束标签标记 </

\1 向前引用标签名

> 封闭结束标签

$ 表示行的结束

结构如下:

匹配效果如下:

需要注意的是,不同语言实现的向后引用格式有所差异:

图片来源《正则指引》一书(作者:余晟)

如果我们使用自命名组,那么正则表达式可更改为^<(?<tagName>.+)\s.*>\w+<\/\k<tagName>>$

可以看到匹配效果是一样的:

需要注意的是,命名分组不是正则的通用规则,不同语言支持组命名的书写格式有很大区别:

图片来源《正则指引》一书(作者:余晟)

2. 取消默认分组存储

在默认情况下,只要用()框定的内容,正则引擎就会自动分配组号,存储匹配分组,这样降低了引擎速度。如果我们不需要向后引用,可以通过(?:value)语法取消默认编组存储,其中“(”后面紧跟的“?:”会告诉引擎对于组(Value),不存储匹配的值以供后向引用。

如([0-9a-z]*)-(?:\d+),明确了第二个分组不进行编号存储,不提供向后引用。

 

>> 阅读全文  >>


© 2009-2021 MOSANG.NET DESIGNED BY HEIRY