面向对象的编程:
声明定义类 抽象的过程
class 类名{
//成员变量 对象的特征
//成员方法
//构造方法 方法名 没有返回值类型
//如果没有显示声明构造方法 会默认生成无参构造
//如果显示声明则不会再有默认生成的
//方法可以重载 在同一人类中方法名相同,参数列表不同 参数类型或者个数不一样
}
拷贝构造 深拷贝与浅拷贝
实例化对象: new 类名(实参列表);//其实是调用了构造方法
必须通过引用变量才能访问对象
引用变量栈区 对象是在堆区 不能直接访问堆区的内容
只能通过引用变量操作对象
数据类型 引用变量 = new 对象;
new :(1)分配内存 (2)调用构造方法初始化
JVM对java程序的内存进行逻辑划分:栈区 堆区 方法区
栈区: 局部变量 方法调用时的开销
堆区: new的对象
方法区: 方法 类的信息 静态属性
局部变量 和 成员变量的区别:
1.声明位置 局部变量在方法区中
成员变量在类中方法外
2.初始化 局部变量不会自动初始化
成员变量会自动初始化 0 0.0 \u0000 false null
3.生命周期 局部变量方法调用到方法调用结束
成员变量从对象实例化开始到对象消亡
JVM的内存回收机制 Garbage Collection:
堆内存 JVM 有一个线程来回收java的内存
当一个对象没有引用变量再引用这个对象时,该对象已经无法再使用了,说明该对象的内存可以被回收,JVM有一个单独的线程会扫描堆中的对象,如果没有引用变量引用该对象时会自动回收该对象的内存
java程序也有内存泄漏的问题:
一个对象已经没有用了,但一直有引用变量引用该对象,这个时候就造成了内存泄漏,所以要及时对不再使用的对象的引用变量置null
System.gc() 强制让内存回收线程及时回收内存
static 修饰成员变量 表示该变量为 类属性 静态属性
静态属性 属于该类 该类所有的对象共享 存储在方法区
静态属性 可以直接通过 类名.静态属性名 的方式进行访问
也可以用 对象.静态属性名 的方式进行访问
static 修饰方法 表示该方法为 类方法 静态方法
静态方法属于类 没有 this引用变量
静态方法里 不能直接访问 成员属性 和 直接调用成员方法
只能访问静态属性 和 调用静态方法
static修饰语句块: 在类加载时被执行 而且只会执行一次
普通语句块: 在实例化对象时被执行 每实例化一个对象就执行一次
先于构造方法先执行
final:
1.修饰局部变量 必须初始化 初始化之后值不能再被修改
2.修饰成员变量 必须直接、语句块、构造方法中初始化 而且只能在其中之一
3.final和static一同修饰的变量称为常量
只能在静态语句块 或者 直接初始化
4.修饰方法 表示该方法不能被重写
5.修饰类 表示该类不能被继承
this
package
import
public
protected
default
private
继承:
为了提高代码的复用率
为了提高代码的开发效率
属于的关系 子类是父类中的一个子集 子类本应该拥有父类所有的属性和方法
JAVA中一个类可以继承另外一个类,那么该类就称为子类(son class) 或者 派生类
被继承的类称为父类(father class) 或者 基类
子类拥有父类的属性和方法
泛化的过程
写了一个类:方法 属性
extends 关键字
//A是子类 B是父类 A类拥有B类的属性和方法
class A extends B{
}
java语法规定:一个类只有继承一个类(一个儿子只能有一个新爹)
一个类可以被很多个类同时继承(一个爹可以有很多个儿子)
一个父类也是继承另外一个类
子类除了拥有父类的属性和方法以外 还可以自己定义声明属性和方法
子类的构造方法:
子类的构造方法中会隐式调用父类的无参构造方法 即 super()
第一行代码: super();
所以父类中如果没有无参构造方法,那么子类的构造方法将报错
这个时候就必须在子类中显示地调用父类中的构造方法
super(实参列表);
构造一个子类对象时 执行顺序
必须构造父类对象 然后再构造子类
构造父类对象时 先执行语句块 然后再执行构造方法
在子类的构造方法中:
this(参数) 来调用类中的其它构造方法
super(参数) 来调用父类中的构造方法
只能放在构造方法中的第一行
this() 和 super() 只能二选一
子类的对象 可以 用 父类的引用变量 来引用
父类类型 引用变量 = new 子类类型对象;
子类类型对象就隐式转换成了父类类型的对象
通过这个引用变量 只能 访问 父类中有的属性和方法
如果某个对象确实是子类对象 而被 父类引用变量 引用时 可以强制转换成子类类型
Father f = new Son();//隐式转换 通过f只能访问父类中的属性和方法
Son s = (Son)f; //强制类型转换
如果f引用的对象类型和强制转换的类型不一致就会造成 ClassCastException
重载(Overload)
重写(Override) OverWrite
子类重写父类中的方法 要求方法签名相同
方法签名: 方法名 参数列表