Java的碎碎念
Date:3.21.2016
- 面向对象思想
Java是一个OOP的语言,一切皆为对象,用面向对象的思想把生活中的事物都抽象成各个对象,而类就是一堆对象的集合,对象就是类的个例,类拥有各个属性和数值,对每个符合类的对象都适用,以类的思想类考虑问题大大简化了代码的数量,更加符合逻辑。
- 方法
一件事可以抽象为“who do something”。Who 就是对象,而do something 就是方法了。
- 关于类的封装
在java中通过关键字private实现封装,把过程和数据包围起来,对数据的访问只能通过已定义的接口,通过访问器和修改器才能访问和修改数据。
- 关于类之前的修饰符
- private
Private就像是一堵在类的创建者和客户端程序员之间的砖墙。
- 关于包
包是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包(default package)。
- 关于加了包名的类的运行过程
在调用其他类的时候要导入包下的类,import 包名.类名
- 关于类方法
一般调用时要首先创建一个类的对象,然后 类名.方法名调用。
如果是static修饰类用可以用类名直接调用,不用的一定要先实例化一个对象然后才可以调用。
- 关于对象参数
因为Java里方法参数的传递实际上只有值传递(不管基本类型或引用类型),对基本类型来说是把其值传递了一份过去,而对引用类型来说实际是把引用地址的值复制一份传递了过去。
另外,只有用new方法创建的对象的实际成员数据是存放在堆里面的,而其他方法内部定义的变量都存放在栈中,一旦出了方法的范围就失效,会被内存回收。
Date:3.23.2016
- 重载Overload
public bool withdraw(double amt, string name)
public double withdraw(double amt)
1、方法名必须相同
2、参数列表必须不相同
3、返回值类型可以不相同
- 覆写Override
public override bool withdraw(...)
1、方法名相同
2、参数列表相同
3、返回值类型相同
PS: override存在于继继承的关系类中。
**PSS:**只有虚方法和抽象方法才能被覆写
- 方法里参数是String[]类型 怎么直接调用
public void addCourses(String[] course){
}
addCourses({"XXX"}){
}
改正: addCourse(new String[]{“XXX”})
**Ps:**可以用到可变长度参数,具体见下文
- 可变长度参数
public void addCourses(String... course) {
}
调用是 addCourses(“XXX”,“xxx”};
addCourses(int num,String... course) √
addCourses(String... course,int num) ×
**PS:**可变长度参数在参数中后不能跟其他参数,前头却可以
PSS编译器版本不能过低,最低javaSE-1.5
- new 修饰符
关键字 new 意味着内存的分配和初始化,new 调用的方法就是类的构造方法,没有用new 修饰符定义的数据都是在栈(Stack)中分配内存,但有一个例外,对于String定义的变量,总是从系统内存堆(Heap)中分配内存,栈中仅有对该String的引用
Date:4.4.2016
- GC:垃圾回收(Garbage Collection)
```system.gc();``
Java中一般不需要程序员进行内存的回收。当没有一个对象没有任何变量指向它的时候就“可以”被销毁,局部变量退出后就消失了不再指向了
- 单例模式
目标:系统中有且只有这个类的一个对象
步骤:
1、声明一个静态对象
private static God instance = new God();
2、提供一个外界访问这个对象的static方法
public static God getGod(){
return instance ;
}
3、为了避免其他人new再创建一个新的对象,把类的构造函数改成
private private God(){ }
- 编号生成器
/**
* 编号生成器
* @author ZeroyiQ
*
*/
public class NumberCreater {
private static NumberCreater instance=new NumberCreater();
public static NumberCreater getCreater(){
return instance;
}
private NumberCreater(){
}
private int number=0;
public int creater(){
number++;
return number;
}
}
- 重用代码
构造函数中遇到几个参数不同的,内部却有相同的部分,可以调用另外一个重载的构造函数,复用代码。
E.G.
public ZeroText(){
//this.number = NumberCreater.getCreater().createNumber();
this("");
//这就调用了下面带字符串参数的构造参数,省略了相同的部分
}
public ZeroText(String test){
this.number = NumberCreater.getCreater().createNumber();
createText(this.number,test);
}
- 枚举(enum)
- 知道给这个参数只传什么值 固定个数 有且只有几个可选值
- 如果传递的值错误,则不能编译通过
- 枚举不能new只能用“类型.名字”获取可选值
- 枚举原理
原本
public enum Dir {
Left,Right,UP,Down
}
用类实现其原理
public class MyEnum {
private MyEnum(){
}
public static final MyEnum Up = new MyEnum();
public static final MyEnum Down = new MyEnum();
public static final MyEnum Left = new MyEnum();
public static final MyEnum Right = new MyEnum();
//设置final是为了防止使用者通过 MyEnum = null 的方式释放对象
}
Date:6.15.2016
- 静态代码块
- 在类第一次被使用的时候执行
- 只执行一次在构造函数之前
- 同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量
static {
}
- 子类对象创建过程
1.子类对象创建的时候会先调用父类的构造函数,在调用子类的构造函数。
2.在子类的构造函数中,如果没有显式的调用父类的构造函数,则相当于在最开始默认调用父类的无参构造函数。super();
(额外,super()必须是代码第一行)
3.如果父类没有无参构造函数,那么子类必须显式调用父类的其他构造函数。
- 不能用子类的引用指向父类的对象
Chinese c1 = new Diqiuren()×错误
//可以调用那些方法由变量的类型决定
Diqiuren c1 = new Chinese()√正确
//父类的引用可以指向子类,父类有的方法,子类肯定能调用
c1.speak
/**PS.
*Diqiuren里有speak方法
*这句代表调用c1所指向Chinese里的speak方法
*如果speak里有override 父类方法 则调用 speak里的方法
*否则调用的是父类里的speak
**/
- final
1.final修饰类,则该类不允许被继承
2.final修饰方法,则该方法不允许被覆盖
3.final修饰属性,则该属性不会被隐式初始化(该属性必须有值,或者必须在构造方法中赋值(二者只能选一个))
4.final修饰变量,则该变量的值只能赋值一次,即为变量
- Object类
在java中所有类默认继承了Object类
Object类中的方法适用于所有的类
如: - toString()
返回对象的哈希code码(对象地址-字符串)
通过覆盖toString方法,我们就能修改成我们需要的 - equals()
比较对象引用是否指向同一块内存地址
当要比较对象属性是否相同的话,覆盖重写方法
ps.以上两种覆盖在eclipse中都有快捷生成方法
- 异常错误
父类:Throwable
子类:Error(程序终结者,一出现程序就崩溃了)
1.virtualMachineError 虚拟机错误
2.ThreadDeath 线程死锁
子类:Exception
1.runtimeException 非检查异常
a.NullPointException 空指针异常
b.ArrayIndexOutOfBoundsException 数组下标越界异常
c.ClassCastException 类型转换异常
d.ArithmeticException 算术异常
...
2.checkException 检查异常
a.IOException 文件异常
b.SQLException SQL异常