Java基础笔记(五)面向对象
Java面向对象基础
1.回顾Java的参数传递问题
Java中只有值传递。
即无论是基本类型,还是引用类型,实际上参数传递的都是一个具体的值,在传递基本类型作为参数时,它传递的是基本类型的实际的值,且如果这个基本类型是个变量且没有赋值,它传递的都是这个基本类型变量的默认值;如果传递的是引用类型,即一个对象的实例,那么它传递的其实是这个对象实例的地址值。
基本类型:形式参数的改变不影响实际参数
引用类型:形式参数的改变直接影响实际参数
举例:
public static void main(String[] args){
//定义两个基本类型变量
int a = 10;
int b = 20;
System.out.println("a=" + a + "b=" + b); //输出ab的值分别是10和20
//调用change方法并传递a,b,这里的a,b是实际参数
change(a,b);
System.out.println("a=" + a + "b=" + b); //a,b值依旧是10和20
//因此可以看到基本类型:形式参数的改变不影响实际参数
}
public static void change(int a, int b) { // 这里a,b是形式参数
a = b;
b = a + b;
System.out.println("a=" + a + "b=" + b); //这里a是20,b是40
}
public static void main(String[] args) {
//定义一个数组,数组在java中是引用类型的,本质是一个存放基本类型的容器对象
int[] arr = {1,2,3,4,5};
System.out.println(Arrays.toString(arr));
//调用java提供的数组遍历输出方法,结果是[1, 2, 3, 4, 5]
change(arr);
System.out.println(Arrays.toString(arr));
//输出后:[1, 2, 8, 4, 5] 可以看到方法中对形式参数的改变直接影响到了实际参数数组的改变
//原因是这里传递的实际上是这个数组对象的地址值,由于实际参数和形式参数使用的是同一个地址值,所以改变的是同一个对象,如果这里重新位形式参数赋值新的引用则不会改变原来的实际参数;
}
public static void change(int[] arr) {
arr[1] = 2;
arr[2] = 8;
System.out.println(Arrays.toString(arr)); //[1, 2, 8, 4, 5]
}
2.面向对象思想
java是一门面向对象的语言。
面向对象是一种基于面向过程的编程思想,是一种更符合我们思想习惯的思想,它的特点是把复杂的事情简单化,让我们从执行者变成指挥者。面向过程注重细节的实现,而面向对象更注重宏观整体的结构和维护性;
为了更加清楚的描述面向对象和面向过程的区别,我们拿做一个五子棋举例:
对于面向过程来说:
- 开始游戏
- 绘制棋盘
- 黑子先走
- 绘制画面
- 判断输赢
- 轮到白子
- 绘制画面
- 判断输赢
- 返回步骤3
- 输出最后结果
而面向对象来说:
- 黑白双方,两方的行为是一样的
- 棋盘系统,负责绘制棋盘和画面
- 规则系统,负责判定输赢
我们发现,同样是制作一个五子棋,面向对象更注重将解决问题的步骤划分到不同的功能模块来执行,最终只要相互调用这些功能模块就可以完成整个五子棋的制作,整个系统结构看起来非常清晰,扩展性也更好,例如我们要加入悔棋的功能,对于面向对象来说,只需要改动棋盘系统回朔到上一步画面就好,而面向过程则要从输入到判断输赢到显示都有改变,无疑是很麻烦的;
尤其在更复杂的大型系统构建的时候,面向对象思想设计出来的和面向过程思想设计出来的之间的差距更甚;
需要注意的是,面向对象与面向过程并不是完全分家的,面向对象只是根据需求将一些面向过程开发的算法和数据结构封装成一个个更方便调用的对象,其具体的细节实现还是用面向过程开发的,面向对象只负责处理这些对象间的关系即可;
(1)类与对象
在面向对象中,我们常常将一些现实中的事物来抽象成一个个对象,并给这些对象赋予相应的属性和行为;
现实世界的事物(对象)
属性 事物的基本描述
行为 事物的功能
Java语言中最基本的单位是类。所以,我们要用类来体现事物;
类
成员变量 事物属性
成员方法 事物行为
类:是一组相关的属性和行为的集合。是一个抽象的概念。
对象:是该类事物的具体存在,是一个具体的实例。(对象)
举例:
我们常常将人这个整体抽象为一个类,而具体的某一个人则是该类的实例对象;
类的定义及使用
A:类的定义
成员变量 在类中,方法外。
成员方法 在类中,一般在成员变量的下方,方法之间是平级关系,不能在方法中重新定义方法;
B:使用类的内容
a:创建对象? 格式
类名 对象名 = new 类名();
b:如何使用成员变量和成员方法呢
对象名.成员变量
对象名.成员方法()
举例:
//定义一个Person类
public class Person{
//定义一个成员变量性别
String sex;
//主方法,jvm要从这里执行
public static void main(String[] args) {
//创建Person类的对象并调用,注意,如果这里调用的方法加了static则可以直接通过:类名.方法名调用,且本类的其他方法中可以直接调用;
MyTest m = new MyTest();
m.eat();
}
//再写一个成员方法
public void eat(){
System.out.println("人要吃饭");
}
}
Java程序的开发,设计和特征
A:开发:就是不断的创建对象,通过对象调用功能
B:设计:就是管理和维护对象间的关系
C:特征
a:封装
b:继承
c:多态