老张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
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.