1. 理解面向对象
(1) 类:是对现实生活中事物的描述
对象:对这类对象事物,实实在在的个体
(2) 面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象是将功能进行封装,强调具备了功能的对象。
(3) 当多个引用指向同一个对象时,那么他们的内存地址值是相同的;在内存中,成员变量存在于堆内存,而局部变量存在于栈内存中。
(4) 匿名对象格式:
—— new Person().getName()
—— new Person().getAge()
—— new Person().eat()
这是三个不同的对象,在内存中都有各自的空间/地址,独立存在
(5) 封装:隐藏内部实现,对外提供功能
—— 好处:将变化隔离,便于使用,提高安全性,提高重用性
—— 实现:通过get/set方法对属性进行封装
—— 成员变量如果不赋值,会有默认初始化值;而局部变量必须赋值,否则不能进行运算
(6) 构造代码块 {...} —— 作用:给所有对象初始化,并对不同对象初始化共性内容,构造代码块优先于构造函数执行
(7) this关键字 : 在类中使用,调用的是当前对象,且this是一个引用;在构造函数中使用this()可调用其他构造函数,但必须在第一行,和super()类似
2. 静态 static
(1)定义:常用于修饰成员变量、成员函数,它在内存中存在于方法区中,并随着类的加载而存在,可以称其为类变量
(2)特点:随着类的加载而加载、优先于对象的存在、被所有对象共享、直接被类名调用(类名.成员)
(3)使用范围:被多对象调用,如果过多使用static变量,会消耗大量内存。
(4)类变量和实例变量的区别
——存放位置:类变量随着类的加载而加载,并存在方法区中;而实例变量是随着对象的建立而存在堆内存中。
——生命周期:类消失则类变量随着消失;而实例变量消失的前提是,对象消失
(5)使用static的注意事项
① 静态方法只能访问静态成员
② 静态方法中不可以存在this、super关键字
③主函数是静态的
(6)主函数:优先加载到方法区中,重载它
(7)什么时候使用静态?
①什么时候使用静态变量? ——在多对象中出现共享数据时,可将该数据用静态修饰
②什么时候使用静态函数? ——当功能内部没有访问到非静态数据且没有使用到对象的特有数据时,可将该功能用静态修饰
(8)静态工具类:私有化构造函数,使其不能被实例化,并提供公有、静态的功能。
(9)帮助文档的制作:javadoc -d 文档名 -author -version
(10)静态代码块 :static{...},特点是随着类的加载而加载,且只需加载一次。
一个类中包含静态代码块、代码块、成员,他们的执行顺序是:
①new一个类,类先加载到内存
②执行static代码块
③在内存中开辟空间、分配内存地址
④在堆内存中建立对象特有属性并默认初始化值
⑤对属性显示初始化
⑥对对象进行构造代码块初始化
⑦对对象的构造函数初始化
⑧将内存地址赋给栈内存中的引用变量
(11)单例设计模式:保证对象唯一
——步骤:①将构造函数私有化 ②在本类中建立一个本类对象 ③提供一个公有、静态的方法获取实例
——饿汉式(推荐使用)
public class Single {
private Single(){}
private static Single s=new Single();
public static Single getInstance(){
return s;
}
}
——懒汉式
public class Single {
private Single(){}
private static Single s=null;
public static Single getInstance(){
if(s==null){
synchnoized(Single.class){//加上同步,防止多线程创建多个实例,使用的锁是字节码文件对象
if(s==null){
return s;
}
}
}
}
}
3.继承(extends)
(1)概述:必须有所属关系(is a),java中支持多层继承,调用时,应该创建最子类的对象
(2)子父类中变量的特点:子类可以使用super.属性名方法父类的属性,super只能在第一行
子父类中构造函数的特点:子类一定会访问父类中的构造函数
(3)重写(覆盖):子类的方法名、参数列表、返回值类型必须和父类的一致且子类的访问权限不能小于父类,且静态不能覆盖非静态。
(4)重载:如果两个函数的方法名相同,参数列表不同,且与返回值无关,那么他们是重载关系
(5)结论:
①子类中所有的构造函数,默认都会访问父类的空参数构造函数
② super()只能在第一行
③子类实例化,都会走父类且this、super不能同时在第一行
(6)final修饰符
final修饰类:类不能被继承
final修饰方法:方法不能被重写
final修饰变量:变量变成常量,不能再次赋值,常量名应全部大写
(7)抽象类:不能实例化的类
抽象类可以包含非抽象方法
抽象方法只能存在抽象类中
子类继承抽象类必须覆盖抽象方法,若子类未覆盖所有抽象方法,那么子类还是一个抽象类
(8)模版方法模式——将变化的代码封装成模版
(9)接口:是一个特殊的抽象类
特点:在接口中包含全局静态常量,全局抽象方法,不能被实例化;子类用implemens来实现接口,可实现多个接口;接口可以继承多个接口。
4.多态:事物存在的多种体现形态
(1)多态的基本体现:父类的引用指向子类对象,Person p=new Student()
(2)多态的前提:多子类继承父类,子类覆盖父类的方法
(3)多态的好处:提高代码复用性、程序扩展性
(4)多态的应用:成员函数在多态调用中,编译时参考左边,运行时参考右边;而成员变量无论编译、运行都参考左边
(5)多态的扩展示例(PCI主板示例)
(6)Object类:所有类的父类,提供了最基本的方法
equals():用于两个对象的比较(比较内存地址值)
toString():返回该对象的字符串
hashCode():获取对象的哈希值
getClass():获取类的示例
getMethod():获取对象的方法组