BloveSaga

在希腊帕尔纳斯山南坡上,有一个驰名世界的戴尔波伊神托所,在它的入口处的巨石上赫然锈刻着这样几个大字: 认识你自己!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  34 随笔 :: 12 文章 :: 122 评论 :: 0 Trackbacks

#

     摘要: JAVA 程序员面试 32 问 第一,谈谈 final , ...  阅读全文
posted @ 2006-06-05 15:16 蓝色Saga 阅读(314) | 评论 (2)编辑 收藏

>>>>>>>>>>>>>>>>Runtime和Process类<<<<<<<<<<<<<<<<<<<
1> 每一个Java程序都有一个Runtime类的单一实例。
2> 通过Runtime.getRuntime()获取Runtime类的实例。
3> Runtime类是使用单例模式的一个例子。
   Runtime没有public的构造方法。我们必须用Runtime的静态方法getRuntime();我们可以用
   Runtime的exec来执行一个外部程序,也可以用来编译一个源文件(用来做图形界面的编译器)。
import java.io.*;
class RuntimeTest
{
 public static void main(String[] args)
 {
  Runtime rt=Runtime.getRuntime();
  //System.out.println(rt.freeMemory());
  try
  {
   //rt.exec("notepad");
   Process p=rt.exec("java ArrayTest");
   InputStream is=p.getInputStream(); //从执行ArrayTest类所得来的
   int data;
   while((data=is.read())!=-1)
   {
    System.out.print((char)data);
   }
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
}

------------->>设计模式<<-------------
1> 在我们进行程序设计时,逐渐形成了一些典型问题和问题解决方案,这就是软件模式。
2> 每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案。
3> 当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。
<$>单例(Singleton)模式
1> 一个类只有一个实例,而且自行实例化并像整个系统提供这个实例,这个类称为单例类。
2> 单例类的一个重要特点就是类的构造方法是私有的,从而避免了外部用利用构造方法直接创建多个实例。
   如:Runtime类。

单例类的实现:(code)
class Singleton
{
 private static final Singleton st=new Singleton();
 private Singleton()
 {
  
 }
 public static Singleton getInstance()
 {
  return st;
 }
}

posted @ 2006-06-05 14:47 蓝色Saga 阅读(313) | 评论 (0)编辑 收藏

=============================封装类===============
针对八种基本数据类型定义的相应的引用类型-封装类(包装类,包裹类)
基本数据类型          封装类
 boolean               Boolean
 byte                  Byte
 short                 Short
 int                   Integer
 long                  Long
 char                  Character
 float                 Float
 double                Double
所有的封状类都是一个只读类(不能修改的).针对没个基本类型我们只能建立一个这读的。

class Test
{
 public static void main(String[] args)
 {
  int i=3;
  Integer in=new Integer(i);
  int j=in.intValue();
  System.out.println(j);
  String str=in.toString();  //把Integer对象转换为String类型
  System.out.println("str="+str);
  
  String str1="123";
  System.out.println(Integer.valueOf(str1));  //把String类型转换为Integer类型
  
  boolean b1=false;
  Boolean b=new Boolean(b1);
  String s1=b.toString();
  System.out.println(s1);
  
  String s2="NO";
  System.out.println(Boolean.valueOf(s2));
 }
}

*****************Class*********************
1> 在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成
   的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
2> 获取Class实例的方法有三种:
   <1>利用对象调用getClass()方法获得该对象的Class实例。
   <2>使用Class类的静态方法forName(),用类的名字获取一个Class的是实例。
   <3>运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以用.TYPE来获取相应的
      基本数据类型的Class实例。
   <4>在运行期间,如果我们要产生某个类的对象,JAVA虚拟机(JVM)会检查该类型的Class对象是否被
      加载,如果没有加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已
      经被加载到内存,就可以用它来产生该类型所有的对象。
   <5>newInstance()调用类中缺省的构造方法。(好处是我们在不知道类的名字的情况下去创造一个实例)
import java.lang.reflect.*;       //子包必须手动导入
class ClassTest
{
 public static void main(String[] args)//throws Exception
 {
  /*
  Point pt=new Point();             
  Class c1=pt.getClass();//利用对象调用getClass()方法获得该对象的Class实例
  System.out.println(c1.getName());
  
  Class c2=Class.forName("Point");//使用Class类的静态方法forName(),用类的名字获取一个Class的是实例
  System.out.println(c2.getName());
  
  Class c3=Point.class;//运用.class的方式来获取Class实例
  System.out.println(c3.getName());
  
  Class c4=Integer.TYPE;//封装类用.TYPE来获取相应的基本数据类型的Class实例。
  System.out.println(c4.getName());
  */
  /*
  System.out.println("before new Point()");
  new Point();
  System.out.println("after new Point()");
  Class.forName("Line");
  */
  /*
  if(args.length!=1)
  {
   return;
  }
  try
  {
   Class c=Class.forName(args[0]);
   Point pt=(Point)c.newInstance();
   pt.output();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  */
  if(args.length!=1)
  {
   return;
  }
  try
  {
   Class c=Class.forName(args[0]);
   Constructor[] cons=c.getDeclaredConstructors();
   /*
   for(int i=0;i<cons.length;i++)
   {
    System.out.println(cons[i]);
   }
   Method[] ms=c.getDeclaredMethods();
   for(int i=0;i<ms.length;i++)
   {
    System.out.println(ms[i]);
   }*/
   Class[] params=cons[0].getParameterTypes();
   Object[] paramValues=new Object[params.length];
   for(int i=0;i<params.length;i++)
   {
    if(params[i].isPrimitive())
    {
     paramValues[i]=new Integer(i+3);
    }
   }
   Object o=cons[0].newInstance(paramValues);
   Method[] ms=c.getDeclaredMethods();
   ms[0].invoke(o,null);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  
 }
}

class Point
{
 static
 {
  System.out.println("Loading Point");
 }
 int x,y;
 void output()
 {
  System.out.println("x="+x+","+"y="+y);
 }
 Point(int x,int y)
 {
  this.x=x;
  this.y=y;
 }
}

class Line
{
 static
 {
  System.out.println("Loading Line");
 }
}

posted @ 2006-06-05 05:59 蓝色Saga 阅读(123) | 评论 (0)编辑 收藏

~~~~~~~~~~~~~~~~~~~~~~~~~~函数的调用~~~~~~~~~~~~~~~~~~~~
1> 在java中,传参时,都是以传值的形式惊行。
2> 对于基本数据类型,传递的是数据的拷贝,对于引用类型,传递的引用的拷贝。
3> 当我们在打印一个对象的时候,比如System.out.println(pt);,它会自动调用类的toString()方法
   ,所以建议在所有的子类中重写toString()方法。
我们写一个函数用来交换两个变量(x,y)的值.
 code:
class StringTest
{
 public static void change(int x, int y)
 {
  x=x+y;
  y=x-y;
  x=x-y;
 }
 /*
 public static void change(int[] num)
 {
  num[0]=num[0]+num[1];
  num[1]=num[0]-num[1];
  num[0]=num[0]-num[1];
 }
 public static void change(Point pt)
 {
  pt.x=pt.x+pt.y;
  pt.y=pt.x-pt.y;
  pt.x=pt.x-pt.y;
 }
 */
 public static void main(String[] args)
 {
 int x=3;
 int y=4;
 change(3,4);
 System.out.println("x="+x+","+"y="+y);
 }
我们期望的输出结果是 x=4,y=3 然后你运行后发现结果为x=3,y=4,并没有达到我们的要求,为什么呢?那是因为对于基本数据类型,传递的是数据的拷贝,对于引用类型,传递的是引用(首地址)的拷贝。看看下面的内存图解应该你就能看出来了.看看引用类型怎么来实现:


code:
class StringTest
{
 /*
 public static void change(int x, int y)
 {
  x=x+y;
  y=x-y;
  x=x-y;
 }
 */
 public static void change(int[] num)
 {
  num[0]=num[0]+num[1];
  num[1]=num[0]-num[1];
  num[0]=num[0]-num[1];
 }
 public static void change(Point pt)
 {
  pt.x=pt.x+pt.y;
  pt.y=pt.x-pt.y;
  pt.x=pt.x-pt.y;
 }
 public static void main(String[] args)
 {
  /*
   int x=3;
   int y=4;
   change(3,4);
   System.out.println("x="+x+","+"y="+y);
   */
   int[] num=new int[]{3,4};
   change(num);
   System.out.println("x="+num[0]+","+"y="+num[1]);
  
   Point pt=new Point();
   pt.x=3;
   pt.y=4;
   change(pt);
   System.out.println("x="+pt.x+","+"y="+pt.y); 
 }
class Point
{
 int x,y; 
}
再看看引用类型的内存变化图:
以上说明了在Java中函数的调用:
a> 在Java中,传参时,都是以传值的方式进行。
b> 对于基本数据类型,传递的是数据的拷贝,对于引用类型,传递的是引用(首地址)的拷贝。
posted @ 2006-06-05 04:19 蓝色Saga 阅读(122) | 评论 (0)编辑 收藏

^^^^^^^^^^^^^^^对象的克隆^^^^^^^^^^^^^
1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
2> 在派生类中覆盖基类的clone(),并声明为public。
3> 在派生类的clone()方法中,调用super.clone()。
4> 在派生类中实现Cloneable接口。
4> 没有抽象方法的接口叫标识接口。
5> 为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object
   的clone()方法能识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原
   始对象的内容一一复制到新的对象空间去。

* 浅克隆是针对没有引用类型的变量来克隆。针对引用类型的克隆应该用Deeply Clone。
浅克隆:
Code:
class FleetClone
{
 public static void main(String[] args)
 {
   Professor p=new Professor("feiyang",23);
   Student s1=new Student("zhangshan",18,p);
   Student s2=(Student)s1.clone();
   s2.p.name="feifei";
   s2.p.age=30;

   System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
 }
}
class Professor
{
 String name;
 int age;
 Professor(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
}

class Student implements Cloneable
{
 Professor p;
 String name;
 int age;
 Student(String name, int age,Professor p)
 {
  this.name=name;
  this.age=age;
  this.p=p;
 }
 public Object clone()
 {
  Object o=null;
  try
  {
   o=super.clone();
  }
  catch(CloneNotSupportedException e)
  {
   e.printStackTrace();
  }
  return o;
 }
}
改变学生s2的教授信息,打印s1教授信息,结果为:name=feifei,age=30.产生这个结果是因为String是一个常量类型.
 
深克隆
code:
class DeeplyClone
{
 public static void main(String[] args)
 {
   Professor p=new Professor("feiyang",23);
   Student s1=new Student("zhangshan",18,p);
   Student s2=(Student)s1.clone();
   s2.p.name="Bill.Gates";
   s2.p.age=30;
   System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
 }
}
class Professor implements Cloneable
{
 String name;
 int age;
 Professor(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
 public Object clone()
 {
  Object o=null;
  try
  {
   o=super.clone();
  }
  catch(CloneNotSupportedException e)
  {
   e.printStackTrace();
  }
  return o;
 }
}

class Student implements Cloneable
{
 Professor p;
 String name;
 int age;
 Student(String name, int age,Professor p)
 {
  this.name=name;
  this.age=age;
  this.p=p;
 }
 public Object clone()
 {
  //Object o=null;
  Student o=null;
  try
  {
   o=(Student)super.clone();
  }
  catch(CloneNotSupportedException e)
  {
   e.printStackTrace();
  }
  o.p=(Professor)p.clone();
  return o;
 }
}
打印结果为:name=Bill.Gates,age=30,这就是深克隆.
posted @ 2006-06-05 04:15 蓝色Saga 阅读(143) | 评论 (0)编辑 收藏

仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页