一、类和对象的引出
对于Java初学者来说,类和对象是一个有些不太好理解的知识点,在学习类和对象之前,会接触到Java中的八大基本数据类型。
数据类型分类 | 数据类型名称 | 关键字 | 占用字节数 | 取值范围 |
---|---|---|---|---|
整数类型 | 字节型 | byte |
1 字节 | -128 到 127 |
短整型 | short |
2 字节 | -32768 到 32767 | |
整型 | int |
4 字节 | -2147483648 到 2147483647 | |
长整型 | long |
8 字节 | -9223372036854775808 到 9223372036854775807 | |
浮点类型 | 单精度浮点型 | float |
4 字节 | |
双精度浮点型 | double |
8 字节 | ||
字符类型 | 字符型 | char |
2 字节 | 0 到 65535 |
布尔类型 | 布尔型 | boolean |
没有明确的字节规定,通常认为是 1 位 | true 或 false |
在之前的学习过程中,更多的情况是接触以上一些数据类型,比如我们在定义一个年龄的时候,就会这样去写。 就会使用熟悉的int变量。
int age = 18
如果要定义一个身高,就会这样去定义。
double height = 180.5
以上就是一些基本类型变量的定义方式,在没有学习类和对象之前,所有的变量定义像是一种临时的,没有归属的,只知道要定义一个年龄,要定义一个身高,所以还要区分是谁的身高,是谁的年龄。可以这样去考虑,要区分谁的身高谁的年龄还不简单,直接定义张三的身高和年龄,然后定义李四的身高和年龄,就像下边的代码。
// 定义一个age 值为18
int zhangsan_age = 18;
// 定义身高 值为180.5
double zhangsan_height = 180.5;
int lisi_age = 18;
double lisi_height = 179.2;
嗯,挺聪明的,这确实是一种解决问题的方式,好了,现在一共有十个人,他们是同一个省,同一个市,同一个县,同一个村的人,分别定义他们的姓名,省份,城市,县区和村镇,来尝试一下。
String name = "喜羊羊";
String first_province = "动画省";
String first_city = "喜羊羊与灰太狼市";
String first_conty = "青青草原区";
String first_village = "羊村";
String second_name = "美羊羊";
String second_province = "动画省";
String second_city = "喜羊羊与灰太狼市";
String second_conty = "青青草原区";
String second_village = "羊村";
/*·····························*/
还可以,除了有点累,其他的没什么,还是一样可以写出来的。现在有这样的两个问题。
- 在代码当中,这样子去定义这么多人是不是有点繁琐
- 这么多人,很多信息是一样的,这样子去定义是不是太冗余
这么多的信息,我们是不是不需要去定义呢?我们是不是可以直接默认所有人的地区信息是一样的呢?当然是可以的,这种情况下就要使用到类和对象了。
二、类和对象
类是一个模板,对象是模板创建出来的变量,就像之前定义年龄的时候使用int,定义对象可以通过类。类和对象就可以解决之前提出的两个问题。
为什么说类是模板?看如下代码。
public class Person {
public String name;
public String province = "动画省";
public String city = "喜羊羊与灰太狼市";
public String county = "青青草原区";
public String village = "羊村";
}
在上边的代码当中,Person作为类,类中定义了一些变量,这些变量部分有自己的默认值,也就是所有人的地区信息,不难发现除了name没有赋值外,其他的属性已经全部赋值了。
两个问题的解决
当定义出Person类的时候,在创建十个人的信息,代码就会变成下方的样子。有没有发现代码量减少了很多,没有之前那么繁琐。并且我们这样的代码并没有之前那样冗余,没有在去写所有人的地址信息。
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "喜羊羊";
Person p2 = new Person();
p2.name = "沸羊羊";
Person p3 = new Person();
p3.name = "美羊羊";
/*······················*/
}
那么类和对象到底该如何理解呢?一定要记住这句话:类是模板,对象是由模板创造出的。
在上方的Person模板中,有姓名和地区信息,地区是有默认值的,名字是没有默认值的,p1,p2,p3在创建的时候已经有了模板中的属性,对于地区信息直接使用默认值就可以,姓名需要在重新定义。
现在可以大概了解,什么是类和对象了。
对象的创建是通过new关键字来创建的,一般是这种方式。
类名 对象名 = new 类名();
三、属性和行为
了解完类和对象就要了解类和对象中的属性和行为。
- 属性:属性是类中包含的一些信息,如同人员中的姓名和地区信息,也就是这个对象通过类这个模板创建出来的时候包含那些信息。
- 行为:行为就是对象可以完成的动作或者一个过程。
举个例子,美羊羊最后选择了和喜羊羊在一起,沸羊羊就会很伤心,他向羊村居委会提交了自己的迁移申请,他要自己出去住,去一个没有美羊羊的世界。那么沸羊羊就不在是羊村的人了,他选择加入老虎一族,去到了虎村。沸羊羊这个对象会通过行为修改自己的属性。
public class Person {
public String name;
public String province = "动画省";
public String city = "喜羊羊与灰太狼市";
public String county = "青青草原区";
public String village = "羊村";
// 修改村地址的行为
public void changeVillage(String village){
this.village = village;
}
}
这个动作是沸羊羊完成的。
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "喜羊羊";
Person p2 = new Person();
p2.name = "沸羊羊";
Person p3 = new Person();
p3.name = "美羊羊";
System.out.println("喜羊羊的村地址是:" + p1.village);
System.out.println("沸羊羊的村地址是:" + p2.village);
System.out.println("美羊羊的村地址是:" + p3.village);
System.out.println("喜羊羊和美羊羊在一起了,沸羊羊搬了出去······");
System.out.println("沸羊羊去了虎村");
p2.changeVillage("虎村");
System.out.println("沸羊羊的村地址是:" + p2.village);
/*······················*/
}
这就是对象的一种行为,对象可以通过行为获取和修改类中的属性。
对象可以通过行为获取属性,在哪里体现?在上方的代码中是通过.来获取的属性,这得益于我们在类中定义这些属性的时候,使用的是public类型的变量,如果修改为private后,就不可以在通过.的方式来获取对象属性的值了,public和private的知识这里先不讲。
我们可以这样修改上方的代码。
public class Person {
public String name;
public String province = "动画省";
public String city = "喜羊羊与灰太狼市";
public String county = "青青草原区";
public String village = "羊村";
// 修改村地址的行为
public void changeVillage(String village){
this.village = village;
}
public String getVillage(){
return this.village;
}
}
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "喜羊羊";
Person p2 = new Person();
p2.name = "沸羊羊";
Person p3 = new Person();
p3.name = "美羊羊";
System.out.println("喜羊羊的村地址是:" + p1.getVillage());
System.out.println("沸羊羊的村地址是:" + p2.getVillage());
System.out.println("美羊羊的村地址是:" + p3.getVillage());
System.out.println("喜羊羊和美羊羊在一起了,沸羊羊搬了出去······");
System.out.println("沸羊羊去了虎村");
p2.changeVillage("虎村");
System.out.println("沸羊羊的村地址是:" + p2.getVillage());
/*······················*/
}
结果还是一样的。
对象的属性和行为都是通过 . 来访问的。
行为不止可以修改对象属性,行为可以完成一些很复杂的事情。沸羊羊不仅可以更换村落,还可以找喜羊羊单挑,夺回美羊羊。至于在夺回美羊羊之前做了什么,我们就并不知道了,行为也可以理解为是对一件事情的封装,看下边的过程。我们只知道沸羊羊夺回了美羊羊,但我们看不到沸羊羊的努力,就像你的舍友期末说只看了一点点,但是最后考的90分那样子。舍友的行为是可见的,但是完成行为的过程是不可见的。