Java基础编程 - 4、面向对象-上

1 类的对象

1、Java面向对象学习的三条主线:

  • 1.Java类及类的成员:属性、方法、构造器;代码块、内部类
  • 2.面向对象的三大特征:封装性、继承性、多态性、(抽象性)
  • 3.其它关键字:this、super、static、final、abstract、interface、package、import等
    “大处着眼,小处着手”

2、“人把大象装进冰箱”

1.面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。
1
2
3
① 把冰箱门打开
② 抬起大象,塞进冰箱
② 把冰箱门关闭
2.面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
人{
打开(冰箱){
冰箱.开开();
}

抬起(大象){
大象.进入(冰箱);
}

关闭(冰箱){
冰箱.闭合();
}

}


冰箱{
开开(){}
闭合(){}
}

大象{
进入(冰箱){
}
}
3、面向对象的两个要素:
  • 类:对一类事物的描述,是抽象的、概念上的定义
  • 对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)
  • 面向对象程序设计的重点是类的设计
  • 设计类,就是设计类的成员。

2 类的结构之一 属性

属性(成员变量)   vs  局部变量
1.相同点:
        1.1  定义变量的格式:数据类型  变量名 = 变量值
        1.2 先声明,后使用
        1.3 变量都有其对应的作用域 


2.不同点:
        2.1 在类中声明的位置的不同
        属性:直接定义在类的一对{}内
        局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量

        2.2 关于权限修饰符的不同
        属性:可以在声明属性时,指明其权限,使用权限修饰符。
            常用的权限修饰符:private、public、缺省、protected  --->封装性
            目前,大家声明属性时,都使用缺省就可以了。
        局部变量:不可以使用权限修饰符。

        2.3 默认初始化值的情况:
        属性:类的属性,根据其类型,都有默认初始化值。
            整型(byte、short、int、long):0
            浮点型(float、double):0.0
            字符型(char):0  (或'\u0000')
            布尔型(boolean):false

            引用数据类型(类、数组、接口):null

        局部变量:没有默认初始化值。
         意味着,我们在调用局部变量之前,一定要显式赋值。
            特别地:形参在调用时,我们赋值即可。

        2.4 在内存中加载的位置:
        属性:加载到堆空间中   (非static)
        局部变量:加载到栈空间

3 类的结构之二 方法

方法:描述类应该具有的功能。
比如:Math类:sqrt()\random() \...
    Scanner类:nextXxx() ...
    Arrays类:sort() \ binarySearch() \ toString() \ equals() \ ...

1.举例:
public void eat(){}
public void sleep(int hour){}
public String getName(){}
public String getNation(String nation){}

2. 方法的声明:权限修饰符  返回值类型  方法名(形参列表){
                    方法体
              }
  注意:static、final、abstract 来修饰的方法,后面再讲。

3. 说明:
        3.1 关于权限修饰符:默认方法的权限修饰符先都使用public
            Java规定的4种权限修饰符:private、public、缺省、protected  -->封装性再细说

        3.2 返回值类型: 有返回值  vs 没有返回值
            3.2.1  如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用
               return关键字来返回指定类型的变量或常量:“return 数据”。
                  如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要
              使用return.但是,如果使用的话,只能“return;”表示结束此方法的意思。

            3.2.2 我们定义方法该不该有返回值?
                ① 题目要求
                ② 凭经验:具体问题具体分析

     3.3 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”

     3.4 形参列表: 方法可以声明0个,1个,或多个形参。
        3.4.1 格式:数据类型1 形参1,数据类型2 形参2,...

        3.4.2 我们定义方法时,该不该定义形参?
                ① 题目要求
                ② 凭经验:具体问题具体分析

     3.5 方法体:方法功能的体现。         

 4.return关键字的使用:
     1.使用范围:使用在方法体中
     2.作用:① 结束方法
           ② 针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据。
     3.注意点:return关键字后面不可以声明执行语句。

 5. 方法的使用中,可以调用当前类的属性或方法
         特殊的:方法A中又调用了方法A:递归方法。
    方法中,不可以定义方法。

4 类的特征之一 封装性

####一、问题的引入:
当我们创建一个类的对象以后,我们可以通过”对象.属性”的方式,对对象的属性进行赋值。这里,赋值操作要受到 属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setLegs())

同时,我们需要避免用户再使用”对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private). –>此时,针对于属性就体现了封装性。

二、封装性的体现:

我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值 拓展:封装性的体现:① 如上 ② 不对外暴露的私有的方法 ③ 单例模式 …

三、封装性的体现,需要权限修饰符来配合。

1.Java规定的4种权限(从小到大排列):private、缺省、protected 、public
2.4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
3.具体的,4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类修饰类的话,只能使用:缺省、public

总结封装性:Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。

5 类的结构 构造器

类的结构之三:构造器(或构造方法、constructor)的使用 construct:建设、建造。 construction:CCB constructor:建设者

一、构造器的作用:

1.创建对象
2.初始化对象的信息

二、说明:

1.如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
2.定义构造器的格式:权限修饰符 类名(形参列表){}
3.一个类中定义的多个构造器,彼此构成重载
4.一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器
5.一个类中,至少会有一个构造器。

总结:属性赋值的先后顺序

① 默认初始化
② 显式初始化
③ 构造器中初始化

④ 通过”对象.方法” 或 “对象.属性”的方式,赋值

以上操作的先后顺序:① - ② - ③ - ④

JavaBean是一种Java语言写成的可重用组件。

所谓JavaBean,是指符合如下标准的Java类:
    >类是公共的
    >有一个无参的公共的构造器
    >有属性,且有对应的get、set方法

6 关键字 this

this关键字的使用:

  • this可以用来修饰、调用:属性、方法、构造器

  • this修饰属性和方法:

    this理解为:当前对象  或 当前正在创建的对象
    • 2.1 在类的方法中,我们可以使用”this.属性”或”this.方法”的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略”this.”。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式 的使用”this.变量”的方式,表明此变量是属性,而非形参。
    • 2.2 在类的构造器中,我们可以使用”this.属性”或”this.方法”的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都选择省略”this.”。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用”this.变量”的方式,表明此变量是属性,而非形参。
  • this调用构造器

    ① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
    ② 构造器中不能通过"this(形参列表)"方式调用自己
    ③ 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"
    ④ 规定:"this(形参列表)"必须声明在当前构造器的首行
    ⑤ 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器

7 关键字 package/import

一、package关键字的使用

1.为了更好的实现项目中类的管理,提供包的概念
2.使用package声明类或接口所属的包,声明在源文件的首行
3.包,属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”
4.每”.”一次,就代表一层文件目录。

补充:同一个包下,不能命名同名的接口、类。
不同的包下,可以命名同名的接口、类。

二、import关键字的使用

import:导入

  1. 在源文件中显式的使用import结构导入指定包下的类、接口

  2. 声明在包的声明和类的声明之间

  3. 如果需要导入多个结构,则并列写出即可

  4. 可以使用”xxx.”的方式,表示可以导入xxx包下的所有结构

  5. 如果使用的类或接口是java.lang包下定义的,则可以省略import结构

  6. 如果使用的类或接口是本包下定义的,则可以省略import结构

  7. 如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示。

  8. 使用”xxx.”方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显式导入

  9. import static:导入指定类或接口中的静态结构:属性或方法。