1.abstract的函数只能在abstract类中
2.函数的重载
同一个类中,多个函数名相同
通过参数列表(参数类型,顺序,数目)区分它们的不同
println就是函数重载,根据不同的参数,选择不同的函数
3.构造函数
函数名与类名相同,没有返回类型,public
系统自动调用,在实例化一个对象是,调用构造函数
不能通过其他方式调用,主要完成初始化工作
补充:类中一定存在构造器;用户没有显示定义构造器,则java回默认分配无参构造器;一旦用户显示定义了构造器,不会再分配无参构造器。
4.静态初始化器
static{ //语句 }
特点:类初始化,所属类加入内存时运行;没有返回值,没有参数;其中的变量必须是static型的。
public class Account{ static int AccountNo = 0; public Account(){ AccountNo++; System.out.println("bb"); } static{ //静态初始化值 AccountNo=1000; System.out.println("aa"); } } public class Example{ public static void main(String[] args){ Account a = new Account(); System.out.println(a.AccountNo); Account b = new Account(); System.out.println(b.AccountNo); } } 结果: aa bb 1001 bb 1002
结论:static静态类初始化器早于其他函数执行;只执行一次;在static int AccountNo=0;之后,则在这之后执行。
补充:static静态初始化器是在实例化类时执行。
5.终结器
protected void finalize(){ //语句 }
执行条件:当垃圾达到一定数目,且系统不是很忙是,垃圾回收线程会自动完成,所有垃圾对象的内存释放工作。
6.面向对象程序设计
封装性(隐藏细节,权限控制);继承性(类的层次结构);多态性(方法名相同,实现不同)
7.对象的内存模型
栈:存放基本数据类型和对象
堆:存放对象实例
Bird a = new Bird();
final修饰的类不能被继承
final修饰成员变量,表示不能够改变,可以理解为常量
类的继承:子类不能继承父类的private方法
成员的覆盖:
1)变量的覆盖
- 子类的成员变量和父类的成员变量同名
- 变量的覆盖与类型无关,只与变量名相关
- 当子类执行继承父类的方法时,处理的是父类的成员变量
2)函数的覆盖
- 子类的成员方法与父类的成员方法的原型相同
- 函数的覆盖不仅与方法名相关,而且与其参数类型、顺序、数目、返回值相关
构造函数的继承
- 子类无条件继承父类不含参构造函数
- 子类先执行父类的无参构造函数,再执行自己的构造函数
- 子类可以通过在自己构造函数中使用super关键字来调用父类的构造函数,该语句必须在子类构造函数的第一个可执行语句。
public class Swan extends Bird{ public Swan(){ System.out.println("Swan!"); } public Swan(int num){ System.out.prinln("Lake!"); } } public class Bird{ public Bird(){ System.out.println("Bird!"); } } public class Example{ public static void main(String[] args){ Swan a = new Swan(); Swan b = new Swan(1); } } 结果: Bird! Swan! Bird! Lake!
public class Swan extends Bird{ public Swan(){ super(1,1); System.out.println("Swan!"); } public Swan(int num){ super(1,1); System.out.prinln("Lake!"); } } public class Bird{ public Bird(){ System.out.println("Bird!"); } public Bird(int c, double s){ System.out.println("CS!"); } } public class Example{ public static void main(String[] args){ Swan a = new Swan(); Swan b = new Swan(1); } } 结果: CS! Swan! CS! Lake! 结论:用了super以后,就不再默认先调用父类午餐构造函数了。
null 表示空对象
this 表示当前对象的一个引用(可以理解为别名);可以调用当前对象的方法;可以调用当前对象的构造函数;把当前对象的引用作为参数传给其他方法。
super 表示当前对象的父类对象的一个引用;可以调用当前对象的父类对象的方法;可以调用当前对象的父类对象的构造函数;把当前对象的父类对象的引用作为参数传递给其他方法。
多态性
- 重载
- 覆盖
- 父类引用指向子类对象实例:前期绑定(指编译时绑定);后期绑定(运行时绑定)
方法重写/覆盖 overriding
- 一定是在子类和父类之间(与overloading)不同
- 方法名、参数列表和返回类型都相同
- 可见范围不能被缩小,要求子类的同名方法的访问权限不能小于父类的方法访问权限
- 抛出的异常不能被子类放大,即子类方法抛出的异常必须和父类的同名方法抛出的异常相同,或者是父类方法抛出的异常类的子类
Comparable接口
所有可以“排序”的类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法。
public int compareTo(Object obj);
返回0表示 this = obj;
返回正数表示 this > obj;
返回负数表示 this<obj.
实现了Comparable接口的类通过实现comparaTo方法从而确定该类对象的排序方式。
如何选择数据结构
衡量标准:读的效率和改的效率
Array 读快改慢
Linked 改快读满
Hash 两者之间