三、2016.05.07
import不是任何时候都可以,如果引入了两个包含有同一个类,那么使用的时候也必须使用全名,比如:import java.util.*; import java.sql.*;这两个包中都含有Date类,那么使用的时候必须用java.sql.Date time = new java.sql.Date();
Java常用包:
1. java.lang:这个包下包含了java的核心类,Sring,Math,System和Thread包以
及他们的子包.
2. java.util:这个包下包含了java大量工具类/接口和集合框架类/接口,例如
Arrays,List,Set等.
3. java.net:这个包下包含了一些java网络编程的相关接口/类. 4. java.io:这个包下包含了一些java输入/输出的编程相关接口/类. 5. java.text:这个包下包含了一些java格式化相关的类.
6. java.sql:这个包下包含了java进行JDBC数据库编程的相关类/接口. 7. java.awt:这个包下包含了抽象窗口工具集(Abstract Window Toolkits)的相
关类/接口,主要用于构建用户界面(GUI)程序.
8. java.swing这个包下包含Swing图形用户界面编程的相关类/接口,这些类
用来用于构建平台无关的GUI程序.
Java类至少有一个构造器,如果程序员没提供,那么系统会自动提供一个空构造器. 如果为一个类编写了有参数的构造器,建议再写一个无参数的构造器,构造器的重载,可以通过一个构造器调用另一个包含了的构造器.
用super来调用父类中被覆写了的方法. 子类不会获得父类的构造器.
子类使用构造器是从最顶层的父类构造器开始实现. 在强制转换之前,可以用instanceof来检测是否可以转换成功.
组合和继承都可以实现复用,组合是将父类嵌入原来的子类,作为子类的一个组合成分,组合需要构造函数(构造函数名和类名相同).
java先执行静态初始化块,然后执行普通初始化块,接着再执行构造器. 抽象类主要用来作为其他类的模板,接口用来定义其他类应该遵循的规范.
基本数据类型对应的包装类.
typeValue()方法可以获取对应type包装类的对象的值.
String.valueOf()把值转换成字符串,Type.parseXxx()把字符串转成值. 基本类型转换成字符串还有一个简单方法:String var = num + “”;
用System.out.println()输出的时候其实调用了toString方法,我们可以覆写toString方法来实现’自我描述’.
public String toString() {
return“content”+var;
}
==用来判断值是否相等,equals()用来判断两个引用变量的地址是否相同,这两个必须指向同一个对象才能相同,如果指向不同对象,那么也会返回不相等,所以我们经常需要覆写equals.
如果一个类始终只能创建一个实例,那么称这个类为单例类.
为了避免其他类自由创建该类的实例,把构造器用private修饰,如果这样,那么必须提供一个public static修饰的方法来作为该类的访问点,除此之外,该类还必须缓存已经创建的对象,参考singleton.java
final修饰:实例属性不可在静态初始化块中指定初始值,类属性不可在普通初始化块中指定初始值.
final修饰的引用类型变量和数组对象不能重新复制,但是引用的变量属性和数组的元素是可以改变的.
final修饰的方法是不能被子类重写的,但是可以重载. final修饰的类是不可以被继承的.
不可变类(immutable),创建实例后,该实例的属性是不可变的,比如java自带的8个数据类型包装类和java.lang.String都是不可变类.
自定义不可变类规则:
1. 使用private和final来修饰该类的属性.
2. 提供带参数构造器,用于传入参数来初始化类里的属性.
3. 只为该类的提供getter的方法,而不提供setter方法,因为普通方法无法修
改final修饰的属性.
4. 当重写hashCode和equals方法时,在equals方法根据关键属性来作为两
个对象相等的标准,除此之外,还应该保证equals相等的同时,hashCode也相等.
抽象方法是只有方法签名,但是没有方法实现的方法.(abstract) 抽象类和抽象方法的规则:
1. 抽象类和抽象方法都必须使用abstract来修饰,抽象方法不能有方法体. 2. 抽象类不能被实例化.
3. 抽象类的构造器不能用于创建实例,主要是用于被其子类调用. 4. 含有抽象方法的类只能被定义为抽象类.
接口是一种特殊的抽象类,只能包含抽象方法!接口里不能有构造器和初始化块定义.接口里的属性总是用public static final来修饰,方法总是用public abstract来修饰,所以都可以省略.
[修饰符] class 类名 extends 父类 implements 接口1,接口2{ 上面的语法用来继承并实现多个接口.
工厂模式就是把生成某类对象的逻辑集中在工厂类中管理,所有需要使用该类的对象只需要与该接口耦合,而不是与具体的实现耦合.
命令模式就是把”处理行为”作为参数传入该方法.
非静态内部类可以访问外部类的private成员或者属性,但是外部类不能直接访问内部类的属性或者成员,必须创建内部类的对象来引用.
非静态内部类里不能有静态方法,属性,初始化块. 静态内部类就变成了外部类类相关的,属于整个外部类. 1.外部类内部调用内部类:
与平常使用的普通类没有什么大的区别,唯一的区别就是不要再外部类的静态成员中使用内部成员的非静态成员.
2.在外部内以外使用非静态内部类:
这种情况内部类不能使用private修饰,否则不能被外部访问,在外部类以外其他地方定义内部类语法:Outclass.Inclass varName = new Outclass().new Innerclass();如果外部类有包名,还应该加入包名前缀.
类体;
}
四、2016.05.08
当创建内部类的对象时,必须将外部类的对象作为参数传入内部类的构造器. 3.在外部类以外使用静态内部类:
因为静态内部类是外部类类相关的,所以使用时候无需创建对象.外部类以外的地方使用:new OutClass.InnerConstructor();
局部内部类,上一级是方法,局部类仅在该方法内有效,所以无法在外部类以外的地方使用.
匿名内部类:适合那些只需要用一次的类,创建一个匿名内部类的实例,这个匿名类的定义立即消失,匿名内部类不能重复使用,语法:
new 父类构造器(参数) | 实现接口() { //匿名内部类的类体部分 },匿名内部类不能是抽象类,匿名内部类也不能定义构造器,只可以定义初始化块.
闭包(Closure)和回调:闭包是一个能被调用的对象,他保存了创建他的作用域的信息.非静态内部类就是一种面向对象领域的闭包,他记录了外部类的所有信息,并且可以直接使用外部类的private成员.回调就是某个方法一旦获得了内部类引用的对象以后,就可以在合适的时候调用外部实例的方法,例子:(TestTeachableProgrammer.java).
枚举类:
1.用private把构造器隐藏起来
2.用public static final来修饰可能用到的属性 3.如果有必要,可以提供一些静态方法
Java提供了一个Java.lang.Enum类,即枚举类,使用enum定义的类不再集成Object类,Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口,这个实现的枚举类构造器默认为private,所有的`实例必须在枚举类里面显示列出,否则不能产生实例,列出的实例会自动用public static final修饰.所有的枚举类都提供了一个values()方法,可以遍历所有的枚举值.