【Java基础(六)】面向对象与类的基础知识
面向对象编程
特点:
- 万事万物皆对象。
- 对象:具体的事务或实体,例如人。
- 类:对对象向上抽取出像、公共的部分,类是抽象的,是一个模板,例如人类。
类包含什么
类由属性、方法、构造器、代码块、内部类组成
属性
用于定义类包含的数据,即静态特征
属性声明格式
[修饰符] 属性类型 属性名 = [默认值]
方法
用于定义类的行为特征和功能实现,即能做什么事
属性
变量
在类里面分为成员变量和局部变量
- 成员变量:类中方法或代码块外定义的变量
- 局部变量:类中方法或代码块中定义的变量
区别如下:
成员变量 | 局部变量 | |
---|---|---|
代码位置不同 | 类中方法或代码块外定义的变量 | 类中方法或代码块中定义的变量 |
作用范围不同 | 当前类中所有地方 | 当前方法或代码块中 |
是否有默认值 | 有默认值(具体参考各类型变量默认值),未设置时将使用默认值 | 没有默认值,必须设置初始值,否则使用时将会报错 |
内存中位置不同 | 堆内存 | 栈内存 |
作用时间不同 | 当前对象从创建到销毁 | 当前方法从开始执行到执行完毕 |
注意点:
就近原则
- 当方法形参名字(局部变量)和 属性(成员变量)名字重复时,发生就近原则,优先使用局部变量,如果要使用成员变量,需要加上this.成员变量名来修饰
方法
1. 构造器
类中的一个特殊的方法,其方法名与类名相同,在创建类的具体对象时自动调用,用于为对象进行初始化操作。
默认构造器:
- 如果类没有显示定义构造器,系统将默认分配一个空参数构造器
- 如果显示定义了构造器后,默认分配的空参数构造器将取消,如果需要使用,需要手动定义。(大多数框架需要使用,建议手动显示设置)
与其他方法的区别:
- 没有方法的返回值类型
- 方法体内部不能有return语句
- 构造器名字必须跟类名一样
2. 重写与重载
重写:
发生在子类和父类中,当子类对父类提供的方法不满意的时,可以对父类的方法进行重写
重写的格式要求:
子类的方法名字和父类必须一致,参数列表(个数,类型,顺序)也要和父类一致。
重载
同一个类中,当方法名相同、形参列表不同时,多个方法构成了重载。
重写与重载的区别
英文 | 位置 | 修饰符 | 返回值 | 方法名 | 参数 | 抛出异常 | 方法体 | |
---|---|---|---|---|---|---|---|---|
重载 | overload | 同一个类中 | 无关 | 无关 | 必须相同 | 必须不同 | 无关 | 不同 |
重写 | override | 子类和父类中 | 父类的权限修饰符要低于子类的 | 父类的返回值类型要大于子类 | 必须相同 | 必须相同 | 小于等于 | 不同 |
代码块
代码块分类:普通块、构造块、静态块、同步块
普通块
位置位于方法中,由{}包括起来的代码,主要用于限制了局部变量的作用范围
构造块
位于类中,方法外,由{}包括起来的代码
静态块
位于类中,方法外,由{}包括起来的代码,{}前面加上了static修饰
注意:静态块中只能使用静态属性和静态方法
类中代码执行顺序
- 执行静态块
- 在类加载时执行,只执行一次
- 执行构造块
- 不常用,通常使用构造器来替代
- 执行构造器
- 执行方法中的普通块
修饰符
1. 权限修饰符
在类中一共支持4种权限修饰符,权限从低到高分别为 private、default、protected、public,
注:default为缺省修饰符,即未显示定义修饰符时即为default修饰符,并且default修饰也不允许显示定义。
属性和方法:四种修饰符均支持
类:只支持default(缺省)、public修饰符
四种修饰符权限控制如下表
同一个类 | 同一个包 | 子类 | 所有类 | |
---|---|---|---|---|
private | ✅ | |||
default | ✅ | ✅ | ||
protected | ✅ | ✅ | ✅ | |
public | ✅ | ✅ | ✅ | ✅ |
2. 静态修饰符 static
被static修饰的属性和方法为静态内容,静态内容先于对象存在,被所有该类的对象共享,共用一块内存。
访问方式: 类名.属性名 或 类名.方法名
注意:
- 静态方法中不能使用this关键字
- 静态方法中不能访问非静态的方法
- 静态方法中不能访问非静态的属性
3. this 修饰符
this指代当前对象,this可以修饰属性、方法、构造器
举例:this修饰构造器
同一个类中的构造器可以相互用this调用,注意:this修饰构造器必须放在第一行
public class Person {
String name;
Int age;
public Person(){}
public Person(String name){
this.name = name;
}
public Person(String name, int age){
// 同一个类中的构造器可以相互用this调用
this(name);
// this修饰构造器必须放在第一行
this.age = age;
}
}
4. super 修饰符
super指代当前对象的父类。
super修饰属性和方法:
-
在子类的方法中,可以通过 super.属性 super.方法 的方式,显示的去调用父类提供的属性,方法。
-
在通常情况下,super.可以省略不写
-
特殊情况下,当子类和父类的属性或方法重名时,你要想使用父类的属性或方法,必须加上修饰符super.,只能通过super.属性或方法来调用
super修饰构造器:
调用父类构造的代码
super()
- 所有构造器的第一行默认情况下都有super()。
- 但是一旦你在构造器中显示使用super调用了父类构造器,那么这个super()就不会给你默认分配了。
- 如果构造器中没有显示的调用父类构造器的话,那么第一行都有super(),可以省略不写。
- 在构造器中,由于this()和super()都必须放在第一行,所以这两者冲突,只能存在一个
import 导包
包的作用
- 解决重名问题
- 解决权限问题
包名定义规范
- 全部小写,中间用逗号隔开
- 不能使用系统关键字
- 一般在非注释性代码的第一行声明
包的使用
- 使用不同包里的类需要导包
- 导包以后,还想使用其他包下同名的类,就必须要手动写全所在的包
import java.util.Date;
public class Demo {
public static void main(String[] args) {
new Date();
// 导包以后,还想使用其他包下同名的类,就必须要手动写全所在的包
new java.sql.Date(10L);
}
}
- 同一个包下的类可以直接使用,不用导包
- 在java.lang包下的类,可以直接使用,不用导包
- 可以直接导入*,表示引用所有的包
import java.util.*
- Java中的导包没有包含和被包含的关系
设置目录平级格式(不显示包含关系),便于查看需要导入的包
7. 静态导入
导包时加上static修饰符
import static java.lang.Math.*;
静态导入后,同一个类中有相同方法时,优先使用自己定义的方法