垃圾回收机制
分配:由 JVM 自动的为其分配内存空间
释放:由 JVM 的 垃圾回收机制 自动的释放内存空间垃圾回收机制(GC Garbage Collection): 将内存中的垃圾对象从内存中释放
垃圾对象:不再被任何引用指向的对象
Person p = new Person();//分配内存
p = new Person();
System.gc(); 通知垃圾回收机制可以释放内存,但是垃圾回收机制并不会立即执行。
可以加快垃圾回收机制的运行。
类的继承
一、继承
1. 为什么使用继承?
①提高了代码的复用性
②利于维护
③有了继承让类与类之间产生了关系,可以创建更加特殊的特性。(多态)
2. 使用关键字:extends ----- “扩展” 明确子类是父类的扩展
例如:
class A extends B{}
子类:A 父类(超类、基类、SuperClass):B
3. 通过继承,子类“继承”父类中所有的属性和方法。(构造器除外)
私有属性也会被继承,只不过因为 private 修饰符的作用,子类不能直接访问
若要访问需要通过公共的 get/set 方法
4. 继承的注意:
①不能为了简化代码,获取某功能而继承,若要继承
两个类之间要满足一定的所属关系:is a
②Java 只支持单继承,不支持多继承。(一个父类可以有多个子类,但是一个子类只能有一个父类)
③Java 支持多层继承
二、方法的重写(方法的覆盖 Override):若父类中的方法对于子类来说不适用,子类可以对父类中的方法进行重写
①当子类继承父类后,若子类中出现了与父类中方法签名一模一样的方法时
创建子类对象,调用该方法,实际运行的是子类的方法
就如同将父类中的方法覆盖了一样
————————方法的重写(方法的覆盖)
1.方法重写的规则
前提:要有继承关系
①方法名和参数列表必须相同
②子类重写方法的访问控制修饰符不能小于父类被重写方法的访问控制修饰符
③子类重写方法的“返回值类型”可以是父类被重写方法“返回值类型”的子类
(通常在应用时,方法签名一模一样)
三、super 关键字:和 this 关键字的使用方式一样
this :使用在本类中,代表当前对象的引用
super :使用在子类中,代表父类对象的引用
super.属性
super.方法
super(……); 调用父类的构造器
①当子类继承父类后,子类“所有”构造器中可执行代码的首行都有一句隐式的:super();
super() 的作用:调用父类无参构造器
super() 的目的:当子类继承父类后,子类继承父类中所有的属性和方法
因此子类需要知道父类是如何为对象进行初始化
②若父类中没有提供无参构造器,子类中“所有”构造器都要显示的调用父类中有参构造器
③super() 和 this() 都需要使用在构造器中可执行代码的首行
因此, 二者不能同时出现。
四种访问修饰符
一、四种访问控制修饰符
private : 私有的,可用于修饰属性、方法。只能在本类中访问
default : 默认的(缺省的),可用于修饰属性、方法、类。 在本类中、本包中访问
(注意:default 并不是访问控制修饰符的关键字,什么都不加的时候)
protected : 受保护的,可用于修饰属性、方法。 在本类中、本包中、子类中访问
public : 公共的,可用于修饰属性、方法、类。 在任何地方都可以访问
多态
1.多态的体现:①方法的重载与重写 ②对象的多态性
2.对象的多态性:父类的引用指向子类的对象
Java 程序的运行分为编译时和运行时,在多态的情况下:
①编译时,“看左边”,看的是父类的引用。(而父类中不具备子类特有的方法)
②运行时,“看右边”,看的是子类的对象。(实际运行的是子类重写父类的方法)
———————— 虚拟方法调用(动态绑定)
Person p = new Man(); //多态
p.eat();
p.walk();
//p.smoking(); //编译? NO
3. 多态的前提:①要有继承关系 ②要有方法的重写(完成虚拟方法调用)
4. 引用数据类型之间的转换:
前提:要有继承
①向上转型:子类转父类。系统自动完成
②向下转型:父类转子类。需要使用强转符“(需要转换的类型)”
可能引发 ClassCastException
Person p = new Man(); //向上转型
Man m = (Man)p; //向下转型
m.smoking();
Woman woman = (Woman)p; //编译?YES 运行?NO
5.Java 为上述问题提供了相应的解决办法
instanceof 运算符:
p instanceof Man : 判断 p 引用指向的对象是不是 Man 的本类类型及子类类型
6. 多态的应用:
①多态数组:
Person[] persons = new Person[5];
persons[0] = new Person();
persons[1] = new Man();
persons[2] = new Woman();
persons[3] = new Student();
persons[4] = new Man();
for(Person p : persons){//对象的多态性
p.eat();//虚拟方法调用(动态绑定)
p.walk();
}
②多态参数:
//需求:展示一个男人吃饭和走路的功能
/* public static void show(Man man){
man.eat();
man.walk();
}
//
public static void show(Woman woman){
woman.eat();
woman.walk();
}*/
show(new Man());
show(new Woman());
public static void show(Person p){//多态参数
p.eat();//虚拟方法调用
p.walk();
if(p instanceof Man){
Man man = (Man)p;//向下转型
man.smoking();
}
}
java.lang.Object
一、java.lang.Object 类:是所有类的父类。若一个类没有显示的继承任何类时,默认 extends java.lang.Object
1.既然 Object 类是所有类的父类,那么 Object 类中的内容是最具共性的,任何类都适用
2.既然 Object 类是所有类的父类,那么子类可以继承 Object 类中所有的方法
3.既然 Object 类是所有类的父类,若 Object 类中的内容对于子类来说不适用,子类可以对其进行重写
二、
“==”运算符:
基本数据类型:用于比较两个基本数据类型的 值 是否相等,相等返回 true,不等返回 false
引用数据类型:用于比较两个引用数据类型的 地址值 是否相等。
public boolean equals(Object obj) : 用于比较两个对象是否相等
①在 java.lang.Object 类中
②只能比较两个引用数据类型
③Object 类中的 equals() 方法用于比较两个对象的地址值。
(通过查看源码发现 Object 类中的 equals(),就是用 "==" 完成)
④若 Object 类中的 equals() 对于我们来说不适用,我们可以对其进行重写。
【面试题】"==" 和 equals() 的区别?
三、
public String toString() : 返回当前对象的字符串表现形式
①在 java.lang.Object 类中。
②当直接输出对象的引用时,默认的调用 toString() 方法
③Object 类中的 toString() 方法格式为:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
④若 Object 类中的 toString() 对于我们不适用,我们可以对其进行重写
static关键字
一、static 修饰符:静态的,可以用于修饰属性、方法、代码块、**内部类
1. static 修饰的属性(静态变量或类变量)
①随着类的加载而加载,随着类的消失而消失(生命周期较长)
②静态变量被所有该类的对象所共享
③一旦某一个对象改变该属性值,其他对象的该属性值也会随之改变
④静态变量的存在优先于对象
⑤通过 类名.类变量 的方式进行使用
2.实例变量和类变量
①内存中的位置不同
②生命周期不同
3. static 修饰的方法(静态方法或类方法)
①随着类的加载而加载
②静态方法的存在优先于对象
③可以通过 类名.类方法 的方式进行调用
④静态方法中不能使用非静态成员,非静态方法中可以使用静态成员
⑤静态方法中不能使用 this 和 super
二、类的成员之一:代码块
非静态代码块:
①格式:类中的一对 {}
②每次创建对象时执行
③非静态代码块的执行优先于构造器
④用于为对象进行初始化(通常用于初始化对象的共性内容)
⑤非静态代码块可以有多个,依次向下的顺序执行
静态代码块:
①格式:static{}
②随着类的加载而加载,并且只加载一次
③静态代码块的执行优先于 非静态代码块
④静态代码块中不能使用非静态成员
⑤静态代码块可以有多个,依次向下的顺序执行
2.为属性赋初始值的方式
①默认值
②直接显示赋值
③构造器
④代码块
顺序:① ②④ ③
注意:②④ 顺序执行(谁在上先执行谁)
final关键字
final 修饰符:最终的,可用于修饰类、方法、变量。final 修饰的类不能被继承
final 修饰的方法不能被重写
final 修饰的变量叫常量,一旦赋值,值不能改变。
①命名规范:所有字母都大写,每个单词之间以 "_" 隔开。 例如: XXX_YYY_ZZZ
②常量没有默认值,因此使用前必须赋初始值。(直接显示赋值、构造器、代码块)
若选择使用构造器为常量赋初始值,必须保证“所有”构造器都为该常量赋值
检测语言世界语中文简体中文繁体丹麦语乌克兰语乌兹别克语乌尔都语亚美尼亚语伊博语俄语保加利亚语僧伽罗语克罗地亚语冰岛语加利西亚语加泰罗尼亚语匈牙利语南非祖鲁语卡纳达语印地语印尼巽他语印尼爪哇语印尼语古吉拉特语哈萨克语土耳其语塔吉克语塞尔维亚语塞索托语威尔士语孟加拉语宿务语尼泊尔语巴斯克语布尔语(南非荷兰语)希伯来语希腊语德语意大利语意第绪语拉丁语拉脱维亚语挪威语捷克语斯洛伐克语斯洛文尼亚语斯瓦希里语旁遮普语日语格鲁吉亚语毛利语法语波兰语波斯尼亚语波斯语泰卢固语泰米尔语泰语海地克里奥尔语爱尔兰语爱沙尼亚语瑞典语白俄罗斯语立陶宛语索马里语约鲁巴语缅甸语罗马尼亚语老挝语芬兰语苗语英语荷兰语菲律宾语葡萄牙语蒙古语西班牙语豪萨语越南语阿塞拜疆语阿尔巴尼亚语阿拉伯语韩语马其顿语马尔加什语马拉地语马拉雅拉姆语马来语马耳他语高棉语齐切瓦语 | 世界语中文简体中文繁体丹麦语乌克兰语乌兹别克语乌尔都语亚美尼亚语伊博语俄语保加利亚语僧伽罗语克罗地亚语冰岛语加利西亚语加泰罗尼亚语匈牙利语南非祖鲁语卡纳达语印地语印尼巽他语印尼爪哇语印尼语古吉拉特语哈萨克语土耳其语塔吉克语塞尔维亚语塞索托语威尔士语孟加拉语宿务语尼泊尔语巴斯克语布尔语(南非荷兰语)希伯来语希腊语德语意大利语意第绪语拉丁语拉脱维亚语挪威语捷克语斯洛伐克语斯洛文尼亚语斯瓦希里语旁遮普语日语格鲁吉亚语毛利语法语波兰语波斯尼亚语波斯语泰卢固语泰米尔语泰语海地克里奥尔语爱尔兰语爱沙尼亚语瑞典语白俄罗斯语立陶宛语索马里语约鲁巴语缅甸语罗马尼亚语老挝语芬兰语苗语英语荷兰语菲律宾语葡萄牙语蒙古语西班牙语豪萨语越南语阿塞拜疆语阿尔巴尼亚语阿拉伯语韩语马其顿语马尔加什语马拉地语马拉雅拉姆语马来语马耳他语高棉语齐切瓦语 |