我的心得,第三份
(71) 静态方法不能被覆盖,只能被隐藏
(72)wait()和notify()方法必须在带有synchronize修饰的方法内
(73)
Integer i=new Integer(9);
Long l=new Long(10);
System.out.println(i+l); //出错
int a=1;
System.out.println(i+a); //出错
(74) char c=97 那么System.out.println(c); 输出a
char c=’a’ 那么System.out.println((int)c); 输出97
(75) 要记住字符类型char是不能用重载后的+操作符的。
String s=””; char c=’a’;
c+=s; //这是错误的
s+=c; //正确
(76)
String s1="hello";
String s2="hello";
s1和s2指向同一个String对象:"hello"也就是说s1和s2都是同一个对象的引用,它们指向同一内存地址因此使用==和equals()比较它们都是返回真
String s3=new String("hello");
String s4=new String("hello");
s3和s4各自指向不同的两块内存,这两块内存上的内容都"hello"
也就是说s3和s4是不同的两个对象 于equals()比较的是类型和内容,因此使用equals()比较时返回真使用==比较的是对象本身,因此返回假
比较基本类型与对象类型的不同之处,基本类型进行的是值比较,而对象类型进行的是地址比较,也就是对指向它们内存地址的指针进行比较。
考察“==”及方法“equals()”的用法。注意以下几点区别:
1) 引用类型比较引用;基本类型比较值。
2) equals()方法只能比较引用类型,“==”可比较引用及基本类型。(五同类的对象比较不能用== 否则编译出错)
3) 当用equals()方法进行比较时,对类File、String、Date及封装类(Wrapper Class)来说,是比较类型及内容。
4) 用“==”进行比较时,符号两边的数据类型必须一致(可相互转换的基本类型除外),否则编译出错。
例如:基本类型与对象不能比较,否则编译出错。
(77)StringBuffer类没有contact()方法;String类没有append()方法
(78)数组例如String[] str的长度是str.length 而对象例如String str1的长度是str1.length()
(79)Vector里的的元素只能是对象,不能原始数据类型
(80)native关键字指明是对本地方法的调用,在JAVA中是只能访问但不能写的方法,它的位置在访问权限修饰语的后面及返回值的前面
(81)
b. 对原始数据类型例如boolean,byte的变量的声明将为之分配内存空间。
c. 非原始数据类型例如String,Vector的变量的声明不会为该对象分配内存。
而非原始数据类型的变量必须用new Xxxx()分配内存及初始化。因为只有原始类型的实例变量和类变量的声明在类对象被创建/类被加载时完成内存的自动分配,而原始类型的局部变量必须显式初始化,从这点来看原始类型的局部变量没有被自动分配内存,SL275中只提出了非原始数据类型的变量必须使用new Xxxx()完成内存的分配而没有指出原始数据类型的变量是否在声明时即自动进行内存分配,而从局部变量不能在显式初始化前使用这点来看在声明时没有进行内存分配,因此答案b的正确性还有待官方的确定。
(81) API类文档的内容主要是:类层次、类及用途描述、成员变量列表、构造方法列表、成员方法列表、从类层次上继承的方法列表、成员变量的详细说明、构造方法详细说明、成员方法详细说明。
(82)局部变量也叫自动变量。Local variables are also called automatic variables.
(83) Java中的package语句必须是源文件中除去说明以外的第一条语句,导入包语句可以有几个,但是必须位于package语句之后,其它类定义之前,一个源文件中可以有几个类,但最多只能有一个是public的,如果有,则源文件的文件名必须和该类的类名相同。
(84) 一个新创建的线程并不是自动的开始运行的,必须调用它的start()方法使之将线程放入可运行态(runnable state),这只是意味着该线程可为JVM的线程调度程序调度而不是意味着它可以立即运行。线程的调度是抢先式的,而不是分时间片式的。具有比当前运行线程高优先级的线程可以使当前线程停止运行而进入就绪状态,不同优先级的线程间是抢先式的,而同级线程间是轮转式的。一个线程停止运行可以是因为不同原因,可能是因为更高优先级线程的抢占,也可能是因为调用sleep()方法,而即使是因为抢先而停止也不一定就进入可运行队列的前面,因为同级线程是轮换式的,它的运行可能就是因为轮换,而它因抢占而停止后只能在轮换队列中排队而不能排在前面。
所以:使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行;一个线程可能因为不同的原因停止(cease)并进入就绪状态
线程的执行是从方法“run( )”开始的,该方法是由系统调用的。程序员手工调用方法start(),使线程变为可运行状态。。
(85)通过父类变量访问子类成员时,只限于“复盖”的情况发生,
例如:父类:person p= 子类方法:new man();p是父类引用指向子类对象。此时,编译器认为p是一个person,而不是man ,所以p只能实现父类的功能。但是当p调用被覆盖方法时,是指向子类中的该方法。所以如果话此Will construct a person’s object(时创建一个person 的对象p系error)
静态方法不能被覆盖,只能被隐藏
同名的方法不是覆盖,就重载!(否则编译出错)
方法重载的规则是:一、调用声明的参数列表必须足够不同以便可以无歧义的决定调用合适的重载方法;二、返回值可以不同,但是不能是重载时唯一的不同点。方法重写发生在类继承时,子类可以重写一个父类中已有的方法,必须在返回类型和参数列表一样时才能说是重写,否则就是重载,java中方法重写的一个重要而且容易被忽略的规则是重写的方法的访问权限不能比被重写的方法的访问权限低!重写的另一个规则是重写的方法(子类方法)不能比被重写的方法(父类方法)抛弃(throws)更多种类的异常,其抛弃的异常只能少,或者是其子类,不能以抛弃异常的个数来判断种类,而应该是异常类层次结果上的种类。
(86)garbage collection:
垃圾收集将检查并释放不再使用的内存。
Java语言将内存分配和释放的工组交给了自己,程序员不必的空闲处理中,垃圾收集线程将检查和释放不再使用的内存(即可以被释放的内存)。垃圾收集的过程在java程序的生存期中是自动的,不需要分配和释放内存,也避免了内存泄漏。可以调用System.gc()方法建议(suggest)JVM执行垃圾收集以使得可被释放的内存能立即被使用,当此方法返回的时候,JVM已经做了最大的努力从被丢弃的对象上回收内存空间。程序员不能指定收集哪些内存,一般而言也不用关心这个问题,除非是程序的内存消耗很大,特别是有很多临时对象时可以“建议“进行垃圾收集以提高可用内存。需要指出的是调用System.gc()方法不能保证JVM立即进行垃圾收集,而只能是建议,因为垃圾收集线程的优先级很低(通常是最低的)。
(87)
在JAVA,有两种传递参数给方法的途径:值传递,引用传递。
值传递:在java,所有的原始数据类型的参数系值传递,这意味着参数的原始值不能被,被调用方法而改变。被调用方法仅获得变量的一份拷贝。方法会在本地创建一个变量的复本来使用,你对这个复本进行赋值,只是改变复本的值而已,不会影响到原始对象。
引用传递:它也叫“按址传递” ,把原始对象的内存地址传递给函数,函数对参数进行改动,都按照对象的内存地址,直接作用到原始对象,所以赋值也就是改动原始对象。
那么为什么传递StringBuffer之后,函数里可以修改原始对象呢?
这是因为声明一个变量,就是创建一个指向原始对象的引用(其实就是指针啦)。当它作为参数传递给函数之后,在函数里会复制这个引用,复本当然也指向同一对象喽。因此,对复制的引用所调用的方法更改的是同一个对象。
(88)
逻辑运算符“&&”、“||”,在运算中有“短路”行为:例如 A&&B,如果A的值为false,则直接将整个表达式的值置为false,对B的值不加考察。而运算符“&”、“|”就没有这种行为。所以在选项A、C中,“s.length()”会导致抛出空指针异常。
Given the following definition:
String s = null;
Which code fragments cause an object of type NullPointerException to be thrown?
A. if((s!=null)&(s.length()>0))
B. if((s!=null)&&(s.length()>0))
C. if((s==null)|(s.length()==0))
D. if((s==null)||(s.length()==0))