一、类和对象
Java语言是面向对象语言,通过对象与对象之间的交互,完成一个一个的任务。
例:要盖出一间房子,要有一张图纸。
类就好比是那张图纸,对象就好比是那一间房子。
房子是根据图纸盖出来的,对象是根据类创建出来的。
- 一个Java文件一般只定义一个类。
- public修饰的类要与文件名相同。
- 改变类名,通过设置去改,在文件中手写去改,只能改文件里面的,文件名不会改。
二、this引用
1、this,代表当前对象的引用
由于this关键字只存在于成员方法当中,所以当前对象指的是调用此成员方法的对象。所有对此方法中成员变量的操作,都是通过this完成的,只不过用户看不见,是编译器自动进行的。下面两个问题有利于对这句话的理解。
- 写出一个类,类中有成员变量和方法,实例化出了两个对象date和date2,去调用成员方法完成对象的赋值,那么此时,成员方法只有一个阿,但是对象有两个阿,它是怎么知道是对哪个对象赋值的呢?
public class Date {private int year;private int month;private int day;public void setDate(int y,int m,int d){year = y;month = m;day = d;}public static void main(String[] args) {Date date = new Date();date.setDate(2001,5,7);Date date1 = new Date();date1.setDate(2001,5,13);}
}
因为成员方法有一个隐藏的参数,这个参数是this,它是一个引用变量,存放的是对象的地址,简称this引用,当对象去调用成员方法时,对象的地址会传给this,那么在成员方法内,它就会知道是给哪个对象赋值了。
public class Date {private int year;private int month;private int day;public void setDate(Date this,int y,int m,int d){this.year = y;this.month = m;this.day = d;//在成员方法中,给成员变量加上this}public static void main(String[] args) {Date date = new Date();date.setDate(2001,5,7);Date date1 = new Date();date1.setDate(2001,5,13);}
}
- 当把值传给成员方法,形参接收后,发现形参与成员变量的名字相同时,那成员方法给谁赋值呢?是让形参给对象的变量赋值,还是让形参自己给自己赋值呢?
public class Date {private int year;private int month;private int day;public void setDate(int year,int month,int day){year = year;month = month;day = day;}public static void main(String[] args) {Date date = new Date();date.setDate(2001,5,7);Date date1 = new Date();date1.setDate(2001,5,13);}
}
根据局部变量优先原则,形参是局部变量,所以是优先给形参赋值。为了不让它识别为形参,在方法中的变量前加上this,代表是对象中的变量,也就是成员变量。
public class Date {private int year;private int month;private int day;public void setDate(int year,int month,int day){this.year = year;this.month = month;this.day = day;}public static void main(String[] args) {Date date = new Date();date.setDate(2001,5,7);Date date1 = new Date();date1.setDate(2001,5,13);}
}
2、this引用的特点
- 只存在于成员方法当中。
- 只能引用当前对象。
- 哪个对象调用,this的类型就是哪个对象的类型。
- this在成员方法中是隐藏的参数。
三、构造方法
此方法是对对象的成员变量赋值的,当使用关键字new一个对象时,会自动调用构造方法。
Date d = new Date(2021,6,9);
- 1、构造方法的组成是 public + 类名。
- 2、一个类的构造方法可以有多个,构成了方法的重载。
- 3、“救急不救穷原则”,若自己不写构造方法,编译器会默认提供一个无参构造,若写出来构造方法,那编译器不再提供。比如自己写了一个有参构造,若创建对象时,并没有传递参数,需要无参构造,编译器不会提供的,需要自己再写出一个无参构造。
- 4、可以在一个无参构造中用this去调用一个有参构造,传递参数。
public Date(){this(1900,1,1); //必须是第一条语句。
}
public Date(int year, int month, int day) {this.year = year;this.month = month;this.day = day;
}
四、封装
面向对象的语言的三大特性:封装、继承、多态。
在类和对象阶段,主要是封装特性。
-
1、什么是封装?
例:对于一台电脑来说,我们并不关心它内部的细节,比如里面线路怎么分布的,都有什么零件。我们只需要能用这台电脑的功能就可以,可以上网,可以用它的插口等。
对于类来说,也是这样,我们也并不关心它内部的实现细节,将成员变量隐藏起来,通过公共的方法操作成员变量,完成于对象之间的交互,这就是封装。
-
2、用什么完成封装?
使用访问限定符 :private,protected,public。三者均不加则为默认访问。
-
3、包
Java中的包是为了将类进行分类,方便进行管理。
使用import语句导入包
例:导入util包下的Arrays类
import java.util.Arrays;
导入util下的所有类
import java.util.*;
-
4、static关键字
1.修饰成员变量
创建好几个对象之后,发现某一个成员变量的值是相同的,比如有四个对象,这四个对象是同一个班级的,且对象中有一个成员变量是班级,那么可以把班级这个成员变量用static修饰,变为静态成员变量。
- 此时的成员变量变为静态成员变量,属于类的变量。
- 随着类的创建而创建,随着类的销毁而销毁。
- 通过类名.静态成员变量访问。
2.修饰成员方法
- 在静态成员方法中没有this这个隐藏的参数,所以不能在方法中使用this,因为this依赖对象,而静态成员方法不属于对象,属于类。
- 所以不能在方法中调用非静态成员方法。
- 不能在方法中调用非静态成员变量。
3.静态成员变量的初始化
不会在构造方法中初始化,因为构造方法依赖对象,而静态成员变量不属于对象。
分为就地初始化和静态代码块初始化。
- 就地初始化
在定义时直接给出初始值。
- 静态代码块初始化
static {
classRoom = "bit306";
}
静态代码块不管生成多少个对象,只执行一次 。