一.面向对象介绍
-
面向对象并不是一种技术,而是一种编程指导思想
-
把现实世界的具体事物全部看成一个一个的对象来解决问题
- 面向就是拿或者找的意思,对象就是东西的意思。
- 面向对象编程就是拿或找东西过来编程。
- 面向对象其实就是写程序的套路。
面向对象主要就学两个东西:
- 如何使用别人已经写好的东西
- 我们自己如何设计一个类
二.为什么要用面向对象编程
-
生活中我们解决问题就是按照对象化的方式进行的
-
如果程序也能按照生活中的方式来解决问题,那么程序就更符合人类的思维习惯,代码看起来会更容易理解,更简单
三.面向对象编程的指导思想、优点小结
- 在程序中也把现实世界的具体事物全部看成一个一个的对象来解决问题
- 按照面向对象编程来设计程序,程序代码符合人类思维习惯,更易理解,更简单
四.什么是类和对象
-
类(设计图) : 是对象共同特征的描述,对具有相同特征和作用的对象的抽象
-
对象 : 是真实存在的具体实例,任何一个具体的事物或者物体就是一个对象
-
结论 : 在Java中,必须先设计类,才能创建对象并使用
如何定义类?
- 类中可以定义的5大成分:成员变量、构造器、成员方法、代码块、内部类。
public class 类名{
1.成员变量Field(代表属性,一般是名词):描述类或对象的属性信息,如:姓名、年龄
2.成员方法Method(代表行为,一般是动词):描述类或对象的行为的,如:唱歌、吃饭、买票
3.构造器Constructor:初始化一个类的对象并返回。
4.代码块
5.内部类
}
public class Car {
// 属性(成员变量)
String name;
double price;
// 方法(行为)
public void start(){
}
public void run(){
}
}
如何得到类的对象?
类名 对象名 = new 类名();
Car c = new Car();
如何使用对象?
- 访问属性:对象名.成员变量
- 访问行为:对象名.方法名(...)
1.定义类的注意事项?
-
类名首字母建议大写,英文且有意义,满足驼峰模式,不能用关键字,满足标识符规定。
-
一个代码/Java文件中可以有多个class类,但是只能有一个类是public修饰的,public修饰的类名必须是Java代码的文件名称。
-
按照规范:实际开发中建议一个Java文件只定义一个类。
2.成员变量的格式是什么样的,有什么特点?
-
成员变量的完整定义格式是 : 修饰符 数据类型 变量名/属性名/数据名 = 初始化值;
-
一般无需指定初始化值,存在默认值。
3.对象的成员变量的默认值规则
4.成员变量、局部变量区别
五.对象内存图
1.多个对象的内存图
- 引用类型的变量存的是对象在堆内存当中的地址,并且是十六进制的地址。
- 方法是放在方法区的,调用时被提取到栈内存里面去运行
- 引用类型的变量根据地址找到在堆内存中的对象,再根据方法的引用地址找到存在于方法区中的方法
- 变量是在栈内存,对象以及对象的属性空间存在于堆内存。因为属性是存在于对象里面的
1.对象放在哪个位置?
- 堆内存中
2.Car c = new Car( );c变量名中存储的是什么?
- 存储的是对象在堆内存中的地址。
3.成员变量(name、price)的数据放在哪里,存在于哪个位置?
- 放在对象中,存在于堆内存中。
2.两个变量指向同一个对象内存图
3.垃圾回收
- 注意:当堆内存中的类对象或数组对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
- Java存在自动垃圾回收器,会定期进行清理。
六.封装
1.封装
- 面向对象的三大特征:封装,继承,多态
- 封装:就是告诉我们,如何正确设计对象的属性及方法
- 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
- 人画圆这个圆不是人画的,而是圆自己画的,人只是调用了圆的方法去画了一个圆而已。
- 人关门,这个门一定是自己关的。
2.封装的实现步骤
- 一般对成员变量使用private(私有)关键字修饰进行隐藏,private修饰后该成员变量就只能在当前类中访问。被private修饰的成员只能在本类中才可以访问。
- 提供public修饰的公开的getter,setter方法暴露其取值和赋值。
- 通过set方法设置属性/初始化属性,通过get方法获取属性。
- 使代码变得安全,健壮,优雅
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.封装的好处
- 加强了程序代码的安全性
- 适当的封装可以提高开发效率,同时可以让程序更容易理解与维护。
- 让编程变得很简单,有什么事,找对象,调方法就行。
七. 方法的参数传递机制
- 无论是基本数据类型的参数还是引用数据类型的参数,都是满足值传递。
- 基本类型的参数传输的是存储的数据值,引用类型的参数传输的是存储的地址值。
6.1 基本类型的参数传递
package com.method.param;
public class MethodDemo1 {
public static void main(String[] args) {
// 目标:理解Java的基本类型的参数传递:值传递
int a = 10; //这里的a是实参变量a
change(a); //本质是change(10);
System.out.println(a); //10
}
/**
* @param a 实参跟形参两个没有啥关系
*/
public static void change(int a){ //这里的a是方法的形参变量a,形参它是用来接数据的
System.out.println(a); // 10
a = 20;
System.out.println(a); // 20
}
}
6.2 引用类型的参数传递
package com.method.param;
public class MethodDemo2 {
public static void main(String[] args) {
// 目标:理解引用类型的参数传递机制:值传递,区分其不同点,只不过这里传的是地址值
int [] arrs = {10, 20, 30};
change(arrs); //传的是数组地址的值
System.out.println(arrs[1]); //222
}
public static void change(int[] arrs){
System.out.println(arrs[1]); //20
arrs[1] = 222;
System.out.println(arrs[1]); // 222
}
}