eclipse及IDE开发工具介绍:
IDE开发工具都支持使用工程化方式 管理一个项目的程序开发过程。一般来说一个相对独立的项目就是一个工程。一个项目中涉及多个Java文件,资源文件等用一个工程进行管理。 一个workspace 可以包含多个 project ,一个workspace 保留了 Eclipse 的一套环境选项的配置。如果要为Eclipse再配置一套环境选项,可以再创建一个workspace。
所以:eclipse 工作台中的所有工程继承工作台的配置,其中某个工程也可以覆盖工作台的配置,Java面向对象的思想。
1、在Eclipse 中如何设置快捷键:
Windows->Preferences->General -> Editors ->Key (Content Assist:内容助理) 这样的设置对一个工作台中的所有项目应用。
注意:设置快捷键时,要解除原来的绑定关系。
2、设置代码模版:如输入syso,则可以自动补全System.out.println();
Windows->Preferences->General -> Editors ->Templates
3、在MyEclipse如何调试:
右键->Debug as 便会跳到调试透视图。观看一个变量的值:右键->watch
关于透视图:很多小窗口的集合。Eclipse 将很多功能小窗口集合成一个透视图,作用于相应的功能。
4、配置Eclipse 中的编译和运行环境:
Windows->Preferences->java ->Complier 配置Java程序编译版本
静态导入与编译器语法设置
package com.itcast.day1;
import static java.lang.Math.*;//导入全部
import static java.lang.Math.max;//导入一个
public class StaticImport {
public static void main(String[] args) {
//sop(random());
}
public static void sop(Object obj){
System.out.println(obj);
}
}
实现带有构造方法的枚举,当枚举只有一个成员时,就可以作为一种单例的实现模式
public class EnumTest {
public static void main(String[] args) {
WeekDay mon = WeekDay.MON;
System.out.println(mon);//名称为MON
System.out.println(mon.name());//名称为MON
System.out.println(WeekDay.valueOf("YYY"));//增加枚举,将"YYY"变为枚举类型
System.out.println(WeekDay.values().length);//返回枚举值
}
public enum WeekDay{
//成员列表必须写在所有成员之前
SUN,MON,TUE,WED,THI,FRI,SAT;//MON和MON(1)就是表示在构造
private WeekDay(){}
private WeekDay(int day){}
}
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp() {
return GREEN;
}
},GREEN(45){
public TrafficLamp nextLamp() {
return YELLOW;
}
},YELLOW(5){
public TrafficLamp nextLamp() {
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){
this.time = time;
}
}
}
基本数据类型的自动拆箱和装箱以及FlyWeight设计模式
public class AutoBox {
public static void main(String[] args) {
// 在1.5以前:一下操作是不行的。
Integer iObj = 3 ;
// 在1.5以后,自动装箱:将基本数据类型int,自动封装给一个Integer对象
// 类似于:Integer iObj = new Integer(3) ;
System.out.println(iObj + 10);
/*
自动拆箱:如上操作相当于:
iObj = new Integer(iObj.intValue() + 10)
*/
Integer i1 = 13 ;
Integer i2 = 13 ;
System.out.println(i1==12);
/*
享元设计模式:flyweight
有很多个小对象,他们有很多相同的属性,那么将它们封装成一对象,相同的属性称为
内部属性;不同的属性作为方法的参数。
*/
}
}
泛型
public class GenericTest {
public static void main(String[] args) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
List<Integer> arr = new ArrayList<Integer>() ;
//通过反射来验证:泛型只是在编译阶段帮助编写程序时避免存储集合时类型出错。
arr.getClass().getMethod("add", Object.class).invoke(arr, "abc") ;
System.out.println(arr.get(0));
}
}
反射
反射不是jdk1.5的新特性。反射就是把Java 类中的各种成分映射成相应的Java类。例如。一个Java类中用一个Class类的对象来表示一个类中的组成部分:成员变量,方法,构造方法,包等信息也
用一个个Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息。
这写信息就是用相应的实例对象来表示,它们是Field、Method、Contructor、Package等。
1、反射的基石->Class 类。
注意:class 表示类,而Class则是一个类名。Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属于的包名,字段名称的列表,方法名称的列表,等等。
问:如Person 类代表人,那么它的实例对象就是张三,李四这样一个个具体的人,Class类代表Java类,他的各个实例对象又分别对应什么呢?
Class的各个实例对应在内存中的字节码,例如Person 类的字节码,ArrayList 类的字节码等等。一个类被加载器加载到内存中,占用一片存储弓箭,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型
问:如果得到各个字节码对应的实例对象:
类名.class , 例如System.class
对象.getClass() , 例如 new Data().getClass() ;
Class.forName("类名")
九个预定义Class对象:boolean
、byte
、char
、short
、int
、long
、float
和 double
和关键字 void
也表示为 Class
对象。
> public boolean isPrimitive()
:判定指定的 Class
对象是否表示一个基本类型。有九种预定义的 Class
对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即 boolean
、byte
、char
、short
、int
、long
、float
和 double
。
> Int.Class == Integer.TYPE
数组与Object的关系及其反射类型
import java.lang.reflect.*;
public class ReflectTest {
public static void main(String[] args) throws Exception{
int[] a1 = new int[3];
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
String[] a4 = new String[3];
System.out.println(a1.getClass()==a2.getClass());
System.out.println(a1.getClass().getName());
System.out.println(a1.getClass().getSuperclass().getName());
System.out.println(a2.getClass().getSuperclass().getName());
System.out.println(a3.getClass().getSuperclass().getName());
System.out.println(a4.getClass().getSuperclass().getName());
System.out.println(String.class.getSuperclass().getName());
System.out.println(StringBuffer.class.getSuperclass().getName());
//发现a1,a2,a3,a4的super都是objcet所以可以
Object aObj1 = a1;
Object aObj2 = a4;
//Object[] aObj3 = a1;不对 int 不可以直接转为object
Object[] aObj4 = a3;
Object[] aObj5 = a4;
}
}
成员方法的反射
public class ReflectMethod {
public static void main(String[] args) throws Exception {
Method charAt = String.class.getMethod("charAt", int.class) ;
// 反射方法:方法对象调用对象的方法。
System.out.println(charAt.invoke("abcd", 1)) ;
}
}