黑马程序员-高新技术 1

来源:互联网 发布:淘宝购物最便宜的软件 编辑:程序博客网 时间:2024/05/16 18:43

------- android培训、java培训、期待与您交流! ----------   

 




 

思想: java基础的重要性!

1


 基础知识的深入程度
 学习新知识的能力


2

  eclipse工具的使用

常见单词缩写:

java ee  Java Platform  Enterprise Edition   Java企业级应用程序版本

ide   integrated development environment     集成开发环境

jms   Java Messaging Service              Java消息服务

jmx   Java Management Extensions         Java管理扩展

jndi   Java Naming and Directory Interface  Java命名和目录接口

 
3.开发工具 Eclipse和myEclipse 是主流
    SUN公司的一款集成开发工具,由于用户的习惯已经固定推广很难;
    而JBuilder,由于收费而已逐渐没落;
 
 4.   用哪个工具无所谓,开发工具的使用只是节省你的时间,提高你的工作效率。4.
.IDE中的工程化管理方式:开发工具能对所有源文件进行集中管理,记住每个源文件的位置和相互关系。

 一个workspace 可以包含多个project,一个workspace保留了eclipse的一套环境选项的配置。

 Complier—>开发人员用的编译器是什么版本。
 Installed JREs 运行时的java版本

5.良好的工作习惯是:每个类都要有包名,包名的习惯前面是公司的域名倒过来写。
    生活感悟:要尽量取悦别人,做人随和一点,这样生活中才有机会。


6.快捷键配置:  Window——>Preferences——>General——>Keys

..
7.perspective 透视图与 view 视图
   视图是每个小窗口.透视图是若干小窗口的集合。
 显示某个视图:可以右键 show view 调出视图


8.eclipse中如何调试:
 设置断点
 右键——>debug
 在透视图中选中变量——右键—>Watch-->可以看变量的值

9.如何设置单个工程的javac 及java
 javac:Window——>Preferences——>Java——>Complier
 java: Window——>Preferences——>Java——>Installed JREs 
 
 高版本的java 能够运行低版本的javac。
 运行版本必须高于等于编译版本。
 编译版本升级了.class文件中有可能存在新版本的特有功能.而老的运行版本会无法识别.会出现异常


10.自定义模板代码tryf:Window—>Preferences—>Java—>Editor—>Templates


11. 如何导入工程?需要配置运行环境.在项目上点击右键—>Build Path—>Configure Build Path—Libraries.删除已有库增加自己的jdk库。

12.JDK1.5新特性1:静态导入(导入某个静态方法或所有静态方法)
 import static java.lang.Math.max;
 import static java.lang.Math.*;
 这样后面可以直接调用方法而不用写类名。


13.JDK1.5新特性2:可变参数(数据类型... 变量名)
 一个方法接受的参数个数不固定时.方法该如何定义呢?

 可变参数只能是参数列表的最后一个参数。
 ... 位于变量类型和变量名之间,前后有无空格都可
 调用可变参数方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。


 面试题:overload 和 override 的区别,要把这两种情况的各个方面都说清楚,要能写出别人写不出,要写出很深入的东西。


14.JDK1.5新特性3:增强for循环
    语法:for(type 变量名:集合/数组){...}

    增强for循环可以遍历数组和集合。
 

15.JDK1.5新特性4:基本数据类型的自动装箱与拆箱
 Integer x = 3;  // 自动装箱, 自动把一个基本数据类型装箱后赋给了引用变量x
 Integer y = x+12   // 隐含了自动拆箱与装箱

 Integer i1 = 13;
 Integer i2 = 13;
 System.out.println(i1==i2);   // true

 如果一个数组在一个字节(-128~127)之间时,作为Integer对象时,在缓存区里只有一个对象。利用了享元设计模式。
 
 享元模式 flyweight
 当对象很小,使用频率较高,他们有很多相同的属性,与其创建多个对象,不如让多个引用指向一个对象,减少其对内存的消耗。

16.重量级新特性:enum 枚举。
 枚举就是一个类。 枚举的成员就是这个类的实例对象。
 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。
 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。
 在java中如何更好的使用这些“数据集”呢?因此枚举便派上了用场,
 
 枚举的好处:在编译时期就能发现填写的值合不合法。
 
 使用枚举,只能使用枚举里所规定的变量的值。

 面试题常考:内部类,匿名内部类。
 
17.枚举的基本应用:
 
举例:定义一个Weekday的枚举
扩展:枚举类的values()(此方法返回一个枚举元素的数组),valueOf(String)(把字符串变成一个枚举元素),name,toString,ordinal 等方法。
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。

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

18.实现带有构造方法的枚举。

public enum WeekDay{
 
 SUN,MON,TUE,WED,THI,FRI,SAT;  // 所有其他信息必须放在枚举元素之后
 private WeekDay(){}    // 对于枚举的构造方法必须是私有的
 private WeekDay(int day){}
}


19.实现带有抽象方法的枚举
 
外部类的访问修饰符只有两个:default   public
内部类的访问修饰符有四个:public   protected   default   private
内部类和成员变量和成员方法是平级关系。

public enum TrafficLamp{
 RED(30){ // new 子类的实例对象,并调用父类的有参构造方法
     public abstract TrafficLamp nextLamp(){
   return GREEN;
  }
 },
 GREEN(45){
  public abstract TrafficLamp nextLamp(){
   return YELLOW;
  }
 },
 YELLOW(5){
  public abstract TrafficLamp nextLamp(){
   return RED;
  }

 };
 public abstract TrafficLamp nextLamp();
 private int time;
 private TrafficLamp(int time){this.time=time;}
}

    

new Date(300){};  new Date 的子类对象,子类调用父类的有参的构造方法。
复习了内部类

如果枚举只有一个成员,就可以把枚举作为一种单例的实现方式。


20.反射的基石——>Class
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class

获取字节码的三种方式:
     (1,类名.class,           例如:System.class
      (2,对象.getClass()  例如:new Date().getClass()
      (3,Class.forName("类名")  例如:Class.forName("java.lang.String")  // 主要用于反射

21,八种基本数据类型:boolean,byte,char,short,int,long,float,double都有其对应的Class对象
 void 关键字也有其对应的Class对象 void.class

3,String str1 = "abc";
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");

System.out.println(cls1==cls2);  // true
System.out.println(cls1==cls3);  // true

System.out.println(int.class == Integer.TYPE);  // true

数组类型的Class实例对象:Class.inArray();

只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int[],void

22,反射
   反射就把Java类中的各种成分映射成相应的java类。
   Fileld类:描述成员变量的属性和方法
   Constructor类:描述构造方法的属性和方法
   Method类:描述方法的属性和方法

23,构造方法的反射应用
 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"));
 // 调用获得的方法时要用到上面相同类型的实例对象。

Class.newInstance() 用来创建实例对象。
反射的缺点是什么?对返回来的Constructor进行缓存,消耗内存,影响性能!

24,成员变量的反射
 
Filed类:代表类中的成员变量
如何获取某个对象的一个变量的值?
    建立对象,获取字节码,获取类字段,从某个对象里获取该字段的值
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
fieldY的值是多少?是5,错!fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值。
fieldY.get(pt1);  //5

当变量被私有化时,要想访问对象的该变量,要进行暴力反射:
fieldX.setAccessible(true);


25,成员变量反射的综合案例(重点)
修改变量值,如何把如何把String类型变量的值中的b字母,变成a字母
思路:要修改变量值,必须获取变量值,要获取变量的值,得先获取变量,要获取变量,得先获取字节码文件。


26,成员方法的反射
Method类代表某个类中的成员方法。
//str1.charAt(1);  // st1="abc";
Method methodCharAt = String.class.getMethod("charAt",int.class);
System.out.println(methodCharAt.invoke(str1,1));  // 1
   如果传递给Method兑现的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法。

JDk1.4和1.5的invoke方法的区别:
jdk1.5:public Object invoke(Object obj,Object... args)
jdk1.4: public Object invoke(Object obj,Object[] args)


27,对接收数组参数的成员方法进行反射。
需求:给出一个类名,写一个程序,去执行该类中的main方法。
主函数是以数组为参数的特殊函数 main(String[] args)

JDK1.4  没有可变参数,会把参数封装到Objec[]数组中进行传递,传递后会被“解包”成多个参数
          而主函数的参数是String[],如何避免被解包?
          1,强调,把数组转成Object类型,对象是不会被解包的;
          2,加包,给字符串在加一层字符串包装,拆了一层,还有一层;

mainMethod.invoke(null,new Object[]{new String[]{"xxx"}});
mainMethod.invokd(null,(Object)new String[]{"xxx"}); 编译器会特殊处理,编译时不把参数当做数组看待,也就不会把数组打散成若干个参数了。

28,数组与Object的关系及其反射的类型
数组的反射:具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。

基本数据类型数组   类型相同并且维数相同得到的是同一份字节码文件。

基本类型的一维数组可以被当做Object类型使用,不能当做Object[] 类型使用;
非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。

获取数组对象的字节码文件;Object[] a1 = {1,3,4}   a1.getClass()

29,数组的反射应用
Arrays.asList()方法处理int[] 和String[] 时的差异。
Array工具类用于完成对数组的反射操作。

Class类一个方法可以得到字节码文件的数组类型或类的名称:.getName()
而要得到字节码文件,需要Class对象.getClass()

通过Object设定数组: Object[] arr = new Object[]{"a",1}
    通过元素获取元素类型:arr[0].getClass().getName()

30,ArrayList 与 HashSet的比较及hashcode分析
hashCode()  哈希算法
自定义hashCode()  ,哈希值算法不同,存储区域,查找区域,定位搜索。


面试题:?hashCode()的作用?

   
              ?java中有内存泄露吗?  有!hashset 集合有可能发生内存泄露
原因:当参与哈希值计算的变量被修改后,对象会被存储到其他区域,导致找不到对象,无法删除,一直消耗内存,日积月累,就发生内存泄露。