一、类和对象的引出
对于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变量。
java"> int age = 18
如果要定义一个身高,就会这样去定义。
java"> double height = 180.5
以上就是一些基本类型变量的定义方式,在没有学习类和对象之前,所有的变量定义像是一种临时的,没有归属的,只知道要定义一个年龄,要定义一个身高,所以还要区分是谁的身高,是谁的年龄。可以这样去考虑,要区分谁的身高谁的年龄还不简单,直接定义张三的身高和年龄,然后定义李四的身高和年龄,就像下边的代码。
java"> // 定义一个age 值为18int zhangsan_age = 18;// 定义身高 值为180.5double zhangsan_height = 180.5;int lisi_age = 18;double lisi_height = 179.2;
嗯,挺聪明的,这确实是一种解决问题的方式,好了,现在一共有十个人,他们是同一个省,同一个市,同一个县,同一个村的人,分别定义他们的姓名,省份,城市,县区和村镇,来尝试一下。
java"> 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,定义对象可以通过类。类和对象就可以解决之前提出的两个问题。
为什么说类是模板?看如下代码。
java">public class Person {public String name;public String province = "动画省";public String city = "喜羊羊与灰太狼市";public String county = "青青草原区";public String village = "羊村";
}
在上边的代码当中,Person作为类,类中定义了一些变量,这些变量部分有自己的默认值,也就是所有人的地区信息,不难发现除了name没有赋值外,其他的属性已经全部赋值了。
两个问题的解决
当定义出Person类的时候,在创建十个人的信息,代码就会变成下方的样子。有没有发现代码量减少了很多,没有之前那么繁琐。并且我们这样的代码并没有之前那样冗余,没有在去写所有人的地址信息。
java">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关键字来创建的,一般是这种方式。
java">类名 对象名 = new 类名();
三、属性和行为
了解完类和对象就要了解类和对象中的属性和行为。
- 属性:属性是类中包含的一些信息,如同人员中的姓名和地区信息,也就是这个对象通过类这个模板创建出来的时候包含那些信息。
- 行为:行为就是对象可以完成的动作或者一个过程。
举个例子,美羊羊最后选择了和喜羊羊在一起,沸羊羊就会很伤心,他向羊村居委会提交了自己的迁移申请,他要自己出去住,去一个没有美羊羊的世界。那么沸羊羊就不在是羊村的人了,他选择加入老虎一族,去到了虎村。沸羊羊这个对象会通过行为修改自己的属性。
java">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;}
}
这个动作是沸羊羊完成的。
java"> 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的知识这里先不讲。
我们可以这样修改上方的代码。
java">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;}
}
java">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分那样子。舍友的行为是可见的,但是完成行为的过程是不可见的。