Java 面向对象编程基础详解(一)
目录
一、面向对象编程概述
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,与面向过程编程(Procedure-Oriented Programming,POP)相对。Java 是一种完全面向对象的编程语言,其核心是类和对象。
(一)面向对象编程的特点
- 封装:将数据和操作封装在类中,通过访问修饰符控制对数据的访问。
- 继承:子类继承父类的属性和方法,实现代码复用。
- 多态:同一操作作用于不同的对象可以有不同的表现形式。
(二)Java 中的面向对象编程元素
- 类及类的成员:属性(成员变量)、方法、构造器、代码块、内部类。
- 关键字:this、super、package、import、static、final、interface 等。
二、类和对象
类是属性和行为的集合,对象是类的实例化。
(一)类的设计
- 属性:该类事物的状态信息,对应类中的成员变量。
- 行为:该类事物要做的操作,对应类中的成员方法。
(二)类的实例化
格式:类类型 对象名 = new 创建的对象实体。例如:Phone p1 = new Phone();
。
(三)面向对象完成具体功能的操作三步骤
- 创建类,设计类的内部成员(属性和方法)。
- 创建类的对象。
- 通过对象,调用其内部声明的属性和方法,完成相关的功能。
三、内存解析
(一)对象在内存中的分配
涉及到的内存结构有栈、堆和方法区。
- 栈:存储方法内定义的变量。
- 堆:存储 new 出来的对象实体,包括对象的属性。
- 方法区:存放类的模板。
(二)类中对象的内存解析
- 创建一个类的对象:只要没有 new 就是没有开创内存空间。
- 创建多个对象:每个对象都在堆中占据独立的空间,拥有自己的属性副本。
四、成员变量和局部变量
(一)变量的分类
- 按照数据类型:基本数据类型和引用数据类型。
- 按照在类中声明的位置:成员变量(属性)和局部变量(方法内声明的变量)。
(二)相同点
- 声明的格式相同:数据类型 变量名 = 变量值。
- 变量都有其作用域。
- 变量必须先声明再赋值后使用。
(三)不同点
- 类中声明的位置不同:
- 属性:声明在类内,方法外的变量。
- 局部变量:声明在方法、构造器内部的变量。
- 在内存中分配的位置不同:
- 属性:随着对象的创建,存储在堆中。
- 局部变量:存储在栈空间中。
- 生命周期不同:
- 属性:随着对象的创建而创建,随着对象的消失而消失。
- 局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配。随着方法对应的栈帧出栈,局部变量消亡。
- 作用域不同:
- 属性:在整个类中有效。
- 局部变量:仅仅限于局部变量所在的方法中。
- 是否可以有权限修饰符进行修饰:
- 属性是可以的,局部变量是不可以的。
- 是否有默认值:
- 属性都有默认值。
- 局部变量都没有默认初始化值。
五、方法
(一)使用方法的好处
方法是类或对象行为特征的抽象,用来完成某个功能操作。将功能封装为方法的目的是可以实现代码重用,减少代码冗余。
(二)使用举例
Math.random()
中的random()
方法和System.out.println()
中的println()
方法。
(三)声明举例
class Person{
//属性
String name;
int age;
char gender;
//方法
public void eat(){
System.out.println("人吃饭");
}
}
方法声明的格式:权限修饰符【其他修饰符】返回值类型 方法名(形参列表){// 方法体}。
(四)方法声明的细节
- 权限修饰符:Java 规定了 private、缺省、protected、public 等权限修饰符。
- 返回值类型:
- 无返回值类型:void,比如
System.out.println()
中的println()
方法。 - 有返回值类型:可以是基本数据类型,也可以是引用数据类型。需要在方法内配合使用 return + 返回值类型的变量或常量。
- return 的作用:
- 结束一个方法。
- 结束一个方法的同时可以返回数据给方法的调用者。
- 无返回值类型:void,比如
- 方法名:属于标识符,需要满足标识符的规定和规范,见名知意。
- 形参列表:形参属于局部变量,可以声明多个。
- 无形参列表:不能省略()。
- 有形参列表:根据方法调用时需要的形参个数,确定形参的类型和个数。
注意:Java 里的方法不能独立存在,所有的方法必须定义在类中。Java 中的方法不调用不执行,调用一次执行一次。方法内可以调用本类中的其他方法或属性,方法内不能定义方法。
(五)形参和实参
- 形参:方法在声明时,一对()内声明的一个或多个形式参数。
- 实参:方法在调用时,实际传递给形参的变量或常量,就是实参。
六、补充知识点和案例
(一)面向对象编程的优势
- 提高代码的可维护性:封装使得代码的修改更加集中,减少了对其他部分的影响。
- 增强代码的可扩展性:通过继承和多态,可以方便地扩展现有代码。
- 提高代码的复用性:将通用的功能封装成方法,减少重复代码。
(二)案例:汽车类的设计
- 定义汽车类
Car
,包含属性如品牌、颜色、速度等,以及方法如加速、减速、停车等。
class Car {
String brand;
String color;
int speed;
public void accelerate() {
speed++;
System.out.println("汽车加速,当前速度为:" + speed);
}
public void decelerate() {
if (speed > 0) {
speed--;
System.out.println("汽车减速,当前速度为:" + speed);
}
}
public void stop() {
speed = 0;
System.out.println("汽车停车");
}
}
- 使用汽车类创建对象并调用方法。
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.brand = "丰田";
myCar.color = "黑色";
myCar.accelerate();
myCar.accelerate();
myCar.decelerate();
myCar.stop();
}
}