面向对象编程(上)——第一部分

上一篇:java数组


4. 面向对象编程(上)

4.1 面向过程和面向对象

1. 面向过程(POP) 与 面向对象(OOP)
  • 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做
  • 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
2. 面向对象的三大特征
  • 封装 (Encapsulation)
  • 继承 (Inheritance)
  • 多态 (Polymorphism)
3. 对比例子——人把大象装进冰箱

面向对象编程(上)——第一部分_第1张图片

4. 面向对象的思想概述
  • 程序员从面向过程的执行者转化成了面向对象的指挥者
  • 面向对象分析方法分析问题的思路和步骤:
    • 根据问题需要,选择问题所针对的现实世界中的实体
    • 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类
    • 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
    • 类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。

4.2 Java语言的基本元素: 类和对象

1. 面向对象的思想概述
  • 类(Class)和对象(Object)是面向对象的核心概念。

    • 类:对一类事物的描述,是抽象的、概念上的定义
    • 对象:实际存在的该类事物的每个个体,因而也称为实例(instance)。

    以人举例则可以理解为:类 = 抽象概念的人;对象 = 实实在在的某个人

  • “万事万物皆对象”

  • 面向对象程序设计的重点是类的设计

  • 类的设计,其实就是类的成员的设计

2. Java类及类的成员
  • 属性:对应类中的成员变量;Field = 成员变量 = 属性 = 域、字段
  • 行为:对应类中的成员方法;Method = (成员)方法 = 行为 = 函数
3. 类的语法格式

修饰符 class 类名 {

​ 属性声明;

​ 方法声明;

}

说明

  • 修饰符public:类可以被任意访问
  • 类的正文要用{ }括起来

例子

public class Person {
     
    private int age ; //声明私有变量 age
    
    public void showAge(int i) {
      //声明方法showAge( )
    	age = i;
	}
}
4. 创建Java自定义类

步骤

  1. 定义类(考虑修饰符、类名)
  2. 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
  3. 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)

4.3 对象的创建和使用

  • 创建对象语法类名 对象名 = new 类名();
  • 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
1. 步骤
  1. 创建类,设计类的成员
  2. 创建类的对象
  3. 通过“对象.属性”或“对象.方法”调用对象的结构
2. 例子
public class Animal {
     
    public int legs;
    public void eat(){
     
    	System.out.println(Eating.);
    }
    public viod move(){
     
    	System.out.println(Move.);
    }
}

public class Zoo{
     
    public static void main(String args[]){
     
        //创建对象
        Animal xb=new Animal();
        xb.legs=4;//访问属性
        System.out.println(xb.legs);
        xb.eat();//访问方法
        xb.move();//访问方法
    }
}

说明

如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。(非static的)

public class Zoo {
     
    public static void main(String args[]) {
     
        Animal xb = new Animal();
        Animal xh = new Animal();
        xb.legs = 4;
        xh.legs = 0;
        System.out.println(xb.legs); // 4
        System.out.println(xh.legs); // 0
        xb.legs = 2;
        System.out.println(xb.legs); // 2
        System.out.println(xh.legs); // 0
    }
}
3. 类的访问机制:
  • 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(例外:static方法访问非static,编译不通过。
  • 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
4. 对象的内存解析

JVM内存结构

面向对象编程(上)——第一部分_第2张图片

  • 堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在 Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
  • 通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、 char 、 short 、 int 、 float 、 long 、 double)、对象引用(reference类型, 它不等同于对象本身,是对象在堆内 存的首地址)。 方法执行完,自动释放。
  • 方法区(Method Area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

对象的内存解析

面向对象编程(上)——第一部分_第3张图片

分析:(根据右上角代码)

  1. 根据new的对象在堆中开辟一块空间用于存放该对象的信息,并对对象中的属性根据类型进行初始化。即1的部分
  2. 在栈中创建一个变量并让其指向堆中的对象首地址。即2的部分
  3. 根据赋值情况将对象中的属性值修改为相应的值。即3的部分
  4. 再次根据new的对象在堆中开辟一块新的空间用于存放对象的信息,即4的部分
  5. 在栈中创建一个变量让其指向该对象,即5的部分
  6. 将a1赋值给a3即将a1指向的地址给了a3,因此让a3指向a1所指向的地址,即6的部分
  7. 根据赋值情况重新修改属性的值

其中1,2步对应代码第一行,第3步对应代码第2行,4,5步对应代码第三行,第6步对应代码第5行,第7步对应代码第6行

5. 匿名对象
  • 我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。

    如:new Animal().eat();

  • 使用情况

    • 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
    • 我们经常将匿名对象作为实参传递给一个方法调用。

4.4 类的成员之一:属性(field)

1. 语法格式

修饰符 数据类型 属性名 = 初始化值;

说明

  1. 修饰符

    常用的权限修饰符有:private、缺省、protected、public

    其他修饰符:static、final

  2. 数据类型

    任何基本数据类型(如int、Boolean) 或 任何引用数据类型。

  3. 属性名

    属于标识符,符合命名规则和规范即可。

例子

public class Person{
     
    private int age; //声明private变量 age
    public String name =Lila; //声明public变量 name
}
2. 变量的分类
  • 在方法体外,类体内声明的变量称为成员变量。
  • 在方法体内部声明的变量称为局部变量。

所有变量

  • 成员变量
    • 实例变量(不以static修饰)
    • 类变量(以static修饰)
  • 局部变量
    • 形参(方法、构造器中定义的变量)
    • 方法局部变量(在方法内定义)
    • 代码块局部变量(在代码块内定义)

注意:二者在初始化值方面的异同:

  • 同:都有生命周期
  • 异:局部变量除形参外,均需显式初始化。
3. 成员变量(属性)和局部变量的对比

相同点

  • 定义变量的格式:数据类型 变量名 = 变量值
  • 先声明,后使用
  • 变量都有其对应的作用域

不同点

成员变量 局部变量
声明的位置 直接声明在类中 方法形参或内部、代码块内、构造器内等
修饰符 private、public、static、final等 不能用权限修饰符修饰,可以用final修饰
初始化值 有默认初始化值 没有默认初始化值,必须显式赋值,方可使用
内存加载位置 堆空间 或 静态域内 栈空间
4. 对象属性的默认初始化赋值
成员变量类型 初始值
byte 0
short 0
int 0
long 0L
float 0.0F
double 0.0
char 0或\u0000(表现为空)
boolean false
引用数据类型 null

4.5 类的成员之二: 方法(method)

1. 方法的定义
  • 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
  • 将功能封装为方法的目的是,可以实现代码重用,简化代码。
  • Java里的方法不能独立存在,所有的方法必须定义在类里。
2. 方法的声明格式

修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, …){ 方法体程序代码 return 返回值; }

说明

  • 修饰符:public,缺省,private, protected等
  • 返回值类型:
    • 没有返回值:void。
    • 有返回值,声明出返回值的类型。与方法体中“return 返回值”搭配使用
  • 方法名:属于标识符,命名时遵循标识符命名规则和规范,“见名知意”
  • 形参列表:可以包含零个,一个或多个参数。多个参数时,中间用“,”隔开
  • 返回值:方法在执行完毕后返还给调用它的程序的数据。

例子

public class Person{
     
    private int age;
    public int getAge() {
      //声明方法getAge()
    	return age; 
    }
    public void setAge(int i) {
      //声明方法setAge
    	age = i; //将参数i的值赋给类的成员变量age
    }
}

3. return关键字的使用
  • 使用范围:使用在方法体中

  • 作用:

    ① 结束方法

    ② 针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据。

  • 注意点:return关键字后面不可以声明执行语句。

4. 方法的其他注意事项
  • 方法被调用一次,就会执行一次
  • 没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可以不必使用return语句。如果使用,仅用来结束方法。
  • 定义方法时,方法的结果应该返回给调用者,交由调用者处理。
  • 方法中只能调用方法或属性,不可以在方法内部定义方法。特殊的:方法A中又调用了方法A:递归方法。

下一篇:面向对象编程(上)——第二部分

你可能感兴趣的:(Java知识体系,#,Java基础,java,编程语言,面向对象编程)