java6
2011年05月13日
四.(下)数组Runtime类与Process类
1. 数组的相关操作
在Java中,所有的数组都有一个缺省的属性length,用于获取数组中元素的个数。
数组的复制:System.arraycopy()。
数组的排序:Arrays.sort()。 --- java.util包之中!
在已排序的数组中查找某个元素:Arrays.binarySearch()。
import java.util.Arrays;
length是一个属性,不是方法;不要加()!!
arr1.length
对象数组的初始化方法:
Point[] pts1 = new Point[]{new Point(1,1),new Point(2,2), new Point (3,3)};
Point[] pts2 = new Point[3];
arraycopy对与对象数组的copy实际上是一个引用copy,数组里面存的是对象的地址,所以对第二个数组对象进行修改操作时还是会改变第一个数组的元素(操作的是同一组对象)!
b.排序
int num[] = new int[]{3,1,2};
Arrays.sort(num); //直接调用,直接传参数;无返回值
c.查找 (返回所查找元素的位置)
int index = Array.binarySearch(num,3);
d.对象的排序
return num>s.num ? 1 : (num==s.num ? 0 : -1); //问号表达式,大于返回1,=返0,s.num ? 1 : (num==s.num ? 0 : -1); //!!!
}
}
方法2: 当序号相同时再按名字排序:
public int compareTo(Object o)
{
Student s=(Student)o;
//return num>s.num ? 1 : (num==s.num ? 0 : -1);
int result=num>s.num ? 1 : (num==s.num ? 0 : -1);
if(0==result) //序号相同,则比较name;String类已经实现了compareTo
{
result=name.compareTo(s.name);
}
return result;
}
e.数组对象的搜索:
int index=Arrays.binarySearch(ss,new Student(2,"lisi"));
System.out.println("index="+index);
System.out.println(ss[index]);
2.封装类:
调用函数时,参数是引用类型,但我们要传递的又是基本类型;
java.lang中提供了八种基本类型的引用类型--封装类!
基本数据类型 封装类
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="+j);
String str=in.toString(); //Integer.toString()可以将Integer转换为String
System.out.println("str="+str);
String str2="134";
System.out.println(Integer.valueOf(str2)); //Integer.valusOf()将String转换成Integer
}
}
parseInt(String s) -- 转换为基本数据类型int
toString 也支持基本数据类型int!
其它基本类型也都有类似的;
所有的封装类都是只读类!
3.Class类 -- java.lang
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
获取Class实例的三种方式:
(1)利用对象调用getClass()方法获取该对象的Class实例; -- Object的方法!
Point pt=new Point();
Class c1=pt.getClass();
System.out.println(c1.getName()); //getName得到一个String
(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例;
Class c2=Class.forName("Point"); //会抛出异常
System.out.println(c2.getName());
(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例。
Class c3=Point.class;
System.out.println(c3.getName());
基本数据类型:
Class c4=int.class;
System.out.println(c4.getName());
封装类:
Class c5=Integer.TYPE;
System.out.println(c5.getName());
在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。
newInstance() 调用类中缺省的构造方法。 -- 可以用来在不知道一个类的名字的时候创建它的实例!
if(args.length!=1)
{
return;
}
try
{
Class c=Class.forName(args[0]);
Point pt=(Point)c.newInstance();
pt.output();
}
catch(Exception e)
{
e.printStackTrace();
}
4.反射API
用来表示或反射类、接口和对象在当前的JVM上;
import java.lang.*; //不能导入lang的子包,必须增加:
import java.lang.reflect.*;
java.lang.class.isPrimitive()用来判断是否是基本数据类型!
反射API 动态地创建了类的实例,动态地使用类的方法!
尽量不要用反射API当能够以别的工具实现时。
调试器,类的浏览器,图形界面的类的构建器的时候可能会用到反射API;
5.runtime类
每一个Java程序都有一个Runtime类的单一实例。
通过Runtime.getRuntime()获取Runtime类的实例。 //无构造方法!
Runtime类是使用单例模式的一个例子。
成为了一个程序和JVM的接口,提供了应用程序和环境之间的接口!
public static void main(String[] args)
{
Runtime rt=Runtime.getRuntime(); //得到一个runtime实例
System.out.println(rt.freeMemory()); //查看当前空闲内存和总内存!
System.out.println(rt.totalMemory());
}
exec()方法可以来执行外部程序;会throw exception
try
{
rt.exec("notepad"); //成为当前进程的子进程
}
catch(Exception e)
{
e.printStackTrace();
}
也可以用来编译源文件:
rt.exec("javac ArrayTest.java");
为了更好看到执行过程: 定义一个Process类:
Process类: 抽象类
Process p=rt.exec("javac ArrayTest.java"); //获取了这个子进程;
InputStream is=p.getInputStream();
int data;
while((data=is.read())!=-1)
{
System.out.print((char)data);
}
Runtime类是使用单例模式的一个例子。
6.设计模式
在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式。
每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案。
当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。
对于JAVA语言的学习:
1.语法规则和它本身的优越性(相对于其它语言)
2.解决方法时的一些前人的解法的经验
a.单例模式
(1)一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。
(2)单例类的一个最重要的特点是类的构造方法是私有的,从而避免了外部利用构造方法直接创建多个实例。
实现:
class Singleton
{
private static final Singleton st=new Singleton();
private Singleton(){} //必须自己写了私有构造,才是单例模式
public static Singleton getInstance()
{
return st;
}
}
主要用于解决什么问题呢?
只需要一个实例时...
设计模式推荐书:《java与模式》阎宏 电子工业
2011年05月13日
四.(下)数组Runtime类与Process类
1. 数组的相关操作
在Java中,所有的数组都有一个缺省的属性length,用于获取数组中元素的个数。
数组的复制:System.arraycopy()。
数组的排序:Arrays.sort()。 --- java.util包之中!
在已排序的数组中查找某个元素:Arrays.binarySearch()。
import java.util.Arrays;
length是一个属性,不是方法;不要加()!!
arr1.length
对象数组的初始化方法:
Point[] pts1 = new Point[]{new Point(1,1),new Point(2,2), new Point (3,3)};
Point[] pts2 = new Point[3];
arraycopy对与对象数组的copy实际上是一个引用copy,数组里面存的是对象的地址,所以对第二个数组对象进行修改操作时还是会改变第一个数组的元素(操作的是同一组对象)!
b.排序
int num[] = new int[]{3,1,2};
Arrays.sort(num); //直接调用,直接传参数;无返回值
c.查找 (返回所查找元素的位置)
int index = Array.binarySearch(num,3);
d.对象的排序
return num>s.num ? 1 : (num==s.num ? 0 : -1); //问号表达式,大于返回1,=返0,s.num ? 1 : (num==s.num ? 0 : -1); //!!!
}
}
方法2: 当序号相同时再按名字排序:
public int compareTo(Object o)
{
Student s=(Student)o;
//return num>s.num ? 1 : (num==s.num ? 0 : -1);
int result=num>s.num ? 1 : (num==s.num ? 0 : -1);
if(0==result) //序号相同,则比较name;String类已经实现了compareTo
{
result=name.compareTo(s.name);
}
return result;
}
e.数组对象的搜索:
int index=Arrays.binarySearch(ss,new Student(2,"lisi"));
System.out.println("index="+index);
System.out.println(ss[index]);
2.封装类:
调用函数时,参数是引用类型,但我们要传递的又是基本类型;
java.lang中提供了八种基本类型的引用类型--封装类!
基本数据类型 封装类
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="+j);
String str=in.toString(); //Integer.toString()可以将Integer转换为String
System.out.println("str="+str);
String str2="134";
System.out.println(Integer.valueOf(str2)); //Integer.valusOf()将String转换成Integer
}
}
parseInt(String s) -- 转换为基本数据类型int
toString 也支持基本数据类型int!
其它基本类型也都有类似的;
所有的封装类都是只读类!
3.Class类 -- java.lang
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
获取Class实例的三种方式:
(1)利用对象调用getClass()方法获取该对象的Class实例; -- Object的方法!
Point pt=new Point();
Class c1=pt.getClass();
System.out.println(c1.getName()); //getName得到一个String
(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例;
Class c2=Class.forName("Point"); //会抛出异常
System.out.println(c2.getName());
(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例。
Class c3=Point.class;
System.out.println(c3.getName());
基本数据类型:
Class c4=int.class;
System.out.println(c4.getName());
封装类:
Class c5=Integer.TYPE;
System.out.println(c5.getName());
在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。
newInstance() 调用类中缺省的构造方法。 -- 可以用来在不知道一个类的名字的时候创建它的实例!
if(args.length!=1)
{
return;
}
try
{
Class c=Class.forName(args[0]);
Point pt=(Point)c.newInstance();
pt.output();
}
catch(Exception e)
{
e.printStackTrace();
}
4.反射API
用来表示或反射类、接口和对象在当前的JVM上;
import java.lang.*; //不能导入lang的子包,必须增加:
import java.lang.reflect.*;
java.lang.class.isPrimitive()用来判断是否是基本数据类型!
反射API 动态地创建了类的实例,动态地使用类的方法!
尽量不要用反射API当能够以别的工具实现时。
调试器,类的浏览器,图形界面的类的构建器的时候可能会用到反射API;
5.runtime类
每一个Java程序都有一个Runtime类的单一实例。
通过Runtime.getRuntime()获取Runtime类的实例。 //无构造方法!
Runtime类是使用单例模式的一个例子。
成为了一个程序和JVM的接口,提供了应用程序和环境之间的接口!
public static void main(String[] args)
{
Runtime rt=Runtime.getRuntime(); //得到一个runtime实例
System.out.println(rt.freeMemory()); //查看当前空闲内存和总内存!
System.out.println(rt.totalMemory());
}
exec()方法可以来执行外部程序;会throw exception
try
{
rt.exec("notepad"); //成为当前进程的子进程
}
catch(Exception e)
{
e.printStackTrace();
}
也可以用来编译源文件:
rt.exec("javac ArrayTest.java");
为了更好看到执行过程: 定义一个Process类:
Process类: 抽象类
Process p=rt.exec("javac ArrayTest.java"); //获取了这个子进程;
InputStream is=p.getInputStream();
int data;
while((data=is.read())!=-1)
{
System.out.print((char)data);
}
Runtime类是使用单例模式的一个例子。
6.设计模式
在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式。
每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案。
当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。
对于JAVA语言的学习:
1.语法规则和它本身的优越性(相对于其它语言)
2.解决方法时的一些前人的解法的经验
a.单例模式
(1)一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。
(2)单例类的一个最重要的特点是类的构造方法是私有的,从而避免了外部利用构造方法直接创建多个实例。
实现:
class Singleton
{
private static final Singleton st=new Singleton();
private Singleton(){} //必须自己写了私有构造,才是单例模式
public static Singleton getInstance()
{
return st;
}
}
主要用于解决什么问题呢?
只需要一个实例时...
设计模式推荐书:《java与模式》阎宏 电子工业