目录
引出: 我们至今为止Java都是用单独定义的变量和数组来解决问题,那是由于我们的目的简单,要求少。但是如果一旦我们这个要求变高,虽然仍可以解决问题,但是这样不利于数据的管理并且效率很低。
问:把大象关进冰箱需要几步?C语言: 怎么怎么把大象 “剁碎” 再怎么怎么塞进去 .........Java : 第一步:打开冰箱;第二步:把大象塞进冰箱;第三步:关上冰箱。
具体怎么赛Java不管。具体的实现细节不对外。
对比起来好像时Java更胜一筹。
例题:
我们假设我们有一只猫,这个类型叫做cat类,那么我们这只猫有那些属性呢?
我们假设它的名字叫做marry,年龄为2岁,颜色为白色。
那么它肯定还有一些行为对吧,比如跑,跳,叫,这些都是它的行为。
- public class demo {
- public static void main(String[] args) {
- Cat cat = new Cat();
- cat.speak();
- }
- }
- class Cat{
- String name ;
- int age ;
- String color;
- public void speak(){
- System.out.println("喵喵喵");
- }
- }
我们的类的位置可以任意写,不需要位于main方法之后,当然这里讲的是同一个包中(包在后面就会讲到)。那是因为我们Java的加载不同于C语言,不必在运行时一行行的加载(这也不用过多纠结以后讲)。
- class ClassName{
- field; // 字段(属性) 或者 成员变量
- method; // 行为 或者 成员方法
- }
public是访问修饰符,暂时不介绍,class是关键字用于创建一个类,这个猫就是一个类,数据类型就叫做Cat。我们先前提过基本数据类型和引用数据类型对吧,我们说了除了那 8 个基本数据类型全都是引用数据类型。基本数据类型保存在栈区上,引用数据类型保存在堆区上。
图示:

cat是实例化对象,注意这里写的不是Cat,Cat是个数据类型。
注意事项new 关键字用于创建一个对象的实例 .使用 . 来访问对象中的属性和方法 .同一个类可以创建对个实例 .

【修饰符】 方法名(形参列表){方法体}
注意:这里的方法名必须是类名。
1. 名字必须与类名相同2. 没有返回值类型,设置为 void 也不行3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 ( 相当于人的出生,每个人只能出生一次 )4. 构造方法可以重载 ( 用户根据自己的需求提供不同参数的构造方法 )5. 修饰符可以为 默认,protected,public,private
public class Date { public int year; public int month; public int day; // 无参构造方法 public Date(){ this.year = 1900; this.month = 1; this.day = 1; } // 带有三个参数的构造方法 public Date(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } }上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。6. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。一旦用户手动生成,将会覆盖默认构造器。7. 构造方法中,可以通过 this 调用其他构造方法来简化代码例如:
public class Date { public int year; public int month; public int day; // 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复 // 此处可以在无参构造方法中通过this调用带有三个参数的构造方法 // 但是this(1900,1,1);必须是构造方法中第一条语句 public Date(){ //System.out.println(year); 注释取消掉,编译会失败 this(1900, 1, 1); //this.year = 1900; //this.month = 1; //this.day = 1; } // 带有三个参数的构造方法 public Date(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } }如果使用这种方法构造,this()必须在构造器的第一行。
- public class Date {
- public int year;
- public int month;
- public int day;
- public Date(int year, int month, int day) {
- // 成员变量在定义时,并没有给初始值, 为什么就可以使用呢?
- System.out.println(this.year);
- System.out.println(this.month);
- System.out.println(this.day);
- }
- public static void main(String[] args) {
- // 此处a没有初始化,编译时报错:
- // Error:(24, 28) java: 可能尚未初始化变量a
- // int a;
- // System.out.println(a);
- Date d = new Date(2021,6,9);
- }
- }
Date d = new Date ( 2021 , 6 , 9 );
| 数据类型 | 默认值 |
| byte | 0 |
| char | '\u0000' |
| short | 0 |
| int | 0 |
| long | 0L |
| boolean | false |
| float | 0.0f |
| double | 0.0 |
| reference | null |
5. 设置对象头信息(关于对象内存模型后面会介绍)
6. 调用构造方法,给对象中各个成员赋值
这部分主要用于了解,以后还会细讲。
在声明成员变量时,就直接给出了初始值。
- 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();
- }
- }
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
我们在前面的构造器中用到this这个关键字,那么这个关键字究竟是干什么的呢?
我们来看这样一个代码:
- class Dog{
- private String name;
- private int age;
- private String color;
-
- public Dog(String name, int age, String color) {
- name = name;
- age = age;
- color = color;
- }
- }

我们可以看见 它的提示,这个变量 'name' 指向了它自己,编译器自己都不知道要指向哪里去了。
这里有一个成员变量叫做 'name' 还有一个传参的变量 'nam ' 所以要解决怎么个问题,我们就可以用到 this 关键字。我们把代码改一改:

这样我们的代码没有任何的警告提示信息了。
那么到底什么是this引用?
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
就拿上面的例子:this引用的是调用成员方法的对象。
画图说明:

每一个对象完成以后都会隐藏一个this指向自己。
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
例如:
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符。
| No | 范围 | private | default | protected | public |
| 1 | 同类 | 可访问 | 可访问 | 可访问 | 可访问 |
| 2 | 同包 | 不可访问 | 可访问 | 可访问 | 可访问 |
| 3 | 子类 | 不可访问 | 不可访问 | 可访问 | 可访问 |
| 4 | 不同包 | 不可访问 | 不可访问 | 不可访问 | 可访问 |
介绍:
public:可以理解为一个人的外貌特征,谁都可以看得到
default: 对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了
private:只有自己知道,其他人都不知道
【说明】
protected主要是用在继承中,继承部分详细介绍
default权限指:什么都不写时的默认权限
访问权限除了可以限定类中成员的可见性,也可以控制类的可见性