老张Java加强

1.javaw是java的图形虚拟机,结束其便可结束Eclipse,不过我没在taskmgr发现有。
2.必须设置断点后才可以debug,否则debug后无法查看变量也无法下一步,此时选择变量才可以右键watch。
3.高版本的java可以运行低版本的javac,相反就不行了。
4.选择工程点右键preference下的javacompiler必须和window下的preference里的javaJDK一个版本。
5.也就是说具体某工程的配置和工作台的配置可以不一样,这就是继承与覆盖。
6.配置模板:window --perferences--java--editor--Template;通过右键surround with调用;也是要先选择代码,或者alt+shift+z。
比如定义了sysout代替System.out.println()且光标定位在括号里,那么输入sysout并按alt+?即可,不是在surround with里找。
7.jdk里可以静态导入(import static),导入一个类里的所有静态方法(import导入所有类),那么使用的时候便不必加上类名。
8.被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写;不能通过访问权限、返回类型、抛出的异常进行重载;对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
子类方法不能缩小父类方法的访问权限;子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
9.增强型for循环:for(type 变量名 : 集合变量名),迭代变量必须在for内定义,集合变量是数组或者实现了iterator接口的集合类。

10.享元模式

 1 public class Test {
 2     /*
 3      * 享元模式(flyweight):很多小的对象有许多相同的属性,
 4      * 则把他们看成一个对象,不同的属性通过不同的函数参数实现(26个字符)
 5      */
 6     public static void main(String[] args) {
 7         
 8         //s和d若是在-128到127那么打印true(用的频率高),否则false;同样适用于Integer.valueOf()
 9         Integer s = 134;//自动打包
10         Integer d = 134;
11         System.out.println(s==d);
12         
13     }
14 }

11.普通类实现枚举

  一定要是对象,枚举类型的每个对象都可以调用getClass和getName等。

 1 public class Week {
 2     private Week(){
 3         
 4     }
 5     /*
 6      * 为了节省时间只写了这两个
 7      */
 8     public static final Week sun = new Week();
 9     public static final Week mon = new Week();
10     
11     public Week nextDay() {
12         if(this==sun) {
13             return mon;
14         }else {
15             return sun;
16         }
17     }
18     
19     public String toString() {
20         return this==sun?"Sunday":"Monday";
21     }
22     
23 }
1 //调用的时候使用
2 Week w = Week.mon;

12.枚举类型也是后来才加入的,原来以为用不到;这就像我们的学习过程,不同的阶段对知识的需求不同。
13.抽象类中可以有非抽象方法,比如toString,子类实现该类的时候可以不重写该方法,看下面的例子。

  采用内部类把本来需要在nextDay写很多代码转移到了各个子类里。

 1 public abstract class Week {
 2     private Week(){
 3         
 4     }
 5     
 6     //由于是abstract不可以直接new对象,但是可以经由子类,此处采用内部类
 7     public static final Week sun = new Week() {
 8 
 9         @Override
10         public Week nextDay() {
11             // TODO Auto-generated method stub
12             return mon;
13         }
14         
15         
16     };//必须加分号
17     
18     public static final Week mon = new Week() {
19 
20         @Override
21         public Week nextDay() {
22             // TODO Auto-generated method stub
23             return sun;
24         }
25         
26     };
27     
28     public abstract Week nextDay();//必须加上abstract,否则总提示需要返回值
29     
30     //抽象类中可以有非抽象方法,子类实现该类的时候可以不重写该方法
31     public String toString() {
32         return this==sun?"Sunday":"Monday";
33     }
34     
35 }
 1 public class Test {
 2     public static void main(String[] args) {
 3         
 4         Week w = Week.mon;
 5         
 6         System.out.println(w);//Monday
 7         System.out.println(w.nextDay());//Sunday
 8         
 9         System.out.println("------ok--------");
10     }
11 }
12 /*下面的编译出错,因为Week的构造方法是private的,在类外不能new,这就是单例模式
13 class MyWeek extends Week {
14 
15     @Override
16     public Week nextDay() {
17         // TODO Auto-generated method stub
18         return Week.mon;
19     }
20     
21 }
22 */

14.enum

 1 /*
 2  * 枚举类型(java1.5才有):Java.lang.Enum,
 3  * 例子:假设一个宝箱只能由两个人开启;
 4  * 只能取特定值中的一个,也就是只可以取特定值之一。
 5  * 和C/.C++的枚举类型不同的是必须使用枚举类型名点访问某一值,
 6  * 类似静态变量,C/.C++中是下标从0开始可以分别指定表示什么。
 7  * 写游戏时物体只可以朝四个方向运动当然可以使用int类型1、2、3、4,
 8  * 但是下面写时谁知道会不会写成5,编译时难以发现错误,
 9  * 但是使用枚举类型就可以发现错误。
10  */
11 public class TestEnum {
12     //MyColor是一种类型,所以首字母大写,定义的颜色很像静态变量,因为可以用类型名点访问
13     public enum MyColor {
14         red, green, blue
15     };
16     
17     public static void main(String[] args) {
18         MyColor m = MyColor.red;//定义的颜色很像静态变量
19         switch(m) {
20             case red:
21                 System.out.println("red");
22                 break;
23             case green:
24                 System.out.println("green");
25                 break;
26             case blue:
27                 System.out.println("blue");
28                 break;
29             default:
30                 System.out.println("没有该颜色!");
31         }
32         System.out.println(m);//打印red,说明已经重写了toString()方法
33         System.out.println(m.name());
34         System.out.println(m.ordinal());//返回编号
35         System.out.println(MyColor.valueOf("red").toString());//从浏览器得到的是字符串,一定会用到该方法
36         System.out.println(MyColor.values().length);//先转为数组
37     }
38 
39 }

15.枚举类型使用构造方法

 1 public class TestEnum {////枚举类型的构造方法必须写在元素下,且必须是private
 2     //MyColor是一种类型,所以首字母大写,定义的颜色很像静态变量,因为可以用类型名点访问
 3     public enum MyColor {
 4         red(1), green(), blue;
 5         
 6         private MyColor() {
 7             System.out.println("first");
 8         }
 9         
10         private MyColor(int day) {
11             System.out.println("second");
12             
13         }
14             
15     };
16     
17     public static void main(String[] args) {
18         MyColor m = MyColor.red;//定义的颜色很像静态变量
19         System.out.println(m);//打印red,说明已经重写了toString()方法
20         System.out.println(m.name());
21         System.out.println(m.ordinal());//返回编号
22         System.out.println(MyColor.valueOf("red").toString());//从浏览器得到的是字符串,一定会用到该方法
23         System.out.println(MyColor.values().length);//先转为数组
24     }
25 
26 }
27 //由结果看出,元素生成的时候自动调用的是无参数的构造方法,在元素后加上参数就调用有参的,只加一对括号还是无参
28 /*
29  * second
30 first
31 first
32 red
33 red
34 0
35 red
36 3
37 */

16.外部类的修饰符为public或者默认;内部类和方法是平级的,可以有四个访问控制符;声明数组要int[] array不要int array[],前一种一看就知道是一种类型。

17.在java中main方法也可以重载,也就是说在一个源程序里只有一个main是错误的;在不同的类里可以有相同的public static void main(String args),主类是public类。  

 1 public class TestMain{    
 2     public static void main(String args[]){        
 3         
 4         System.out.println("这是真正的主方法");        
 5         main("Hello World!");    
 6     }    
 7     public static void main(String str){        
 8         
 9         System.out.println(str);    
10     }
11 }
12 //源文件的名字:TestMain.java编译通过,执行结果:D:\MyPro>javac TestMain.javaD:\MyPro>java TestMain这是真正的主方法Hello World!

18.反射的作用:实现框架功能。

19.hashCode

View Code
 1 package b;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Collection;
 5 import java.util.HashSet;
 6 
 7 public class Reflect {
 8 
 9     public static void main(String[] args) {
10         // TODO Auto-generated method stub
11         /*
12          * new ArrayList()的话不论是否重写hashCode和equals都输出5;
13          * new HashSet()重写前是4,后是3
14          */
15         //Collection coll = new ArrayList();
16         Collection coll = new HashSet();
17         Pointer p1 = new Pointer(1, 1);
18         Pointer p2 = new Pointer(1, 1);
19         Pointer p3 = new Pointer(3, 3);
20         Pointer p4 = new Pointer(4, 4);
21         
22         coll.add(p1);
23         coll.add(p2);
24         coll.add(p3);
25         coll.add(p4);
26         coll.add(p4);
27         
28         /*
29          * 参与hashCode运算的值,在加载后就不应该再改动,否则删除的话是删不掉的(不会报错),这就是内存泄露
30          */
31         System.out.println(coll.size());
32         
33     }
34 
35 }
36 
37 class Pointer {
38     public int x = 0;
39     public int y = 0;
40     
41     public Pointer(int x, int y) {
42         super();
43         this.x = x;
44         this.y = y;
45     }
46 
47     @Override
48     public int hashCode() {
49         final int prime = 31;
50         int result = 1;
51         result = prime * result + x;
52         result = prime * result + y;
53         return result;
54     }
55 
56     @Override
57     public boolean equals(Object obj) {
58         if (this == obj)
59             return true;
60         if (obj == null)
61             return false;
62         if (getClass() != obj.getClass())
63             return false;
64         Pointer other = (Pointer) obj;
65         if (x != other.x)
66             return false;
67         if (y != other.y)
68             return false;
69         return true;
70     }
71     
72     
73 }

20.

 

posted @ 2013-03-18 16:55  加拿大小哥哥  阅读(1101)  评论(0编辑  收藏  举报