【JAVA系列】第三章:①面向对象基本概念

o-O-oO / 2024-04-19 / 原文

本章学习内容

  • 面向对象基本概念 -->📍
  • 对象与引用
  • 封装与模块化
  • 对象的初始化
  • 类变量、类方法 (static关键字)
  • final关键字
  • 使用包管理类

■面向过程编程:

  • Procedural Programming
  • 基于过程调用的编程范式,如c语言

■面向对象编程:

  • OOP(Object-Oriented Program)
  • 基于对象的编程范式
  • 程序设计基于类与对象

面向过程与面向对象对比:
■任务:

  • 把猫放到盒子里

■面向过程编程思考方式:

  1. OpenBox()
  2. PutInBox(cat)
  3. CloseBox()

在c语言中,cat为存放数据的结构体。
■面向过程编程的关注点:
过程(函数)
猫又要被放到盒子里了!(以面向对象的方式)步骤:

Box box = new Box();
box.open();//变量名.方法
cat cat = new Cat();
box.putIn(cat)
box.close()

■ 面向对象编程关注点
1.先要有对象(box、cat)
2.然后调用对象的方法(方法是与对象绑定的)

小练习:
比较c语言与java语言中的Helloworld程序,有何不同?

对象

  • 对象(0bject)︰状态与行为相绑定。
  • 状态 : 对象中的字段(field)/属性
  • 行为 : 对象中的方法(method)


从上面这张图我们发现有以下关键地方值得注意:

  • 关键词:class

  • 类名:Person

  • 静态属性:

  • 动态方法:

c语言,对person建立一个结构体。里面只有静态属性。没有动态行为。

■ 状态与行为绑定的含义

    1. 不同的对象有不一样的状态。
  • 2.其方法执行结果根据状态的不同而不同。


虽然都是调用相同的方法,但是内部的结构不一样。

所以导致的方法不一样的。
虽然都是调用相同的方法,但是内部的结构不一样。

方法是和状态息息相关的。

■ 类(class)
1、对象的蓝图,是对象的抽象描述
2、通过类可以创建多个对象

  • p1、p2指向两个不同的对象,但都有属性(name、age)与方法(show)


第一个Person并不存在一个具体的对象,实际上new Person()才是新建一个对象。但是new Person()以什么为蓝本呢?

就是以

Person类为蓝本,创建各种各样的对象。这就类似于我们做蛋糕的膜具,圆形的蛋糕膜具做出来的蛋糕都是圆形的。

类只是一个模板,有了这个模板就可以创建对象

  • 使用new关键字
  • 对象的属性与方法称为实例成员实例(instance)

■ 小练习:如何抽象出类?(点我)
■ 需求:
有各种各样不同的圆形对象,这些圆形对象有着不同的半径,现希望能获得每个圆形对象的面积? 请设计这个类。

■ 声明类的步骤:
  1、取名
  2、设计属性(名词,半径(英文记得提前做功课))
  3、设计方法(动词,获得)

  • 思考:
    • 如果使用c语言怎么设计?
声明类(点我)
■  使用class关键字声明
■  命名规范
   * 类:
类名首字母大写
   * 属性:
   首字母小写
   多个单词,驼峰命名法
   * 方法:
   命名规则同属性

■  方法签名
   * 由方法名和参数类型构成

创建对象与使用(点我)
■  一个典型的Java程序会创建许多对象,对象之间通过调用方法进行互动。
  

1、使用new创建对象
Date now = new Date();
now是Date类型变量,存放Date对象的引用
2、创建对象后,就可调用其方法
String s = now.toString();
■  使用对象两部曲
1、创建对象
2、调用对象的方法

■ Java类库中常见类的使用(点我)
1、Math类

常见数学函数

2、Arrays类

操作数组的工具类,toString、sort方法

3、Random类

随机数、种子的概念

4、String、Integer

查看内部状态,与相应的方法

5、ArrayList

可以替代数组

eg1:】

eg2

eg3

eg4

eg5

指定相同的种子,每次都会产生相同的随机数。
eg6


我们说,创建一个对象,要有属性和方法。现在属性有了,方法怎么看?


比如这个有个char 数组,这就联系到c语言的char数组了。



它Integer实际上有一个专门的属性,用来存放int属性。

我们在写数组的时候,会有一些烦恼,会预先指定大小,一旦指定,就不能改变了。


这段代码是什么意思呢?我们创建了一个

ArrayList链表对象,里面存储的是string类型的对象。



它也有内部方法,它本质上也是数组。

■ 指向对象的引用--基本概念(点我)
引用类型变量
1、存放指向对象的引用,存放的不是对象本身
2、通过该引用(reference)可以找到某个对象

分析Person.Java中如下代码执行结果:

■ 指向对象的引用--null(点我)

■  引用类型变量可以为空
String str = null; //代表str不存放任何引用

小练习

string str = "abc" ;

str.charAt(1);
str = null;

str.charAt(1);//会发生什么?

■ 指向对象的引用--相等性比较(点我)
■  怎么比较两个对象否相等?
一、使用==可以吗?
String str1 = new String( "123");

String str2 = new String( "123");

system.out.println( str1 == str2);
二、使用==进行引用类型变量比较
■  比较的是:是否为同一个引用。

■  而不是对内容进行比较。

三、解决方法

调用对象的equals方法:
str1.equals(str2)



■ 方法的参数(点我)
一、java方法中参数传递总是采用:
1、值调用(call by value)
2、方法内部得到的是参数值的一个拷贝。
二、方法参数有两种类型:
1、基本数据类型
2、对象引用

1)基本数据类型变量作为方法参数:
age1中得到的age的一份值拷贝

public static void raiseAge(int age1){
age1 += 1;
}

2)调用时

double age = 200;
raiseAge( age);
System.out.println(age); //age的值不改变

age和age1没有关系,它们是不一样的变量。

1、引用数据类型变量作为方法参数

1)传递的是变量p所存放引用的一个拷贝;
2)不能改变变量p的值。


eg1】:

  • 假设有一方法:
public static void raiseAge(Person p){
p.age += 1;
}
  • 调用时
Person p = new Person( );
p.age = 10
raiseAge(p);
System.out.println(p.age);//改变了吗?
  • 传递进来的是Person类型引用的一个拷贝,不是Person对象本身。
  • 结果:改变了。

eg2】:

  • 数组也是引用类型
public static void allPlusone(int[ ] arr){
for (int i = 0; i < arr.length; i++) {
arr[i] += 1;
}
}
  • 调用时
int[] arr = {1,1,1,1,1};
allPlusone(arr);
system.out.printLn(Arrays.tostring(arr));
  • 结果:也是会改变的。
■ 方法的参数--总结❗(点我)

Java方法总是使用值调用:


⭐方法不能修改基本数据类型的方法参数
public static void add(int x){
×+=1;
}
⭐方法可以改变引用类型参数所指向的对象的状态
public static void raiseAge(Person p){
p.age += 1;
}

public static void allPlusone(int[]arr){
for (int i = e; i < arr.length; i++) {
arr[i]+= 1;
}
}


虽然我不能改变引用类型的值,但是可以改变它引用对象的值