一.面向对象的初步认知:
1.1什么是面向对象
java是一门纯面向对象的语言(Object Oriented Program简称OOP),在面对对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。对于大型程序的维护、设计和扩展都非常友好。
1.2面向对象和面向过程
举个例子,如果让你把大象放进冰箱里需要几步。
你会想:大象怎么装进冰箱呢?根本不可能装进冰箱。
这就属于面向过程的思想。
而面向对象的思想是:我只需要明确把大象放进冰箱,具体怎么做我不需要关心。
所以三步:1 把冰箱门打开 2 把大象放进去 3 把冰箱门关起来
注意:面向对象和面对过程不是一门语言,没有好坏之分,各有各的优点。都有其专门的应用场景
二.类的定义和使用
面向程序设计关注的是对象,而对象对应现实生活的实体,比如:空调。但是空调计算机并不认识,需要开发人员告诉计算机什么是空调。
这左边张图就是将空调这个现实的东西抽象出来,但是计算机还是不能识别,这时候我们就需要用到java语言了。
2.1简单认识类:
类是对一个对象的描述,主要描述该对象具有的属性(比如:外观、尺寸),有哪一些功能,描述完计算机就可以识别了。
举个例子:上面提到的空调,它的在java中可以看做是一个类别。
属性:产品品牌、产品重量、产品颜色、产品尺寸。
功能:制冷、除湿.....
2.2类的定义格式
那么在java中如何用语言来定义一个类呢?
//定义一个学生
class Student{
public String name;// field 字段(属性、成员变量)
public int age;
public dowork(); // method 成员方法
}
class为类的关键字,class为类的名字,{}中是类的主体。
2.3我们来试着定义一个狗类
class Dog{
public Stringname;//名字
public Stringcolor;//颜色
//狗的属性
public void barks(){
System.out.println(name+": 旺旺旺~~~");
}
//狗的行为
public void wag(){
System.out.println(name+": 摇尾巴~~~");
}
三.类的实例化
3.1拿上面最开始的学生举例
public class Classmates{
public static void main(){
Student student = new Student()//通过new实例化对象
student.name="zhangsan";
student.age=18;
}
}
注意事项:
1.new关键字用于创建一个对象的实例
2.使用.来访问对象中的属性和方法
3.同一个类可以创建多个实例
3.2类和对象的说明
1.类只是模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员
2.类是一种自定义类型,可以用来定义变量
3.类可以实例化多个对象,实例化的对象占用实际的物理空间,存储成员变量。
4.举个例子,类实例化出的对象就像是现实中建筑,类就像是设计图,只是负责设计,没有实例化
就是一张纸而已,实例化出的对象才能存储数据,存储物理空间。
四.this引用
4.1为什么要有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){
//构造三个日期类型的对象d1 d2 d3
Dated1=new Date();
Dated2=new Date();
Dated3=new Date();
//对d1,d2,d3的日期设置
d1.setDay(2020,9,15);
d2.setDay(2020,9,16);
d3.setDay(2020,9,17);
//打印日期中的内容
d1.printDate();
d2.printDate();
d3.printDate();
}
}
上面的代码定义了一个日期类,在main方法里实例化并调用,完成对象的设置的和打印。
整体逻辑清晰,流畅。
但是如果方法里的setDay发生了下面这种情况会如何呢?
public void setDay(int year,int month,int day){
year=year;
month=month;
day=day;
}
那这里的d1输出的三个值到底为啥?(以d1的实例化)
4.2什么是this引用?
this指向成员方法运行时当前调用成员方法的对象,在所有成员方法的成员对象中都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
public void setDay(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
}
注意:this引用的是调用成员方法的对象。
4.3 this引用的特性:
1.this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2.this只能在成员方法中使用
3.在成员方法中,this只能引用当前对象,不能再引用其它对象。
5.对象的构建及初始化
5.1默认初始化
通过前面的学习我们知道java的局部变量必须初始化,否则编译器就会报错。
public static void main(String[]args){
int a;
System.out.println(a);
}
//Error:(26,28)java: 可能尚未初始化变量a
但是在类中,成员变量没初始化却也没报错是什么情况呢?
要搞清楚这个问题要从实例化对象的new下手
Date d=new Date(2021,6,9);
在程序的层面就只是一条普通的语句而已,在jvm层面就要做很多事情,其中举一些例子:
数据类型 | 默认值 |
byte | 0 |
int | 0 |
char | '\u0000' |
short | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
refence | null |
5.2就地初始化
public class Date{
public int year=1900;
public int month=1;
public int day=1;
public Date(){
}
public Date(int year,int month,int day){
}
public static void main(String[]args){
Date d1=new Date(2021,6,9);
Date d2=new Date();
}
5.3构造函数
1.构造方法是一种特殊的成员方法,名字必须与类名相同,没有返回值在创建时由编译器自动调用,并且在整个对象的生命周期只调用一次
public class Date {
public int year;
public int month;
public int day;
// 构造方法:
// 名字与类名相同,没有返回值类型,设置为void也不行
// 一般情况下使用public修饰
// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
public Date(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("Date(int,int,int)方法被调用了");
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
// 此处创建了一个Date类型的对象,并没有显式调用构造方法
Date d = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了
d.printDate(); // 2021-6-9
}
}