Java 你的多持续纳?
添加时间:2013-5-20 点击量:
Java省略了很多很罕用到,缺乏懂得,混合功能的C + +,在我们的经验中带来更多的悲戚大于收益 。
---------James Gosling
James Gosling 这小我大师应当很熟悉,就是最初设计Java 说话的的法度员,被称为“Java之父”,如今也有50多岁了,前几天还看过他的视频,很平易近民的一个白头白叟,可能和在中国小镇到处可见的白叟是一样的,完全看不出是那 SUN 的副总裁,也没有中国商人特有的做秀和滑头。
上方那段话是别人问到他关于 Java 为什么不克不及运算符重载(固然它确切有办法重载),多重持续,以及广泛的主动强迫转换时答复的一段话。他白叟家说多持续会带来更多的悲戚,这悲戚到底在什么处所纳?以下是我本身的一点解析(如有不正,大神你出手):
多持续的长处是显而易见的,一个子类能有多个父类的属性和办法,比如上方的那个希腊神话傍边的半人马师长教师,持续了人和马,上半身是人的躯干,包含手和头,下半身则是马身,也包含躯干和腿,既有速度又有思维和抓取器材的才能。
然则多持续的毛病也是一点就破:
(1)若是一个子类持续的多个父类中拥有雷同名字的实例变量,子类在引用该变量时将产生歧义,无法断定应当应用哪个父类的变量;
贴段代码给看看:
public class ClassA {
protected String a = same ;
}
public class ClassB {
protected String a = Unsame ;
}
public class ClassC extends ClassA, ClassB {
public void printOut() {
System.out.println( super .a); //-----关键的一行-------
}
public static void main(String[] args) {
ClassC classC = new ClassC();
classC.printOut();
}
}
(PS:上方这段代码是不克不及编译的,我是举个例子罢了) classC到底会打印same还是Unsame纳?
(2)若是一个子类持续的多个父类中拥有雷同办法,子类中有没有覆盖该办法,那么调用该办法时将产生歧义,无法断定应当调用哪个父类的办法;
贴段代码看看:
class ClassA {
public void printOut() {
System.out.println( same );
}
}
class ClassB {
public void printOut() {
System.out.println( Unsame );
}
}
public class ClassC extends ClassA, ClassB {
public static void main(String[] args) {
ClassC classC = new ClassC();
classC.printOut(); //-----关键的一行-----
}
}
(PS:上方这段代码是不克不及编译的,我是举个例子罢了) classC到底会调用上方哪个父类的printOur()办
上方的这些都是致命的歧义,所以java中禁止一个类持续多个父类;
然则那个白头发的白叟在很多年前就给 java供给了接口,并能经由过程接口的功能获得多持续的很多长处而又摒弃了类与类多持续的毛病。
这到底是怎们做到的纳?嗯,好了,我们也来具体的解析一下:
java容许一个接口持续多个父接口,也容许一个类实现多个接口,而如许的多持续有上方提到的毛病吗?
因为有接口的抽象性,所以答案必然是没有;
1)在接口中不克不及有实例变量,只能有静态的常量,每个静态的常量在法度开端运行前都已经初始化成功,若是有重定名的呈现,编译器师长教师会及时的告诉你的;
2)接口中不克不及有具体的办法(包含办法体),只能有抽象办法,具体的办法只能由实现接口的类实现,在调用的时辰也只会调用实现类的办法,如许是不会存在歧义的;
那门开篇的那半人马就可以如许来写了:
interface Humain {
String arm = 2只能抓器材的胳膊;
void output();
}
interface Horse {
String leg = 4只能跑的腿;
void output();
}
interface Half extends Humain, Horse {
}
public class HalfHorse implements Half {
// 实现上方俩个接口里面的同名办法
// 这个类拥有两个接口的静态变量
public void output() {
System.out.println(我是个有 + arm + 和 + leg + 的半人马);
}
public static void main(String[] args) {
HalfHorse halfhorse = new HalfHorse();
halfhorse.output();
}
}
(PS:上方这段代码是可以编译经由过程的)
因为引入了接口,所以法度员有很大空间的想象力,这可能就是Java吸引很多人的魅力之一了。
读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。
Java省略了很多很罕用到,缺乏懂得,混合功能的C + +,在我们的经验中带来更多的悲戚大于收益 。
---------James Gosling
James Gosling 这小我大师应当很熟悉,就是最初设计Java 说话的的法度员,被称为“Java之父”,如今也有50多岁了,前几天还看过他的视频,很平易近民的一个白头白叟,可能和在中国小镇到处可见的白叟是一样的,完全看不出是那 SUN 的副总裁,也没有中国商人特有的做秀和滑头。
上方那段话是别人问到他关于 Java 为什么不克不及运算符重载(固然它确切有办法重载),多重持续,以及广泛的主动强迫转换时答复的一段话。他白叟家说多持续会带来更多的悲戚,这悲戚到底在什么处所纳?以下是我本身的一点解析(如有不正,大神你出手):
多持续的长处是显而易见的,一个子类能有多个父类的属性和办法,比如上方的那个希腊神话傍边的半人马师长教师,持续了人和马,上半身是人的躯干,包含手和头,下半身则是马身,也包含躯干和腿,既有速度又有思维和抓取器材的才能。
然则多持续的毛病也是一点就破:
(1)若是一个子类持续的多个父类中拥有雷同名字的实例变量,子类在引用该变量时将产生歧义,无法断定应当应用哪个父类的变量;
贴段代码给看看:
public class ClassA {
protected String a = same ;
}
public class ClassB {
protected String a = Unsame ;
}
public class ClassC extends ClassA, ClassB {
public void printOut() {
System.out.println( super .a); //-----关键的一行-------
}
public static void main(String[] args) {
ClassC classC = new ClassC();
classC.printOut();
}
}
(PS:上方这段代码是不克不及编译的,我是举个例子罢了) classC到底会打印same还是Unsame纳?
(2)若是一个子类持续的多个父类中拥有雷同办法,子类中有没有覆盖该办法,那么调用该办法时将产生歧义,无法断定应当调用哪个父类的办法;
贴段代码看看:
class ClassA {
public void printOut() {
System.out.println( same );
}
}
class ClassB {
public void printOut() {
System.out.println( Unsame );
}
}
public class ClassC extends ClassA, ClassB {
public static void main(String[] args) {
ClassC classC = new ClassC();
classC.printOut(); //-----关键的一行-----
}
}
(PS:上方这段代码是不克不及编译的,我是举个例子罢了) classC到底会调用上方哪个父类的printOur()办
上方的这些都是致命的歧义,所以java中禁止一个类持续多个父类;
然则那个白头发的白叟在很多年前就给 java供给了接口,并能经由过程接口的功能获得多持续的很多长处而又摒弃了类与类多持续的毛病。
这到底是怎们做到的纳?嗯,好了,我们也来具体的解析一下:
java容许一个接口持续多个父接口,也容许一个类实现多个接口,而如许的多持续有上方提到的毛病吗?
因为有接口的抽象性,所以答案必然是没有;
1)在接口中不克不及有实例变量,只能有静态的常量,每个静态的常量在法度开端运行前都已经初始化成功,若是有重定名的呈现,编译器师长教师会及时的告诉你的;
2)接口中不克不及有具体的办法(包含办法体),只能有抽象办法,具体的办法只能由实现接口的类实现,在调用的时辰也只会调用实现类的办法,如许是不会存在歧义的;
那门开篇的那半人马就可以如许来写了:
interface Humain {
String arm = 2只能抓器材的胳膊;
void output();
}
interface Horse {
String leg = 4只能跑的腿;
void output();
}
interface Half extends Humain, Horse {
}
public class HalfHorse implements Half {
// 实现上方俩个接口里面的同名办法
// 这个类拥有两个接口的静态变量
public void output() {
System.out.println(我是个有 + arm + 和 + leg + 的半人马);
}
public static void main(String[] args) {
HalfHorse halfhorse = new HalfHorse();
halfhorse.output();
}
}
(PS:上方这段代码是可以编译经由过程的)
因为引入了接口,所以法度员有很大空间的想象力,这可能就是Java吸引很多人的魅力之一了。