一、面向对象基本概念
- 面向对象:面向对象程序设计是是一种基于对象概念的软件开发方法。面向对象三大特征:封装、继承和多态。
- 对象:在面向对象的世界中认为万事万物皆对象。认识对象过程中从两个方面,一是对象有什么状态,二是对象有什么行为。对象的状态是指对象有什么属性,对象的行为是指对象有什么行为。对象的简单理解就是真实存在的具体的个体。
- 类:类是具有相同的状态和相同行为的一组对象的集合。类是对象的模板,对象是类的具体实例。
- 类和对象的关系:类是多个对象综合抽象的结果,对象是类的实例化。
1、定义类
类是由字段和方法构成的,字段就是对象的属性,方法就是对象的行为。
面向对象设计的过程就是抽象的过程,也就是设计类的过程,一般分为三步:
- 发现类,类定义了对象将会拥有的特性(字段)和行为(方法)。
- 发现类的字段,对象所拥有的特性在类中表示为类的字段。
- 发现类的方法,对象执行的操作称为类的方法。
1.1 定义类
定义类的语法格式如下:
public class Person {
//类中的属性和方法
}
- 访问修饰符public、private是可选的。
- class 是声明类的关键字。
- 按照命名规范,类名应使用帕斯卡命名法,首字母大写。
1.2 类的字段
定义字段的语法格式如下:
-[访问修饰符] 数据类型 字段名;
1)访问修饰符是可选的。
2)除访问修饰符外,其他部分与定义变量相同。
1.3 类的方法
在”人“类中定义”工作“的方法,用于描述人的行为。
public class Person{ //定义人类
public String name; // 定义人的名字
public String gender; // 定义人的性别
public int age; // 定义人的年龄
//定义工作方法
public void work() {
System.out.println(this.name + "的工作理念是:让老板挣大钱")
}
}
2、创建和使用对象
2.1 创建对象
一个对象称为类的一个实例,是类一次实例化的结果。
类的对象可以可以调用类中的成员。
Person person = new Person();
- 使用new 运算符实例化了一个person对象。
- 实例化的结果是产生了一个Person类的实例,这个实例的名称是 person。
- 创建对象就是定义了一个新的变量,变量名就是对象名,变量的类型就是被实例化的类。
2.2 使用对象
在Java中,要使用对象的字段和方法,需要使用成员运算符“.”。
使用对象的语法格式如下:
对象名.属性 //引用对象的字段 对象名.方法名() //引用对象的方法
为对象的属性赋值,调用对象的方法。
public class Person {
public String name;
public String gender;
public int age;
public void work (){
System.out.println(this.name + "的工作理念:让老板挣大钱!")
}
public static void main (String [] args){
Person person = new Person();
person.name = "songjiang";
person.gender = "男";
person.age = 18;
person.work();
}
}
二、对象的构造和初始化
在new运算符使用时,我们需要调用这个类的构造函数。调用构造函数(构造方法)时,步骤如下:
- 分配新对象的空间,并进行默认的初始化。在Java中,这两部是不可分的,从而可确保不会有没有初值的对象。
- 执行显式的成员初始化。
- 执行构造方法,构造方法是一种特殊的方法。
1、成员变量
1.1 成员变量的作用域
类中的字段是直接定义在类的内部、方法的外部的变量,称为成员变量。成员变量的作用域是整个类。当定义一个成员变量时可以选择在定义时进行初始化。
public class Person{
public String name; //定义姓名字段
public String gender = "男"; //定义性别字段
public int age; //定义年龄字段
public void work() {
int age = 0;
}
public void eat (String name){
}
}
1.2 显示成员初始化
如果在成员说明中写有简单的赋值表达式,就可以在构造对象时,进行显式的成员初始化。
显式成员初始化如下:
public class Initialized{
private int x = 5;
private String name = "喵星人";
private double weight = 45.8;
}
1.3 局部变量的作用域
局部变量就是定义在方法内部的变量。局部变量只能在方法内部使用。局部变量在使用之前必须初始化。
1.4 成员变量和局部变量之间的区别
- 作用域不同。局部变量的作用域只限于定义它的方法,在该方法外无法被访问。成员变量的作用域是在整个类中所有的成员方法都可以访问它如果访问权限允许还可以在类外部使用成员变量。
- 初始值不同。对于成员变量,如果在类定义时没有给它赋予初始值,Java会给它赋一个默认值。但是Java不会给局部变量赋初始值,因此局部变量在使用前必须初始化。
- 在同一个方法中不能有同名的局部变量,在不同的方法中可以有同名的局部变量。
- 局部变量可以和成员变量同名,但局部变量在使用时有更高的优先级。
1.5 按值传递
在Java中方法调用采用按值传递的方式。参数(形参)是在方法定义中声明的变量,用于接收传递给方法的值,而是参则是在方法调用时传给方法的值。
当对象实例作为参数传递给方法时实际传递的是对象引用的副本。这意味着方法内部的对参数的修改不会改变原始对象引用的指向,但可以修改所指向对象的内容。当方法返回时,对对象内容的修改是可见的。
2、构造方法
在Java中当创建一个对象时,会自动调用该类的构造方法。构造方法分为默认构造方法和自定义构造方法。在使用new 关键字时会自动调用。
2.1 构造方法的定义
构造方法的作用是为成员变量的初始化。
为Person类定义一个构造方法:
public class Person {
public String name;
public int age;
public Person(){
this.name = "喵星人";
this.age = 19;
}
}
2.2 默认的构造方法
每个类都至少有一个构造方法。如果程序员没有为类定义构造方法,系统会自动为该类生成一个默认的构造方法。默认构造方法的参数列表及方法体都为空,所生成的对象的属性值也为零或空。如果程序员定义了一个或多个构造方法,则将自动屏蔽掉默认的构造方法。
2.3 方法重载
方法重载是指在一个类中定义了多个同名的方法,但要求每个方法具有不同的参数类型或参数个数或参数顺序。
定义一个没有参数的work 方法,再定义一个有参数的work 方法,实现work方法的两次重载。
public class Person {
public String name;
public int age;
public String gender;
public void work (){
System.out.println(this.name + "的工作理念是:让老板挣大钱");
}
public void work (String content){
System.out.println(this.name + "的工作理念是:" + content);
}
}
- 方法重载的特点:
1)在同一个类中。
2)参数的个数或者类型或者顺序不同。
3)方法的返回值不能作为方法是否构成重载的依据。 - 方法重载的调用。方法重载在调用时,根据实参与形参在类型、个数、顺序一一匹配的规则调用。
- 方法重载的优点。方法重载其实是对原有方法的一种升级,可以根据参数的不同采用不同的实现方法,而且不需要编写多个名称,简化了调用方法的代码。
2.4 构造方法的重载
前面介绍了方法的重载,构造方法也可以重载,即在同一个类中可以定义多个重载构造方法。
public class Person {
public String name;
public int age;
public String gender;
// 定义无参构造
public Person() {
this.name = "宋江";
}
// 定义有参构造
public Person(String name) {
this.name = name;
}
// 无参的work 方法
public void work (){
System.out.println(this.name + "的工作理念是:让老板挣大钱");
}
// 有参的work 方法
public void work (String content){
System.out.println(this.name + "的工作理念是:" + content);
}
}
2.5 对象数组
对象数组存的是同一个类的对象。
定义包含三个对象的对象数组,数据类型是Person,使用for 循环遍历输出。
public class Person {
public String name;
public int age;
public String gender;
public Person() {
this.name = "宋江";
}
public Person(String name) {
this.name = name;
}
public void work (){
System.out.println(this.name + "的工作理念是:让老板挣大钱");
}
public void work (String content){
System.out.println(this.name + "的工作理念是:" + content);
}
}
class Main{
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "宋江";
p1.gender = "男";
p1.age = 32;
Person p2 = new Person();
p2.name = "鲁智深";
p2.gender = "男";
p2.age = 28;
Person p3 = new Person();
p3.name = "武松";
p3.gender = "男";
p3.age = 30;
Person [] people = new Person[]{
p1,
p2,
p3
};
for (int i = 0; i < 3; i++) {
System.out.println(people[i].name + ", " + people[i].gender + ", " + people[i].age);
}
}
}
运行结果如下: