java学习笔记
java语言积累
1、什么时候“被覆盖”:
静态方法不能被覆盖,只能被隐藏,实例方法可以被覆盖。
01: class Super
02: {
03: static String greeting()
04: {
05: return "Goodnight";
06: }
07:
08: String name()
09: {
10: return "Richard";
11: }
12: }
01: class Sub extends Super
02: {
03: static String greeting()
04: {
05: return "Hello";
06: }
07:
08: String name()
09: {
10: return "Dick";
11: }
12: }
01: class Test
02: {
03: public static void main(String[] args)
04: {
05: Super s = new Sub();
06: System.out.println(s.greeting() + ", " + s.name());
07: }
08: }
结果:Goodnight, Dick
l 试图用子类的静态方法隐藏父类中同样标识的实例方法是不合法的 编译器将会报 错 l 试图用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的 编译器同样 会报错 l 静态方法和最终方法 带关键字final 的方法不能被覆盖 l 实例方法能够被覆盖 l 抽象方法必须在具体类1中被覆盖 |
2、String.equals()与===区别
equals比较的是字符串内容;==比较的是对象的引用的值.
01: public class StringExample
02: {
03: public static void main (String args[])
04: {
05: String s0 = "Programming";
06: String s1 = new String ("Programming");
07: String s2 = "Program" + "ming";
08:
09: System.out.println("s0.equals(s1): " + (s0.equals(s1)));
10: System.out.println("s0.equals(s2): " + (s0.equals(s2)));
11: System.out.println("s0 == s1: " + (s0 == s1));
12: System.out.println("s0 == s2: " + (s0 == s2));
13: }
14: }
结果:
s0.equals(s1): true
s0.equals(s2): true
s0 == s1: false
s0 == s2: true
常量池:是指在编译时期被确定的值,并保存在已编译的class文件中的一些数据。
3、java是强类型语言
它只支持8种基本类型数据类型。而8种数据类型始终被描述在JVM中。
4、那是构造函数
一般建议:只有构造方法才与类名同名.
在一个类中假如没有显式的构造函数存在 那么Java 会自动为其配备一个默认的无参数的构造函数而且这个构造函数是空的这种情 况当且仅当类中没有声明任何一个构造函数时才会发生假如类中已经存在了一个带任意参 数的构造函数那么Java 就不会再自动提供默认的无参数的构造函数了 |
01: public class IntAdder
02: {
03: private int x;
04: private int y;
05: private int z;
06:
07: public void IntAdder()
08: {
09: x = 39;
10: y = 54;
11: z = x + y;
12: }
13:
14: public void printResults()
15: {
16: System.out.println("The value of 'z' is '" + z + "'");
17: }
18:
19: public static void main (String[] args)
20: {
21: IntAdder ia = new IntAdder();
22: ia.printResults();
23: }
24: }
结果为0;
5、不能访问被覆盖的方法
可以通过包含关键字super 的方法调用表达式来访问被覆盖的方法注意尝试用全局 名或强制转换为父类型以求访问一个被覆盖的方法都是无效的 无法访问父类中被子类覆盖的方法的原则仅仅适用于实例方法也就 是非静态方法 假如你怀疑你所使用的某个对象实际上是一个子类的实例那么你可以调用它的getClass().getName()方法来判断它的真实身份. 又如果你是编写增加了新功能的子类的程序员那你必须确保进行兼容性测试或者保证在编写程序时任何新增的功能都是通过增加新的方法而不是覆盖父类方法实现的 |
6、避免落入隐藏变量的陷阱
理解变量成员是如何被隐藏的 |
(1)不同类型的Java变量:
Java一共有6种变量类型:类变量、实例变量、方法参数、构造函数参数、异常处理器参数以及局部变量。
类变量包括:类中声明的静态数据成员、接口体中声明的静态成员和非静态数据成员。
实例变量:在类体中声明的非静态变量。
方法参数:用来传入一个方法体的。
构造函数参数:用来传入一个构造函数体的。
异常处理参数:用来传入一个try语句的catch块中的。
局部变量:在一个代码块中或一个for语句中声明的变量。
01: public class Types
02: {
03: int x; // instance variable
04: static int y; // class variable
05: public Types(String s) // s is a constructor parameter
06: {
07: // constructor code f.
08: }
09: public createURL(String urlString) //urlString is a method parameter
10: {
11: String name = "example"; // name is a local variable
12: try
13: {
14: URL url = new URL(urlString);
15: }
16: catch(Exception e) // e is a exception-handler parameter
17: {
18: // handle exception
19: }
20: }
21: }
(2)何种变量能够被隐藏:
实例变量和类变量能够被隐藏。
(3)如何访问被隐藏的变量
this:可以限定一个正被局部变量隐藏的实例变量
super:可以限定一个正被子类隐藏的实例变量。
(4)变量隐藏与方法覆盖的区别
一个类的实例,无法通过使用全局名,或者强制转换自己为其父类的类型,来访问父类中的被覆盖的方法。
强制转换子类的实例为父类类型后,我们就可以访问父类中被隐藏的变量。
数据隐藏与方法覆盖的另一个不同之处:静态方法不能覆盖父类的实例方法。而静态变量却可以隐藏父类同名的一个实例变量。
实例方法也不能覆盖父类的静态方法,而实例变量却可隐藏父类同名的变量成员。
7、提前引用
类变量以及静态初始化块是在类被JVM加载时初始化操作的。
静态初始化块和类变量时按照其在代码中出现的顺序依次执行初始化操作的。
若用方法调用初始化静态变量,那么必须保证方法不依赖于他们之后声明的其它静态变量。
8、设计易被继承的构造方法
设计合适的构造方法满足需求。
9、通过引用传递基本类型
基本类型不是对象,不能通过引用来传递。
10、布尔运算符与“短路”运算符
布尔运算符:& 和 | (两边都是boolean型值,那么&才被认为是布尔运算)
位运算符 :&& 和 ||