面向对象语言的三大特性:封装、继承、多态
确切地说,那些没有声明成static的部分,才是对象的原型。
(static的被称为类变量和类方法,由属于该类的所有对象共享)
对象中的变量,称为“属性”或"实例变量"。
实现各种行为的过程和函数,称为"方法"。
创建对象实例
如果不使用new的话,只有对象的引用(也就是指针)而没有分配内存空间。
Student jolin = new Student();
Student jolin = new Student("Jolin","female",160,21);//构造函数
类的继承
class 子类名称 extends 父类名称
Java子类不能继承父类的构造函数。
重写(或覆盖):即子类中的同名函数会取代父类的实例方法。
不过,对于父类中的类方法,子类想要覆盖它必须也将该同名函数定义为类方法来取代它,称为“隐藏”。
隐藏父类的成员变量
只要变量名称相同,就算数据类型不同,也一样可以隐藏父类的成员变量。
如何在子类中,使用父类的构造函数、被重写的方法、被隐藏的成员变量?
super.xxx(父类中的函数名)
接口
只有常量和抽象方法(只有声明,没有实现)。
写法:
IArea是一个接口,类使用implements实现接口。
接口也可以不止一个,用逗号分隔。
常量类型: final
interface IArea{
final double PI = 301415926;
void area();
}
class Circle implements IArea{
public void area(){
//计算圆面积
}
}
接口也可以继承。
在Java中,类不允许多重继承(表示父类不止一个),但却允许接口的多重继承。
接口一定是抽象类。
抽象类
除了有抽象方法,也可以有属性(变量)和操作。
写法:
abstract class Account{
private string id;
private double amount;
public abstract void calInterest();//抽象方法
double getBalance(){...};//抽象类中也可以有操作
}
抽象类可以用来作为数据类型,声明引用子类的对象变量。
因为父类的对象变量可以引用子类的对象。(也就是父类的指针可以指向子类吧。)
比如:
Account s2 = new SavingAccount("002-10-333-12",0.02);
Java可以同时继承抽象类且实现接口
class A extends B implements C
常量类
避免继承,防止子类访问和重写
final class
嵌套类
嵌套类的特点
- 成品和零件的关系
- 嵌套类也是外层类的成员
- 拥有相同的访问权限
在Java程序文件中只允许有一个public的类,而且程序文件名需与此类名相同。
匿名嵌套类,通常用于Java的Swing开发和Android接口组件的事件处理。
使用类继承来实现多态
动态绑定
多个子类实现同一抽象方法,在调用时根据对象的类型决定实际调用的方法。
包
即namespace,在Java中称作packages。
packages是一组相关类和接口的集合,简单来说,包是面向对象程序设计的零件库,程序开发者可以直接选用包中现成的各种类零件,组合零件来建立对象集合,完成Java应用程序的开发。
创建包
package xxx.myShape;
导入包和类
import xxx.myShape.Circle;//导入Circle类
import xxx.myShape.* //导入整个包(含包中的所有类)
异常处理
在Java程序执行时产生的异常是一个对象,属于Thorwable类或其子类的实例对象。两种子类如下:
- Error类:严重错误,会导致程序终止运行,无法使用异常处理
- Exception类:可以进行补救
try{
//检查是否产生异常对象,抛出
...
}
catch(ExceptionType e){
//(抛出异常后才执行的)异常处理
...
}
finally{
//可有可无,主要是进行程序善后
//不论异常是否产生都会执行
...
}
可以用多个catch同时处理多种类型的异常。
集合对象
旧版Java中主要指 Vector和Hashtable对象。
JDK 1.2后的版本提供Java Collections Framework(集合框架),这是保存和处理集合对象的统一软件框架。
泛型
类似C++的templates
提供编译阶段的集合对象类型检查功能,可以减少程序代码中取出集合对象所需的大量类型转换。
写法
使用泛型
HashSet<Byte> hset0 = new HashSet<Byte>();
HashSet<Float> hset0 = new HashSet<Float>();
HashSet<String> hset0 = new HashSet<String>();
Java SE7 支持下,可以简写为
HashSet<Byte> hset0 = new HashSet<>();