一、方法
1. 方法调用
- 两个明确:返回值、 方法参数;
- 有返回值: 赋值调用,可以单独调用,但单独调用没有意义;
- 无返回值: 单独调用;
2. 方法重载
在一个类中,出现多个同名方法;
- 方法名相同;
- 参数不同:参数个数不同或者参数类型不同;
- 与返回值无关; (因为有返回值的和无返回值都可以单独调用,虚拟机无法区别哪个方法)
3. 形参: 基本数据类型及引用数据类型
基本数据类型: 形式参数的改变,不影响实际参数;
方法运行完毕后,就会从栈内存中弹出,因此a,b的值不会改变;
引用数据类型: 形式参数的改变,影响实际参数;
二、面向对象
- 面向过程:强调的是功能的每一个步骤;
- 面向对象:强调的是功能呢的具体模块由对象来实现(让别人帮你做事);
1. 类
- 成员变量: 类中方法外,不需要赋值,系统会给默认值如0或者null;
- 成员方法;
一个对象内存图
方法共用内存图
两个引用指向同一个对象内存图
2. 成员变量与局部变量
- 成员变量:类中方法外;保存在堆内存;随着对象的创建和消失而创建和消失;不用赋值(有默认值)
- 局部变量:方法中或方法声明上(形参);保存在栈内存;随着方法的调用而存在,方法调用完毕就消失;必须先赋值才能使用;
3. private关键字
- 权限修饰符,修饰成员变量和成员方法,只能在本类中使用;
- 修饰成员变量,并提供相应的set和get方法(set和get方法中可以提供逻辑);
- 体现封装思想(成员变量和方法);
4. this关键字
解决类中局部变量和成员变量同名问题
package Day01;
public class Phone {
private String color;
private String ip;
// 1. 变量命名:见名知意
public void setIp(String ip) {
// 局部变量和成员变量同名:就近原则
// 第一个ip,就是方法中的局部变量
// 添加this关键字:代表当前对象的引用,就会指向成员变量
this.ip = ip;
}
public void setColor(String color) {
this.color = color;
}
}
5. 构造方法
- 不写构造方法,系统默认给出无参构造;
- 写出构造方法,系统则不会默认给无参构造;
- 构造方法支持重载(即无参构造+多个带参构造);
- 构造方法的调用:new关键字来创建对象时,会调用构造方法;
6. 匿名对象
- 创建对象时候不用变量接受;
- 每次使用匿名对象时候,都是新建了一个对象,只能使用一次;
7. 继承
- 子类(派生类)继承父类(超类,基类);
- 子类拥有父类的所有公有的成员变量,成员方法;因此提高了代码复用性;
- 单一继承,多重继承;
- 假如不是单一继承,各个父类中都包含一个同名方法,导致子类无法区分;
成员变量、成员方法:
1). 子父类成员变量,成员方法不同名,调用哪个就用哪个;
2). 子父类成员变量,成员方法同名,优先调用子类的;
子父类继承内存图:
方法重写(覆盖):
- 子父类方法名,参数,返回值完全相同,子类对父类的方法体进行重写;
- 子类方法对父类的方法扩展及补充;在子类中调用super.method(),从而调用父类的该方法;
- 子类方法权限大于等于父类权限, 父类private的方法不能被重写(其他都可以);
this及super: 都是在子类中使用
- this.xxx , this.xxx() : 调用本类的成员变量和成员方法; 调用方法时可以省略
- super.xxx , super.xxx(): 调用父类的成员变量和成员方法;调用方法时候不能省略
- this():调用本类其他构造;
- super(): 调用父类其他构造; 只能在构造方法第一行执行;
构造方法执行顺序:
- 子类构造 第一行没有调用父类构造,则默认调用父类无参构造;
- 子类构造 第一行用this调用子类其他构造,其他构造要调用父类构造;
- 子类构造第一行用super()显式调用父类构造(无参构造及有参构造);
- 因此,子类创建对象时,都会先去创建父类对象;(java单一原则:父类对象初始化父类的成员变量,子类对象初始化子类成员变量);
8. 抽象类
- 抽象方法:一个方法只有方法声明,没有方法体;
- 抽象类:包含一个抽象方法的类,abstract修饰;
- 抽象类可以包含成员变量;
- 抽象类不能实例化,一定是一个父类,由子类重写具体的抽象方法;
- 抽象类的子类,要么也是抽象类,要么就重写父类的抽象方法;
- 抽象类可以不定义抽象方法,只是类用abstract,为了不让该类来创建对象;
9. 接口
- 接口中是更抽象的抽象类;
- 成员方法:默认 public abstract修饰(可以省略);
- 成员变量: 默认 public static final修饰(可以省略),定义后必须赋值;
- 接口不能实例化;
- 接口与接口:多继承,多重继承;
- 接口与类:类可以实现多个接口;
10. 多态
- 前提:子父类继承及方法的重写;
- 调用成员变量: 编译时看父类, 运行时看父类;
- 调用成员方法:编译时看父类,运行时看子类;
多态弊端及解决方案
- 向上转型:自动;
- 向下转型:强制类型转换;
- 多态只能调用子父类公有的方法,不能调用子类特有的方法;
- 可通过向下转型实现,但有可能转为具体的实现类时候转错;
public class Test {
public static void main(String[] args) {
Animal animal = new Cat();
// 向下转型时候不会做检验,只要是父类的子类即可
// 将Cat转换为Dog,编译报错
Dog dog = (Dog) animal;
dog.eat();
}
}
- 为了避免转换错误,引入instance of:判断对象类型;
public class Demo1 {
public static void main(String[] args) {
Animal animal = new Dog();
// 判断该对象是否为Cat
boolean flagCat = animal instanceof Cat;
if (flagCat){
Cat cat = (Cat) animal;
cat.eat();
}
boolean flagDog = animal instanceof Dog;
if (flagDog){
Dog dog = (Dog) animal;
dog.eat();
}
}
}
11. static关键字
- 修饰类中所有对象共享的成员变量和成员方法:;
- 调用时类名.方法名/成员变量,也可以通过new对象的方式来调用;
- 一个对象修改静态成员变量时,会影响其他所有对象的该变量;
- 静态成员变量保存在方法区中的静态方法区;
12. final关键字
- 类: 不能被继承;
- 成员变量:只能被赋值一次,不可变,使用前必须先赋值;
- 成员方法:不能被子类重写;
- 局部变量(基本类型):常量;
- 局部变量(引用类型):引用类型地址值不能改,但是指向的具体对象可以改;