面向对象(抽象,包,属性/方法,实例化对象,构造函数以及ArrayList)

7.3 面向对象-抽象

                                                           面向对象(抽象,包,属性/方法,实例化对象,构造函数以及ArrayList)

 

  在Java中对象和上述的户型图一样,把房子设计成一个户型图就是抽象的过程,任何事物都可以抽象成一个Java对象。

  创建House.java

  创建Java类文件有四个规范需要遵守

  • 文件名由类名+.java组成,比如HelloWorld.java
  • 类名遵循大驼峰命名法,就是首字母大写,另外类名里不能有中文和字符,只能是字母和数字,比如:HelloWorld,Test,Test40
  • Java类内容遵循固定格式:
public class 类名称 {

}

看下图,创建类

面向对象(抽象,包,属性/方法,实例化对象,构造函数以及ArrayList)

 

 点击新建类后,会出现对应的文件名输入框,输入Java文件名称就可以了

面向对象(抽象,包,属性/方法,实例化对象,构造函数以及ArrayList)

 

 创建好文件,按回车就会打开该文件。


 

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中就叫做对象实例化,实例化有什么用呢?

面向对象(抽象,包,属性/方法,实例化对象,构造函数以及ArrayList)

 

我们要先清楚谁是谁的房子,找到房子才可以进入

实例化

//我的房子
House myHouse = new House();

//你的房子
House youHouse = new House();

//她的房子
House herHouse = new House();

对象的属性和方法也只有被实例化后才能被调用,有了实例以后,现在我们如果想打开你房子的电灯,那么我们就可以执行

youHouse.turnLightsOn();

如果想把她的房子颜色变成红色

herHouse.color = "red";

一个类对象可以被实例化成多个实例,每个实例都可以被同样的方法,属性来操作。

例:

任务一:完善House类的turnLightsOn方法,在这个方法里打印”灯已打开”。

任务二:完善HouseAction的main方法,实例化出一个House实例对象,并执行turnLightsOn方法。

在House类中:

面向对象(抽象,包,属性/方法,实例化对象,构造函数以及ArrayList)

 

 在HouseAction中:

面向对象(抽象,包,属性/方法,实例化对象,构造函数以及ArrayList)

 


 

 

 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);
    }

  }

}

 

上一篇:leetcode198. House Robber


下一篇:成员函数做友元函数