容易忽略java细节,你了解吗

1.

public class Something {
 void doSomething () {
 private String s = "";
 int l = s.length();
 }
 }


有错吗?
答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

structfp 精确浮点,类或方法中的的float/double都遵循一定的标准,让浮点运算更加精确,使计算不会因为不同平台而结果不一样。

2.方法参数被修饰为final时,方法体内不可以修改该参数:如果是基本类型,当然不可以;是引用类型也不能修改引用指向,但是可以修改引用类型所指对象的成员变量。

3.

class Something {
 int i;
 public void doSomething() {
 System.out.println("i = " + i);
 }
 } 

 class Something {
 final int i;
 public void doSomething() {
 System.out.println("i = " + i);
 }
 }

第一个类和第二个类正确吗?
第一个正确,没加final的int变量默认值为0;第二个错误,加了final,没有默认值,必须在构造函数之前赋值,可以在声明的时候赋值即可。

4.
 public class Something {
 public static void main(String[] args) {
 Something s = new Something();
 System.out.println("s.doSomething() returns " + doSomething());
 }
 public String doSomething() {
 return "Do something ...";
 }
 }
静态方法调用非静态方法,明显不对,但是怎么才能改对呢?
Sysytem.out.println("s.doSomething()  returns " + s.doSomething())即可

5.
此处,Something类的文件名叫OtherThing.java
 class Something {
 private static void main(String[] something_to_do) { 
 System.out.println("Do something ...");
 }
 }
正确吗?yes
java的class名字可以不和文件名相同,但是必须和public class类名相同。

6.
interface A{
 int x = 0;
 }
 class B{
 int x =1;
 }
 class C extends B implements A {
 public void pX(){
 System.out.println(x);
 }
 public static void main(String[] args) {
 new C().pX();
 }
 }
答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。


7.
interface Playable {
 void play();
 }
 interface Bounceable {
 void play();
 }
 interface Rollable extends Playable, Bounceable {
 Ball ball = new Ball("PingPang");
 }
 class Ball implements Rollable {
 private String name;
 public String getName() {
 return name;
 }
 public Ball(String name) {
 this.name = name; 
 }
 public void play() {
 ball = new Ball("Football");
 System.out.println(ball.getName());
 }
 }

正确吗?错误,这个不容易发现。
"interface Rollable extends Playable, Bounceable"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。

8.用最有效率的方法算出2乘以17等于多少
2<<4+2
位操作

9.求余运算符,只有被除数(%左边的操作数)是负数时,余数才是负的或零。
 
10.构造函数调用顺序:为对象分配的存储空间初始化成二进制零,调用基类构造函数,按顺序调用成员初始化模块(调用类中如下的成员变量的构造函数:Test t = new Test()。如果只是一个引用,没有new对象,哪里实现该对象,哪里调用构造函数),调用子类构造器函数。
 
11.retry是个标记,表示记录当前行号因为JAVA里面没有goto语法(虽然goto还是一个关键字,所以使用continue后带标号的方法跳出一个内部循环而到一个外部循环的语法,所以出现了 retry,后面通常有continue retry表示返回retry处)
 
12.C++中非零整数可以代表boolean值true,0代表boolean值false;java中整数0或者非0均不能代表boolean值。
 
13.Math.random()的值为大于等于 0.0 且小于 1.0 的伪随机 double
 
14.Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())。由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 Java TM 编程语言不需要这种实现技巧。)
 
15.为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。确保用作键值的对象的唯一性。
 
16.如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果.Object类中hashCode方法的返回值和对象的内存地址有关,要两个对象相等,两个对象的地址就要一样,也就是说对象的引用是一样的。Object类的equals方法和“==”比较结果一致,类对象通过等号比较的是内存中地址。
 
17.Object中的hashCode方法和equals方法相关说明:
equals方法:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码
hashCode方法:常规协定:
    在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
   如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果
   如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
 
18.java中的instanceof是一个二元运算符,可以用来判定对象是不是某种类型或者子类型,返回值为true或者false。
class Test1{}
class Test2{}
public class Test{
 public static void main() {
  Test1 t1 = new Test1();
 //下面这句编译不能通过,原因是上面明确了t1是Test1类的对象
  //System.out.println(t1 instanceof Test2);
  
 //类型改为Object就可以看见instanceof输出false
  Object t1 = new Test1();
  System.out.println(t1 instanceof Test1);
 }
}

19.Java:if (null == name)将null写在前面有什么说道吗?还是说前后都一样?
在java里面,它们是一样的。但是为什么把name==null写成是null==name,具体点来说,是在C语言里面引申出来的。
在C语言里面,为了防止少敲一个等号,编程人员仍然能在编译的时候找到错误。因为if(name=null)是在编译的时候,不会出现错误,而if(null=name)是会编译出错。
故而,null==name,是在C语言的编程习惯引入进来的。当然了,在java里面,if(name=null)是会出现编译错误的,现在就不用担心这个了。但是,良好的编程习惯,还是写成null==name的好。

20.判断String对象为null或者为“”。
String s=……;  if (null == s || s.equals("")){}
if(s == null || s.length() <= 0);(效率比较高的一种写法)
判断String对象不为null并且不为“”
if(null != s && !s.equals(""))
if(null ! =s &&  0 < s.length())     (为什么要将null放在前面,参考上面19条)
String引用值为null的时候就是对象没有产生,不能调用String的非静态方法,哪怕只是作为判断条件,这样会报空指针异常。作为判断条件,如果与null要一起存在,最好把null作为第一个条件。根据系统判断原则(逻辑短路),可能第一个条件就足够了,系统就不会判断第二个条件,这样也不会报错。
为了避免报空指针异常,我们可以把 s.equals("")改为“”.equals(s),如此null就不必要做为第一个条件了。

String的equals方法我们推荐把已知的非null的String对象作为调用方法的对象,未知的对象我们放在参数里面。
if( null == s || "".equals(s))



String对象用双引号初始化的一般都存储在常量池,常量池如果字符串一样,则只占用一块存储空间;用new初始化的存储在堆内存中,不管字符串是否一样,没new一次则占用一块内存空间。
String a="";String b=""; 此时a==b,
String a="";String b=new String("");此时a不等于b,
因为引用对象用等号比较的是两个对象的地址,不是字符串值。

21.File类是文件或目录路径名的抽象表示。linux名称分隔符(separatorChar)为“/”,widows系统的名称分隔符为“\\”(其中一个反斜杠用来转义)。

22.jsp中的路径问题( 推荐不加base标签,这样的话我们能直接写路径[当前文件所属文件夹路径]和使用../
没有配置base的情况下:
在jsp中使用路径的话 直接写(例如:test/test.png),此时系统会自动在此路径前面 加上当前页面所在文件夹的路径,例如:http://localhost:8080/项目名/文件夹名/; 加上/的话(例如:/test/test.png),此时系统会自动在此路径前面 加上http://localhost:8080/;推荐用../来处理比较好, ../代表 当前目录的上一层目录,我们可以写多个../组合起来,例如:../../代表的是当前目录的上一层的上一层目录。

有配置base(一般jsp中的base配置都是如下这样)的情况下:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
 
直接在后面写路径来处理比较好。一般jsp中base都是如下这样的,此时在jsp页面中使用路径的话推荐 直接写(例如:test/test.png),系统会自动在前面 加上http://localhost:8080/项目名/。如果jsp页面中使用路径时 加了/开头(例如:/test/test.png),此时系统会自动在此路径前面加上 http://localhost:8080/一个或者多个../都会当做路径前面 加了http://localhost:8080/,不能当做当前目录的上一层目录。

action的路径的话要能正确访问的话,必须是 http://localhost:8080/项目名/action命名空间/action名字。(所以能够拼成这样的路径的方法均可以)

23.


你可能感兴趣的:(java基础)