2006年5月23日

       Java的引用是Java和C++的主要区别之一,也是Java比C++好用的地方,Java语言明确说明取消了指针,这只是在Java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用.而这也是很多程序员在编程中常常忽略了对象与引用的区别.更是公司笔试的时候最喜欢考的地方.
        CSDN上的Java引用的笔试题:
 
第一题:      
  public class Test {
    public static void changeStr(String str){
        str="welcome";//1
    }
    public static void main(String[] args) {
        String str="1234";//2
        changeStr(str);
        System.out.println(str);
    }
}
答案是"1234".
        详细分析:
Java中函数参数传递是值传递,在C语言以后的都是这样的,关键是传进来的值是什么。
①如果参数是基础类型,如int型的,则传进来的是int型变量的值,这个值放在堆里的。
举个例子:
void fun(int i){};
int i = 5;
fun(i);
传进fun函数的是5;
②如果参数是引用类型。如String型的,则传进来的是String型变量的值,这个值放在栈里,此值是该变量将要指向的对象的地址,实际的对象是放在堆的。
举个例子:
void fun(String str0){};
String str = "Hello";
fun(str);

fun()方法调用时第一件事就是,做了一个赋值操作:str0 = str;
这个操作的结果就是将str变量的值传给str0变量的值,也就是使得str0也指向str所指向的对象。对str0所指向的对象做修改操作,也就是对str所指的对象做修改。

第二题:
1.class X2{
2.         public X2 x;
3.         public static void main(String[] args){
4.         X2 x2=new X2();
5.         X2 x3=new X2();
6.         x2.x=x3;
7.         x3.x=x2;
8.         x2=new X2();
9.         x3=x2;
10.         doComplexStuff();
11.}
12.}
after line 9 runs,how many objects are eligible for garbage collection?
A.0  B.1  C.2  D.3  E.4

这道题比较BT,首先要搞清楚Java的内存分配机制
Java中 内存有2部分:stack和heap
stack:存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中
Heap:存放用new产生的数据
TIJ中说了Java的GC就是首先从stack和静态分配区的ref查找heap中对应的对象
,如果heap对象没有找到相应ref就回收它.
可以这样理解在第7行的时候都是正常的
x2 -> A
x2.x -> B
x3 -> B
x3.x -> A
问题就在8行,给x2 重新new出来一个对象,x2的成员对象x就是null了,x3.x还是指向A,A还是没有给释放.
9行,x3也给重新赋值了和x2指向同一个对象,A和B都不到在stack上的ref了,所以
A和B给回收了
answer :C

posted @ 2006-05-23 15:40 宗凯 阅读(341) | 评论 (0)编辑 收藏

2006年5月22日

 java的日期显示要涉及到java.util的3个类,
一.  Date
  最早JDK处理时间/日期的类.
  例如:
import java.util.*;
import java.text.*;

public class TestDate {
   public static void main(String[] args){
     Date date = new Date();
     System.out.println(date);
    }
}
  得到的结果是格林威治标准时间 :Mon May 22 18:05:17 CST 2006
import java.util.*;
import java.text.*;

public class TestDate 1{
   public static void main(String[] args){
     Date date = new Date();
     System.out.println(date);
    }
}
  返回该日期表示的从 GMT 1970 年 1 月 1 日 00:00:00 起的毫秒数.

二. DateFormate 
      DateFormate日期/时间格式化子类的一个抽象类.DateFormat类的一个目标是建立一个人们能够识别的字符串。然而,因为语言的差别,不是所有的人希望看到严格的相同格式的日期。法国人更喜欢看到 "25 decembre 2000,",但是美国人习惯看到"December 25,2000."所以一个DateFormat的实例创建以后,这个对象包含了日期的显示格式的信息。如果使用用户电脑区域设置缺省的格式,你可以象下面那样,创建DateFormat对象,使用getDateInstance()方法:

DateFormat df = DateFormat.getDateInstance();

import java.util.*;
import java.text.*;

public class NowString {
public static void main(String[] args) {
Date now = new Date();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(now);
System.out.println(s);
}
}
得到的结果是 2005-5-22;

DateFormat还提供了几个选择日期格式,你可以通过使用重载的 getDateInstance(int style)获得。出于方便的原因,DateFormat提供了几种预置的常量,你可以使用这些常量参数。下面是几个SHORT, MEDIUM, LONG, 和FULL类型的示例

例如:
import java.util.*;
import java.text.*;

public class StyleDemo {
public static void main(String[] args) {
Date now = new Date();

DateFormat df = DateFormat.getDateInstance();
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT);
DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);
DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL);
String s = df.format(now);
String s1 = df1.format(now);
String s2 = df2.format(now);
String s3 = df3.format(now);
String s4 = df4.format(now);

System.out.println("(Default) Today is " + s);
System.out.println("(SHORT) Today is " + s1);
System.out.println("(MEDIUM) Today is " + s2);
System.out.println("(LONG) Today is " + s3);
System.out.println("(FULL) Today is " + s4);
}
}


显示结果为:
Default) Today is Nov 8, 2000
(SHORT) Today is 11/8/00
(MEDIUM) Today is Nov 8, 2000
(LONG) Today is November 8, 2000
(FULL) Today is Wednesday, November 8, 2000


但是如果我希望看到秒数和分钟怎么办?
可以尝试将从工厂方法中获得的 DateFormat 变形为 SimpleDateFormat
例如:
import java.util.*;
import java.text.*;

public class TestSimpleDateFormat{
  public static void main(String[] args){
     SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     Date date = new Date();
     System.out.println(sf.format(date));
  }
}
得到的结果是 2005-05-22 18:30:17

三 Calendar 类 Calendar是JDK提供的日历类.

import java.util.*;
import java.text.*;
public class TestCalendar {
    public static void main(String[] args){
       Calendar calendar = Calendar.getInstance();
       calendar.set(Calendar.HOUR_OF_DAY,10);//设置小时是24小时制的10点
       calendar.set(Calendar.MINUTE,30); //设置分钟是30
       calendar.set(Calendar.SECOND,30); //设置秒数是30
       Date time =   calendar.getTime();
   SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   System.out.println(sf.format(time));
    }

得到结果是 2005-05-22  10:30:30
 
我现在想得到10年前的日期怎么办啊?
import java.util.*;
import java.text.*;
public class TestCalendar {
    public static void main(String[] args){
       Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.YEAR,-10);//设置年份为当前-10
       Date time =   calendar.getTime();
   SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   System.out.println(sf.format(time));
    }


我现在想得到100天前的日期怎么办啊?
import java.util.*;
import java.text.*;
public class TestCalendar {
    public static void main(String[] args){
       Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DAY_OF_YEAR,-100);//设置日期为当前-100前.
       Date time =   calendar.getTime();
   SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   System.out.println(sf.format(time));
    }

只要修改时间域即可,很简单的.

对了想知道星期几怎么办?
import java.util.*;
import java.text.*;
public class TestCalendar {
    public static void main(String[] args){
       Calendar calendar = Calendar.getInstance();
      calendar.add(Calendar.DAY_OF_YEAR,-99);
      Date time =   calendar.getTime();
   SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");//加上星期啦.
   System.out.println(sf.format(time));
    }


想修改星期怎么办?

import java.util.*;
import java.text.*;
public class TestCalendar {
    public static void main(String[] args){
       Calendar calendar = Calendar.getInstance();
   
       calendar.set(Calendar.DAY_OF_WEEK,1);//本周的第一个星期日.
       Date time =   calendar.getTime();
   SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
   System.out.println(sf.format(time));
    }
}
 
OK,就这么多,Calendar可以轻松的得到日期和时间.

posted @ 2006-05-22 18:39 宗凯 阅读(1340) | 评论 (0)编辑 收藏
仅列出标题