黑马程序员_基础加强_1

来源:互联网 发布:js中= 和==和===的区别 编辑:程序博客网 时间:2024/06/04 19:51

 

----------- android培训java培训java学习型技术博客、期待与您交流! ------------ 

 

MyEclipse 是Eclipse的插件  拓展了功能,使其可以用JavaEE的功能


Eclipse关不掉怎么办?
进程javaw  杀掉

 

JavaEE
ide     集成开发环境
jms
jmx
jndi
缩写。。


IDE开发工具都支持使用工程化方式管理一个项目的程序开发过程,一般来说一个相对独立的项目就是一个工程,一个项目中涉及的多个java文件,资源文件等用一个工程进行管理。

 

eclipse的使用技巧

Workspace与project
 必须会切换工作间与导入项目

Perspective与view
透视图与视图,每一个小窗口叫视图,特定几个窗口的已有布局,叫做透视图
关掉视图后,点击Window-Show View


设置整个workspace的javac与java


设置单个工程的javac与java
(高版本的java可以运行低版本的javac,
但低版本的java不能运行高版本的javac。)


Eclipse中  Window-Preferences-java-Compiler
可以选择用哪个版本编译


Java-Installed JREs 运行时用的哪个版本


各自的工程可以设置不同的快捷键
Window-Preferences
因为快捷键是针对所有开发项目的,所以选通用
General-Keys
Content Assist(补全)
解除快捷键,选中-Remove Binding
在下面的Binding框中,按下自己设定的快捷键
Apply(应用)-OK
搜索下,是否有重复,将其余的解除掉

 


一个工作间包含多个工程,工作间的设置可以适用于多个工程


Eclipse界面中,右上角有Java和MyEclipse  就是透视图,可切换


Package
报名一般都是公司名:
(去哪儿面试写哪儿的网址 - -)
    cn.itcast.interview

类名
StaticImport

若不想叫这个名字了,可以重构
右键,Refactor-Rename

 

在Eclipse下怎么调试?
双击左侧的标记
右键Watch
(切换到了Debug透视图,右上角)

 


在eclipse中配置java模板代码
右键 Surround With-Try/catch Block


希望有try  finally

Windows-Preferences-Java-Editor(编辑)
Templates(模板)

New 创建新模板
tryf
内容写代码
$(line_selection) 原来的那行写在这里
$(cursor)是光标,函数中内容可以预先设置

 

 


导入已有工程
File-Switch Workspace 是切换工作间

 

方法之一:
工程拷贝到工作间

File-Import-Existiong Projects into Workspace
选择目录,确定


若jdk安装路径不同,需要重新设置
右键-Build Path-Configure Build Path-Libraries
Remove 

增加自己的JDR库(等于增加了很多JAR包)
Add JARs

Add External JARs  导入单独的jar包

 

 

 


静态导入与编译器语法设置

使用求两个数的最大值和相减结果的绝对值进行举例,这个例子本身也有学习价值:
Systme.out.println(min(3,9));
System.out.println(abs(3,9));

javac 无意中改成1.4  则静态导入到jdk1.5报错


//import static java.lang.Math.max;
import static java.lang.Math.*;
Math.max(3,6); 选中,按下补全按钮,会有输出语句的选项

 

 

 

可变参数
问题:若一个方法接受的参数个数不固定,例如
add(2,3,5);
add(1,2,3,4);

overload vs override

 

public static int add(int x,int ...args)
{
 ...
}

 

 

增强for循环
for(type 变量名: 集合变量名)
{。。。}

 

自动拆箱及享元设计模式(flyweight)
什么是享元模式?
    很多个小的对象,他们有很多属性相同,把他们变成一个对象,那些不同的属性,将他们变成方法的参数,称之为外部状态。相同的则为内部状态。

 

Integer  i1=14;
Integer  i2=14;
i1==i2?  true

Integer  i1=137;
Integer  i2=137;
i1==i2?  false

Integer i3 = Integer.valueOf(3);
Integer i4 = Integer.valueOf(3);
i3==i4? true

 

 

 


枚举
为什么要有枚举

问:要定义星期几或性别的变量,该如何定义?
假设用1-7分别表示星期一到星期日,但有人可能会写成int  weekday=0;

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。


用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的

 


枚举的基本应用
举例:定义一个Weekday的枚举
扩展:枚举类的Values,ValueOf,name,toString,ordinal等方法
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,假如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName().

 

 


Weekday weekday = "Sunday";
选中Weekday,右键,产生Weekday类

public abstract class WeekDay
{
 private WeekDay(){}

 public static final WeekDay SUN=new WeekDay(){
 public WeekDay nextDay()
 {
  return MON;
 }
};
//WeekDay子类  覆盖父类nextDay方法,直接给返回值

 

/**

 public static final WeekDay MON=new WeekDay(){};
 ...


 public abstract WeekDay nextDay()
 {
  if(this==SUN)
   return MON;
  else
  if(this==MON)
   ...
 }


**/


 public String toString()
 {
  return this==SUN?"SUN":"MON";
 }
 }

 

 

 

14 枚举的基本应用

public enum WeekDay
{
 SUN,MON,TUE,WED,THI,FFRI,SAT;
}

 


带有构造方法的枚举

交通灯
public enum WeekDay
{
 SUN(1),MON,TUE,WED,THI,FFRI,SAT;
 //若要调用第二个,括号中加数字即可。
 
 private WeekdDay(){}
 //定义的所有方法,都需放在元素列表之后

 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;});
 
         abstract TrafficLamp nextLamp();
  private int time;

  private TrafficLamp(int time)(this.time = time;)
  
 }
}

 


枚举只有一个成员时,可以作为一个单例的实现方式

 

 

 

 

反射

反射的基石- Class类

Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class
对此提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?
人:Person
java类:Class

 

对此提问:Person类代表人,他的实例对象就是张三,李四这样一个个具体的人;Class类代表Java类,他的各个实例对象又分别对应什么呢

 

对应各个类在内存中的字节码,例如:Person类的字节码,ArrayList类的字节码,等等。
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?

 

如何得到各个字节码对应的实例对象(Class类型)
1、类名.Class    eg:System.Class
2、getClass()    eg:new Date().getClass()
3、Class.forName("类名") 
   eg:Class.forName("java.util.Date");
//反射时常用的,因为可能不知道类名,是传递过来的。

 

九个预定义Class实例对象:

八个基本类型:(也对应着Class对象)
boolean
byte
char
short
int
long
float
double
+
void

 


Class cls1=Date.class;    //Date对象的字节码;
Class cls2=Person.class;  //Person对象的字节码;

p1.getClass();   
//得到对象,也可以得到字节码;


Class.forName("java.lang.String");
//也可以得到字节码
//forName的作用是返回字节码

返回字节码的方法有两种:
1、已经被加载过,在JVM中
2、JVM中没有,用类加载器加载进JVM,以后不用再加载了。

 

System.out.println(cls1.isPrimitive());
//判断是不是基本类型
//String是一个类,不是基本类型


//Int和Integer各有各的字节码


int.class==Integer.TYPE?    true

 

9基本类型:
Boolean.TYPE
Character.TYPE
Byte.TYPE
Short.TYPE
Integer.TYPE
Long.TYPE
Float.TYPE
Double.TYPE
Void.TYPE

 


数组也是一种类型,但不是基本类型
判断Class是不是数组
int[].class.isArray();

 

 

反射的概念

反射就是把Java类中的各种成分映射成相应的java类
例如:一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量、方法、构造方法、修饰符、包等信息,这些信息就是用相应类的实例对象来表示,他们是Field、Method、Contructor、Package等等

一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,很

 

 

Constructor 类

Constructor类代表某个类中的一个构造方法

得到某个类所有的构造方法:
例子:Constructor constructors[]=
Class.forName("java.lang.String").getConstructors();

得到某一个构造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);

创建实例对象
通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str = (String)constructor.newinstance(new StringBuffer("abc"));

 

 


eg:
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);

String str2 =(String)constructor1.newInstance(new StringBuffer("abc"));
//运行时,才知道constructor1返回的是String类型,所以要加强转(String)才会编译通过。

 

 


public class ReflectPoint
{
 private int x;
 public int y;
 
 右键 Source- Generate Constructor using Fields。。。  选择构造方法源代码
 public ReflectPoint(int x,int y)
 {
  super();
  this.x=x;
  this.y=y;
 }

 

}

 


//对其进行反射
ReflectPoint pt1=new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
//fieldY不代表具体值

System.out.println(fieldY.get(pt1));
//用fieldY取出pt1对应的值

 


访问私有化的x
Field dieldX = pt1.getClass().getDeclearedField("x");
fieldX.setAccessible(true);
//将其设置为可以访问(暴力反射)

 


Field类代表某个类中的一个成员变量
演示用eclipse自动生成Java类的构造方法
问:得到的Field对象时对应到类上的成员变量,还是对应到对象上的? 类只有一个,而该类的实例对象有多个,若是与对相关联,那关联的是哪一个对象呢?所以字段fieldX代表的是x的定义,而不是具体的x变量。


示例代码:
ReflectPoint point = new ReflectPoint(1,7);
Field y = Class.forName("cn.itcast.corejava.ReflectPoint").getField("y");
System.out.println(y.get(point));
//Field x =Class.forName("cn.itcast.corejava.ReflectPoint").getDeclareField("x");
x.setAccesible(true);
System.out.println(x.get(point));

 

 

 

----------- android培训java培训java学习型技术博客、期待与您交流! ------------ 

 

原创粉丝点击