Java语言是面向对象的编程语言(Object Oriented Program,简称OOP)
包含三大特性:封装、继承、多态(类和对象主要以封装为主)
一、面向对象
面向过程:代表语言有C语言,通过函数之间的相互调用完成一件事情
将一件事情分成多个步骤,然后按照各个步骤之间的顺序依次完成;将动作封装成函数
面向对象:对场景进行分析,分离出对象,依靠对象之间的交互完成一件事情
对象:现实生活中的实体,眼睛看到的
面向对象和面向过程并不是编程语言,而是一种解决问题的一种思想
抽象:对一个复杂事物的认知过程
二、类的定义
类:对一个实体(对象)来进行描述,主要描述该实体(对象)具有哪些属性(包括外观、品牌、大小等)
//创建类
class ClassName{
field; //成员变量、字段、属性
method; // 成员方法、行为、功能
}
例:定义一个学生类
public class Student { // 类名采用大驼峰定义
//修饰符 类型 字段名
public String name; // 姓名
public String gender; // 性别
public String id; // 学号
public short age; // 年龄
public double score; // 分数
// 注意此处写的方法不含static关键字
public void DoClass(){
System.out.println(name + "去上课");
}
public void DoHomework(){
System.out.println(name + "写作业");
}
public void Exam(){
System.out.println(name + " " + "学号为:" + id + " " + "考试分数为:" + score);
}
}
三、类的实例化
概念:用类类型创建对象的过程
C语言:eat(参数)
Java:蓝胖子.eat();
public class Student {
public String name; // 姓名
public String gender; // 性别
public String id; // 学号
public short age; // 年龄
public double score; // 分数
public void DoClass() {
System.out.println(name + "去上课");
}
public void DoHomework() {
System.out.println(name + "写作业");
}
public void Exam() {
System.out.println(name + " " + "学号为:" + id + " " + "考试分数为:" + score);
}
public static void main(String[]args) {
Student student = new Student(); // 通过new实例化对象
student.name ="蓝胖子";
student.gender = "女";
student.id = "28256";
student.age = 18;
student.score = 80;
student.DoClass();
student.DoHomework();
student.Exam();
}
}
运行结果
蓝胖子去上课
蓝胖子写作业
蓝胖子 学号为:28256 考试分数为:80.0
类:属性+行为;没有实际空间
对象:对象就是对类的实例;实例化出的对象占用实际的内存空间,存储类成员变量;一个类可以创建多个对象
四、this引用
public class Date {
public int year;
public int month;
public int day;
public void setDay(int y, int m, int d){
year = y;
month = m;
day = d;
}
public void printDate(){
System.out.println(year + "年" + month + "月" + day + "日");
}
public static void main(String[] args) {
Date d1 = new Date(); // 构造个一日期类型的对象d1
d1.setDay(2022,3,20); // 对d1的日期设置
d1.printDate(); // 打印日期中的内容
Date d2 = new Date();
d2.setDay(2022,3,22);
d2.printDate();
Date d3 = new Date();
d3.setDay(2022,3,24);
d3.printDate();
}
}
运行结果
2022年3月20日
2022年3月22日
2022年3月24日
问题:当形参名不小心与成员变量名相同,如下
public void setDay(int year, int month, int day){
year = year;
month = month;
day = day;
}
无法判断谁给谁赋值,所以引入this,修改后的代码如下
public void setDay(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(this.year + "/" + this.month + "/" + this.day);
}
若不存在同名,则写代码的时候可以不用写this,this是编译器编译后自己生成的
this只能在成员方法中使用;在成员方法中,this只能引用当前对象,具有final属性(常属性)
this不可以为空,能编译,不能运行,会抛出 NullPointerException 异常
五、对象的构造与初始化
Date d1 = new Date();
从堆上开辟了对象大小的空间,对空间进行初始化,构造成一个真实的对象
构造方法:也称作构造器,是一个特殊的成员方法
- 名字必须与类名相同;
- 创建对象时,由编译器自动调用,并且在整个生命周期内只能调用一次;
- 绝大多数情况下使用public修饰,特殊情况下会被 private 修饰;
- 没有返回值类型,设置为void也不行(虽然代码可以通过编译,但是编译器不认为它是构造方法,在创建对象时,该方法没有执行)
- 构造方法可以重载
public class Date {
public int year;
public int month;
public int day;
//无参构造方法
public Date(){
year = 2022;
month = 4;
day = 3;
}
//含有三个参数的构造方法
public Date(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(year + "年" + month + "月" + day + "日");
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
}
}
方法名相同,参数列表不同,构成重载
- 如果用户自己没有实现构造方法定义,编译器会默认生成一份无参的构造方法
若用户定义,则编译器不再生成 - 构造方法中,可以通过this调用其他构造方法来简化代码
public Date(){
this(2022,4,3);// 无参构造方法中,通过this调用带有三个参数的构造方法
}
public Date(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
this()必须是构造方法中的第一条语句;
避免形成环(会形成无限递归),如下:
public Date(){
this(2022,4,3);
}
public Date(int year, int month, int day) {
this();
}
就地初始化
在声明成员变量时,就直接给出了初始值
public class Date {
//就地初始化
public int year = 2022;
public int month = 4;
public int day = 3;
public Date() {
}
public void printDate(){
System.out.println(year + "年" + month + "月" + day + "日");
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
}
}
编译器在编译代码期间会将就地初始化的内容拷贝到每个构造方法中,并且在用户所写的语句之前;代码编译完成后,编译器会将所有给成员初始化的语句添加到各个构造函数中。