面向对象
一、理解
生活中 - 类:抽象的概念,把具有相同特征和操作的事物归为一类
代码中 - 类:抽象的概念,把具有相同属性和方法的对象归为一类
生活中:先有实体(对象),再有类
代码中:先有类,再有实体(对象)
注意:类相当于模板,刻画出对象应该拥有怎样的属性和方法
二、编写类,创建对象
属性:写在类里,方法外的变量
1.创建人类
//人类
//注意:类里只有属性和方法
public class Person {
//属性
String name;
int age;
char sex;
//方法
public void eat(){
System.out.println("吃饭饭");
}
public void sleep(){
System.out.println("睡觉觉");
}
}
2.在测试类里创建人类的对象
//测试类:测试我们写好的代码
//测试类必须有主方法
public class Test01 {
public static void main(String[] args) {
//需求:创建人类,再创建人类的对象
//创建人类的对象
Person p = new Person();
//操作属性 -- 设置属性
p.name = "倪飞";
p.age = 21;
p.sex = '男';
//操作属性 -- 获取属性
System.out.println(p.name);
System.out.println(p.age);
System.out.println(p.sex);
//调用方法
p.eat();
p.sleep();
}
}
三、属性 - 全局变量
含义:类里,方法外的变量
public class A{
//属性 - 全局变量
String str1; //成员变量
static String str2;//静态变量
public void method(){}
}
四、成员变量
含义:属于对象的变量
注意:每个对象独享一份成员变量,而且系统会为成员变量赋默认值
默认值:
整数类型:0
浮点类型:0.0
字符类型:’ ’
布尔类型:false
引用类型:null
成员变量 vs 局部变量
成员变量:类里,方法外的变量,作用于整个类,每个对象独享一份成员变量,而且系统会为成员变量 赋默认值
局部变量:方法里的变量,系统不会赋默认值
五、成员方法
语法:
访问修饰符 返回值类型 方法名([参数]){}
成员方法 vs 静态方法
成员方法必须用对象调用
静态方法必须用类名调用
六、构造方法
含义:与类名形同,且没有返回项的方法
作用:
创建对象(new 构造方法() 创建对象)
- 初始化数据
注意:没有参数的构造方法叫做无参构造,当没有其他有参构造时,系统会默认实现
构造方法 vs 普通方法(成员方法和静态方法)
构造方法:必须和类名相同且没有返回项
普通方法:必须有返回项(不管是返回具体的值还是void)
使用new关键字时开辟新空间,并创建属性,并给属性赋默认值,然后调用构造方法再决定是否对默认值进行初始化。
七、private
含义:私有化
作用:
修饰属性:私有化属性,外界不能被调用
修饰方法:私有化方法,外界不能被调用
外界:类的外面
应用场景:
如果当前类的属性不想让外界调用,就用private修饰
如果当前类的方法不想让外界调用,就用private修饰
八、封装
好处:避免直接操作属性,可以在set/get方法中做额外的功能
步骤:
私有化属性
- 添加get/set方法
九、小结
编写一个类的步骤:
编写属性,并用private私有化
- 创建无参构造和有参构造
- 添加get/set方法
- 添加其他方法
为什么私有化属性?
不想让外界随便调用,考虑到数据的安全性
为什么添加无参构造和有参构造?
添加有参构造的目的方便在创建对象时就初始化数据,但是编写了有参构造,系统就不会默认实现无参构造,所以自己还要去写一个无参构造
为什么添加get/set方法?
因为私有化属性后,使用get/set方法对外提供获取和设置的功能,还可以额外添加功能
十、this
含义:本对象
作用:
this.属性:调用属性
- this.方法:调用方法
- this() : 调用构造方法
十一、分包
基本的好处:防止了类的重名
项目中的好处:项目中有很多类,类的功能也不一样,可以把相似的类放在一个包里
十二、static
含义:静态的
作用:
- 修饰属性:类属性/静态变量,直接用类名调用,该类的每个对象共享一份
静态变量的生命周期:
1. 在类加载到方法区时,系统会扫描该类的静态变量并存放在静态区中 2. 项目结束时,静态区中的数据才会被回收
应用场景:static + final(下周去学习)
- 修饰方法:类方法/静态方法,直接用类名调用
应用场景:工具类
注意:该类只是纯粹的功能,就可以把该类变为工具类,直接用类名调用静态方法即可
- 静态代码块:
应用场景:初始化数据(功能和构造方法类似)
构造方法 vs 代码块 vs 静态代码块
构造方法:创建对象时调用,初始化数据(成员变量、静态变量)
代码块:创建对象时优先于构造方法调用,初始化数据(成员变量、静态变量)
静态代码块:字节码文件加载到方法区时调用,初始化数据(静态变量)
十三、继承
含义:子类继承父类的属性和方法
语法:public class 子类 extends 父类{}
注意:一个类只能继承另一个类(单继承)
好处:减少代码的冗余
应用场景:多个类,拥有相同的属性和方法,就可以把这些相同的属性和方法抽取到父类中
十四、深入继承
- 子类可以继承父类的私有化属性和方法吗?
可以的
- 创建子类对象,会调用父类构造方法吗?
会
- 创建子类对象,调用父类构造方法的目的?
在子类对象中开辟空间,用于存储父类的属性
- 创建子类对象,会创建父类对象吗?
不会
- 创建子类对象,先调用父类构造方法还是子类构造方法?
先调用子类构造方法
十五、super
含义:父类
作用:
super.属性:在子类中,调用父类非私有化属性
- super.方法:在子类中,调用父类非私有化方法
- super():在子类中,调用父类非私有化构造方法
十六、重写
含义:将父类里的方法,在子类中重新写一遍
应用场景:父类方法不满足子类需求时,考虑使用重写
条件:
在子类中
- 返回值、方法名、参数列表必须和父类重写的方法一致
- 访问修饰符不能比父类更严格
十七、访问修饰符
访问修饰符 本类 本包 同包子类 不同包 不同包子类 private ok default(默认权限) ok ok ok protected ok ok ok ok public ok ok ok ok ok