7.3 面向对象-抽象
在Java中对象和上述的户型图一样,把房子设计成一个户型图就是抽象的过程,任何事物都可以抽象成一个Java对象。
创建House.java
创建Java类文件有四个规范需要遵守
- 文件名由类名+.java组成,比如HelloWorld.java
- 类名遵循大驼峰命名法,就是首字母大写,另外类名里不能有中文和字符,只能是字母和数字,比如:HelloWorld,Test,Test40
- Java类内容遵循固定格式:
public class 类名称 { }
看下图,创建类
点击新建类后,会出现对应的文件名输入框,输入Java文件名称就可以了
创建好文件,按回车就会打开该文件。
7.4 面向对象-包
一般在开发的时候都会使用package来管理代码。
创建包和包下面的类:
自定义包其实就是创建文件夹,包路径就是文件夹相对路径,比如说com.anaxiansen.test,这是一个包路径(注意包路径和子包路径直接使用.来分隔)
包名的规则:域名的反写。如,域名:anaxiansen.com 包名起始就是com.anaxiansen
如果我们在某个包下创建Java文件,那么Java类的内容就需要多一个声明包路径的语法,比如com.anaxiansen.test.Hello.java这样的Java类,它的包名是com.anaxiansen.test
类名称是Hello,代码如下:
package com.youkeda.test; public class Hello { }
如何引入自定义的类:
在前边已经知道了import语句用于申明导入不同包的对象,我们自己创建的类对象一样也有这个问题,比如House.java,如果我们把这个类创建成 com.anaxiansen.model.House,我们知道House对象是存放在com.anaxiansen.model包里,那么如何import呢?
package com.youkeda.test; import java.time.LocalDate; import java.time.format.DateTimeFormatter; //引入 House 类对象 import com.youkeda.model.House; public class Hello { }
不管是系统创建的还是我们自己创建的类对象,我们import的时候写上完整的类路径就可以了。另外还要注意import语句得在package之后,这个顺序不能错。
7.5 面向对象-属性/方法
房子的情况
特征:颜色,卧室
行为:打开水龙头,打开电灯
特征称为对象属性,而行为称为对象方法。
对象属性:
public class House { // 房子的颜色是绿色 public String color = "green"; // 房子的卧室有2间 public int bedRooms = 2; }
我们把在类中直接定义的变量称为对象属性,或类属性。这个和方法的变量不同点就是多了个public关键字,这个代表公共变量。
对象方法:
我们把房子的行为抽象成Java类方法
public class House { // 房子的颜色是绿色 public String color = "green"; // 房子的卧室有2间 public int bedRooms = 2; /** * 打开水龙头 */ public void runWater(){ } /** * 打开电灯 */ public void turnLightsOn(){ } }
这里的方法没有static关键字,有了static的方法称为静态方法,没有static的方法叫做对象方法。
接下来来抽象一下猫:
特征
特征信息 | 对象属性 |
姓名 | name |
年龄 | age |
行为
行为信息 | 对象方法 |
吃饭 | eat |
package com.anaxiansen.model.test; import com.anaxiansen.model.Cat; public class Cat{ public String name = "猫“; public int age; public void eat(){ } }
7.6 实例化对象、
建造房子的过程在Java中就叫做对象实例化,实例化有什么用呢?
我们要先清楚谁是谁的房子,找到房子才可以进入
实例化
//我的房子 House myHouse = new House(); //你的房子 House youHouse = new House(); //她的房子 House herHouse = new House();
对象的属性和方法也只有被实例化后才能被调用,有了实例以后,现在我们如果想打开你房子的电灯,那么我们就可以执行
youHouse.turnLightsOn();
如果想把她的房子颜色变成红色
herHouse.color = "red";
一个类对象可以被实例化成多个实例,每个实例都可以被同样的方法,属性来操作。
例:
任务一:完善House类的turnLightsOn方法,在这个方法里打印”灯已打开”。
任务二:完善HouseAction的main方法,实例化出一个House实例对象,并执行turnLightsOn方法。
在House类中:
在HouseAction中:
7.7 构造函数
1.带参数构造函数
先来看下边的代码:
House myHouse = new House(); myHouse.color = "red";
如果创建多个House实例,那么myHouse.color="red";就会显得特别冗余,那么这段代码,我们可以借助构造函数来实现代码的简化,实例化时就可以指定color。
public class House { // 房子的颜色是绿色 public String color = "green"; // 自定义一个带 color 参数的构造函数 public House(String color){ this.color = color; } }
多了一个this,实际上这段构造函数代码作用等同于之前的
myHouse.color = "red";
this和myHouse同等,也就是说this代表的是实例化后的对象。有了这个构造函数,便可以通过如下代码来实例化
House myHouse = new House("red");
2.显式指定默认构造函数
如果在Java类中定义了新的构造函数,那么默认的无参数构造函数就失效了。若想让默认的构造函数生效,可以再加一个默认的。
public class House { // 房子的颜色是绿色 public String color = "green"; // 房子的卧室有2间 public int bedRooms = 2; public House() { } // 自定义一个带 color 参数的构造函数 public House(String color) { this.color = color; } }
例:
任务一:加强一下House类,新增一个新的构造函数,新的构造函数需要支持颜色和房间数的初始化
任务二:更改HouseAction类的实例化方式,改成新增的构造函数。我们希望的数据是:red有3个,white有2个,green有2个。最后打印数据
House类里:
package com.youkeda.model; public class House { // 房子的颜色是绿色 public String color = "green"; // 房子的卧室有2间 public int bedRooms = 2; public House() { } // 自定义一个带 color 参数的构造函数 public House(String color) { this.color = color; } public House(String color,int bedRooms){ this.color = color; this.bedRooms = bedRooms; } /** * 打开水龙头 */ public void runWater() { } /** * 打开电灯 */ public void turnLightsOn() { System.out.println("灯已打开"); } }
HouseAction中:
package com.youkeda.action; import com.youkeda.model.House; public class HouseAction { public static void main(String[] args) { House hourse = new House("red",3); System.out.println(hourse.color+":"+hourse.bedRooms); hourse = new House("white",2); System.out.println(hourse.color+":"+hourse.bedRooms); hourse = new House("green",2); System.out.println(hourse.color+":"+hourse.bedRooms); } }
7.8 ArrayList
假定文件夹root下有N个文件,现在我们遍历这些文件并打印文件名称。由于N个文件的个数不确定,所以无法用数组来存储多个文件(因为数组的长度是事先确定的),在这个时候就需要一个动态数组来存储多个文件,这个动态数组在Java当中就是java.util.ArrayList对象。
ArrayList语法:ArrayList本质上就是一个动态数组对象,可以方便地存储集合对象,一般来说我们会把同一个类型的数据存储在这个ArrayList里。如果要使用ArrayList就必须先要实例化,实例化语法都一样,使用new关键字,并且要指定对象类型。
// 这里的 Java 对象类型可以是任意的对象类型 // 比如 String、Integer、House 等 // 这里的 <> 是 Java 泛型的规范,记住这个语法就行了 ArrayList<Java 对象类型> list = new ArrayList<>();
要先进行import完整的引入是import java.util.ArrayList;
add语法
完成ArrayList实例化之后,就可以使用ArrayLIst的add方法进行数据添加。
import java.util.ArrayList; public class ArrayListTest1{ public static void main(String[] args){ // 创建一个 ArrayList 存储字符串集合 ArrayList<String> strs = new ArrayList<>(); // 添加数据到 ArrayList 实例里 strs.add("张三"); strs.add("李四"); } }
get/size方法
ArrayList具备数组的特点:
1.可以获取长度(size)
2.可以根据索引获取具体的值get( 索引),ArrayList的索引是从0开始的,根据这两个特性也可以进行循环处理
import java.util.ArrayList; public class ArrayListTest1{ public static void main(String[] args){ // 创建一个 ArrayList 存储字符串集合 ArrayList<String> strs = new ArrayList<>(); // 添加数据到 ArrayList 实例里 strs.add("张三"); strs.add("李四"); // 获取集合的长度 int size = strs.size(); // 使用 for 循环迭代每一条记录 for(String str : strs){ System.out.println(str); } } }