Java解惑七:很多其它类之谜

谜题66

继承的问题。

对于实例方法:命名同样时,子类会覆写父类的方法,且訪问权限至少和父类一样大。

对于域:命名同样时,子类会隐藏父类的域,且訪问权限随意。

谜题67

不要重用库中的类名。

谜题68

命名的问题。

类名应该以大写字母开头,形式为:MixedCase。

变量以小写字母开头,形式为:mixedCase。

常量以大写字母开头,形式为:MIXED_CASE。

单个大写字母,仅仅能用于类型參数,形式为:Map<K, V>。

包名应该都是小写,形式为:lower.case。

当一个变量和一个类型具有同样的名字,而且作用于同样的作用域时,变量名具有优先权。

即:变量名遮掩(obscure)类型名。相同变量名和类型名能够遮掩包名。

class X {
	static class Y {
		static String Z = "Black";
	}
	static C Y = new C();
}
class C {
	String Z = "White";
}
public class ShadesOfGray {
	public static void main(String[] args) {
		System.out.println(X.Y.Z); //输出结果是:White
	}

}

谜题69

怎样引用上题中的被遮掩的类型名。

技巧在某一种特殊的语法上下文环境中使用该名字,语法上下文环境同意出现一个类型名可是不同意出现变量。

技巧一

<span style="font-size:18px;">		System.out.println(((X.Y)null).Z);</span>

技巧二

<span style="font-size:18px;">static class Xy extends X.Y{};
System.out.println(Xy.Z);</span>

技巧三: 5.0版本号之后

<span style="font-size:18px;">public static <T extends X.Y> void main(String[] args) {
       System.out.println(T.Z);
}</span>

谜题70

具有包内訪问权限修饰的方法的类,在其它包内被继承时,该方法不可能被覆写。

即使是方法名同样,也是两个不同的方法。

谜题71

名字重用导致遮蔽(shade):一个声明仅仅能遮蔽类型同样的还有一个声明。

静态导入Arrays.toString,当在类中使用toString()时,会调用Object类中的toString方法。

谜题72

名字重用的问题。

final修饰符

对于方法:实例方法不能覆写,静态方法不能隐藏。

对于域:不能被赋值超过一次。因此能够被隐藏。

谜题73

遮蔽:被遮蔽类型能够来自外围类,而不是来自库。

隐藏:本来调用的父类的变量,结果声明了一个同名的私有的变量。

谜题74

重载方法要确定全部的重载版本号一致。

谜题75

版本号升级后带来的不一致,了解就可以。

名字重用术语表

覆写(override)

一个实例方法能够覆写(override)在其超类中可訪问大的具有同样签名的全部实例方法,从而能动态分派,,VM将基于实例执行期类型来选择要调用的覆写方法。

class Base {
     public void f(){}
}
class Derived extends Base {
    public void f() {} //override Base.f()
}

重载(overload)

同一个类中,方法名同样,签名不同。重载的方法是编译期选定的

class A {
     public void f (int i){}
     public void f (String s)  {}
}

隐藏(hide)

子类中的一个域、静态方法或成员类型能够隐藏超类中可訪问到具有同名的全部与、静态方法或成员类型。

隐藏一个成员将阻止其被继承。

class Base {
     public static void f() {}
}

class Derived extends Base {
     public static void f() {}
}

遮蔽(shadow)

变量、方法或类型能够遮蔽文本范围内具有同样名字的全部变量、方法、或类型。

class WhoKnows {
      static Stirng sentence = "I do not know";
        public static void main(String [] args) {
              String sentence = "i know"; //shadow static field
               system.out.println(sentence);
         }
}

遮掩(obscure)

变量能够遮掩同一范围内同样名字的类型,

变量或者类型能够遮掩一个包。

public class Obscure {
    static String System; //Obscures type java.lang.System
    public static void main(String[] args) {
     	System.out.println("hello"); //won't compile
    }
}
时间: 2024-08-27 13:32:41

Java解惑七:很多其它类之谜的相关文章

Java解惑七:更多类之谜

谜题66 继承的问题. 对于实例方法:命名相同时,子类会覆写父类的方法,且访问权限至少和父类一样大. 对于域:命名相同时,子类会隐藏父类的域,且访问权限任意. 谜题67 不要重用库中的类名. 谜题68 命名的问题. 类名应该以大写字母开头,形式为:MixedCase. 变量以小写字母开头,形式为:mixedCase. 常量以大写字母开头,形式为:MIXED_CASE. 单个大写字母,只能用于类型参数,形式为:Map<K, V>. 包名应该都是小写,形式为:lower.case. 当一个变量和一

Java解惑八:更多库之谜

本文是根据JAVA解惑这本书,做的笔记. 电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题76 将线程的启动方法start(),写成了run(); PS:管程(monitor)锁有待进一步理解. 谜题77 线程中锁的问题. 理解不深刻. 谜题78 反射会造成访问其他包中的非公共类型的成员,引起运行期异常. 谜题79 遮蔽:Thread.sleep()方法遮蔽了自定的方法. 谜题80 反射:如何实例化非静态内部类以及静态内部类.

Java解惑五:类之谜

本文是依据JAVA解惑这本书,做的笔记.电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题46 函数重载的问题. JAVA重载解析过程:1. 选取全部可用的方法或者构造器:2. 从过程1中选取的方法或构造器中选择最精确的. 一般而言:能够强制要求编译器选择一个精确的重载版本号,将实參转型为形參所声明的类型. 谜题47 继承中静态域的问题. 静态域由声明它的类及其全部子类共享. 假设须要让每个子类都具有某个域的单独拷贝,必须在每个子

Java解惑八:很多其它库之谜

本文是依据JAVA解惑这本书,做的笔记. 电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题76 将线程的启动方法start(),写成了run(); PS:管程(monitor)锁有待进一步理解. 谜题77 线程中锁的问题. 理解不深刻. 谜题78 反射会造成訪问其它包中的非公共类型的成员.引起执行期异常. 谜题79 遮蔽:Thread.sleep()方法遮蔽了自定的方法. 谜题80 反射:怎样实例化非静态内部类以及静态内部类.

Java解惑六:库之谜

本文是根据JAVA解惑这本书,做的笔记. 电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题56 BigInteger.BigDecimal以及包装类型的实例是不可改变. BigInteger five = new BigInteger("5"); BigInteger total = BigInteger.ZERO; total.add(five); //这并不会改变total的值,调用该方法的返回值,才是加法得到的结

Java解惑四:异常之谜

谜题36 finally语句中的return语句会覆盖掉try语句中的. 谜题37 该部分还需要进一步理解 一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查集合的交集. Java解惑四:异常之谜,布布扣,bubuko.com

Java解惑三:循环之谜

谜题24 byte是有符号的,范围是-128 - 127.而0x90是int类型.比较的时候,不相等. 如果想让其相等,需要进行类型转换:(byte & 0xff) 或者 (byte)0x99. 谜题25 自增运算符对循环的影响.j = j++,先赋值. 谜题26 Integer.MAX_VALUE加一之后会变成Integer.MIN_VALUE,这对循环会有影响. 可以考虑使用long来表示i变量,或者使用效率更高的i != Integer.MAX_VALUE. 谜题27 (-1 <<

Thinking In Java笔记(第七章 复用类)

第七章 复用类 复用代码是Java众多引人注目的功能之一,但想要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. Java中所有事物都是围绕着类来展开的.通过创建新类来复用代码,不必重新开头编写.此方法的窍门在于使用类而不破坏现有程序代码.本章中有两种代码重用机制来达到这一目的: 只需要在新的类中生成现有类的对象.由于新的类是由现有类的对象所组成的,这种方法通常成为组合.该方法只是复用了现有程序代码功能,而非形式上和之前的类有相似之处. 第二种方法更加细致

《Java解惑》读书笔记

 摘选自<Java解惑>一书,之前整理了部分,一直没看完,最近为了督促自己每天读点这本书,决定一天至少更新一个谜题的内容,欢迎讨论. 欢迎关注技术博客http://blog.sina.com.cn/u/1822488043 Java解惑读书笔记 谜题1:奇数性 取余操作的定义: ( a / b ) * b + ( a % b ) = a 其中(a/b)是java运算的结果,也就是a/b是一个整数,比如3/2=1. 所以当取余操作返回一个非零结果的时候,它与左操作数具有相同符号. 请测试你的