面向过程的结构化程序设计的弊端:1.缺乏对数据的封装;2.数据和方法的分离。
1.面向对象
1)什么是抽象数据类型
将不同类型的数据的集合组成一个整体用来描述一种新的事物。
2)什么是类
- 类定义了一种抽象数据类型
- 类不但定义了抽象数据类型的组成(成员变量),同时还定义了可以对该类型实施的操作(方法)
3)成员变量和方法
类中可以包含成员变量和方法;
- 成员变量:所有对象所共有的属性/特征
- 方法:所有对象所共有的行为
案例1:创建一个员工类
Emp{
String name;
char gender;
int age;
double salary;
}
在这个示例中,定义了Emp类型的组成,其中(name、gender、age、salary)这些变量成为成员变量。name用来存放员工的姓名、gender用来存放员工的性别、age用来存放员工的年龄、salary用来存放员工的工资。
定义了Emp类后,提高了代码的模块化以及代码的复用性,但依然存在问题,如:打印信息的方法只能针对Emp数据操作,属于Emp自身的方法,需要实现数据和方法(对该类型数据的操作)的统一。
4)成员变量初始化
- 对象创建后,其成员变量可以按照默认的方式初始化
- 初始化对象成员变量时,其默认值的规则如下表
成员变量类型 | 默认初始值 |
byte、short、int、long、float、double | 0 |
boolean型 | false |
char型 | /u0000 |
引用类型 | null |
5)定义类的方法
方法是用于描述对象的行为,封装对象的功能。
一个包含成员变量和方法的类语法:
class 类名{
成员变量类型 成员变量;
修饰词 返回值类型 方法名(参数列表){
方法体;
}
...
}
6)创建对象
- 类定义完成后,可以使用new关键字创建对象,创建对象的过程通常成为实例化
- new运算的语法:new 类名();
案例2:创建一个员工对象
public class Test {
public static void main(String[] args) {
Emp e = new Emp();
}
}
7)引用类型变量
- 为了能够对实例化的对象进行访问控制,需要使用一个特殊的变量——引用(如上例中的e)
- 引用类型变量可以存放该类对象的地址信息,通常成为“指向该类的对象”;当一个引用类型变量指向该类的对象时,就可以通过这个变量对对象实施访问。
- 除8种基本类型之外,用类、接口、数组等声明的变量都称之为引用类型变量,简称“引用”。
8)访问对象的成员变量、调用方法
可以通过引用访问对象的成员变量或调用方法
public class Test {
public static void main(String[] args) {
Emp e = new Emp();
e.name = "Tom";
e.gender = '男';
e.age = 29;
e.salary = 5000;
}
}
9)引用类型变量的赋值
- 引用类型变量存储的是对象的地址信息,相同类型的引用类型变量之间也可以相互赋值
- 引用类型变量之间的复制不会创建新的对象,但有可能会使两个以上的引用指向同一个对象
案例3:引用类型之间赋值
public class Test {
public static void main(String[] args) {
Emp e = new Emp();
e.name = "Tom";
e.gender = '男';
e.age = 29;
e.salary = 5000;
System.out.println(e.name); //Tom
Emp f = e;
f.name = "Jerry";
System.out.println(e.name); //Jerry
}
}
由上例可以发现,引用类型之间的赋值与基本类型之间的赋值不一样,引用类型之间赋值(画“=”号)指向同一个对象,对一个引用的修改会影响另一个引用。
10)null
- 对于引用类型变量,可以对其赋值为null,null的含义为“空”,表示还没有指向任何对象
- 当一个引用的值为null时,如果通过引用访问对象成员变量或者调用方法是不合逻辑的,此时会产生NullPointerException空指针异常
案例4:创建一个引用赋值为null
public class Test {
public static void main(String[] args) {
Emp e = null;
e.name = "Tom";
System.out.println(e.name);
}
}
/*
运行结果:
Exception in thread "main" java.lang.NullPointerException
at test.Test.main(Test.java:8)
*/
案例5:类的演示
要求:创建一个员工类,定义成员变量包含name、gender、age、salary, 定义方法打印员工的信息,创建两个员工对象并打印出信息。
public class Emp {
//定义成员变量
String name;
char gender;
int age;
double salary;
public void empPrint(){ //定义方法打印员工信息
System.out.println("姓名:"+name+"性别:"+gender+"年龄:"+age+"薪资:"+salary);
}
public static void main(String[] args) {
Emp e = new Emp();
e.name = "Tom";
e.gender = '男';
e.age = 29;
e.salary = 5000;
e.empPrint(); //调用方法打印员工信息
Emp ee = new Emp();
ee.name = "Jerry";
ee.gender = '女';
ee.age = 25;
ee.salary = 6000;
ee.empPrint();
}
}
/*
运行结果:
姓名:Tom性别:男年龄:29薪资:5000.0
姓名:Jerry性别:女年龄:25薪资:6000.0
*/