面向过程与面向对象(一)
面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。
区别是:
面向过程是从微观角度去分析问题(执行者)
面向对象是从宏观角度去分析问题(设计者)
类与对象
理解类与对象
类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。我们要造一个汽车,怎么样造?类就是这个图纸,规定了汽车的详细信息,然后根据图纸将汽车造出来。类可以看成一类对象的模板,对象可以看成该类的一个具体实例。类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性、方法。
类:我们叫做class。 对象:我们叫做Object,instance(实例)。
定义类与创建对象
对于一个类来说,一般有三种常见的成员:属性field、方法method、构造器constructor。这三种成员都可以定义零个或多个。
* 1成员变量 用于模拟属性
* 2成员方法 用于模拟行为
* 3构造方法/构造器 帮助我们初始化对象
属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。
在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
属性定义格式:
[修饰符] 属性类型 属性名 = [默认值] ;
数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0.0 |
字符型 | ‘\u0000’ |
布尔型 | false |
所有引用类型 | null |
方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。
方法定义格式:
[修饰符] 方法返回值类型 方法名(形参列表) {
// n条语句
}
void代表没有返回值;方法的作用:重用代码,封装功能,便于修改。
Code examples: 定义person类,模拟人的行为:吃饭工作和休息。
public class Person {
//定义属性
String name;
int age;
String address;
//定义方法
public void eat(String food){
System.out.println(name+"正在"+address+"吃"+food);
}
public void rest(){
System.out.println(age+"岁的"+name+"正在睡觉");
}
public void work(){
System.out.println(name+"正在敲代码");
}
}
public class Test {
public static void main(String[] args) {
Person person=new Person(); //实例化(创建对象)
person.name="老八"; //初始化
person.age=34;
person.address="葫芦岛";
//调用方法
person.eat("秘制小汉堡");
person.rest();
person.work();
}
}
局部变量与成员变量
类中定义的变量是成员变量,而方法中定义的变量,包括方法的参数,代码块中定义的变量被称为局部变量。两个的区别主要表现在以下几方面:
成员变量 | 局部变量 | |
---|---|---|
代码中位置不同 | 类中定义的变量 | 方法或代码块中定义的变量 |
内存中位置不同 | 堆内存 | 栈内存 |
是否有默认值 | 有 | 没有 |
代码作用范围(空间)不同 | 当前类的方法 | 当前一个方法或代码块 |
作用时间不同 | 当前对象从创建到销毁 | 定义变量到所属方法或代码块执行完毕 |
构造方法及其重载
构造方法(constructor)也叫构造器,用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。
声明格式:
[修饰符] 类名 (形参列表){
//n条语句
}
构造方法的几个要点:
- 构造方法的方法名必须和类名一致!
- 构造方法通过new关键字调用!
- 构造方法虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
- 当我们不定义构造方法,JAVA会默认给我们提供一个参数缺省的构造方法, 当我们自己定义了构造方法,JAVA提供的构造方法会被覆盖。
- 构造方法一般写两个,一个有参构造,一个无参构造。
- 构造方法也是方法,只不过有特殊的作用而已。与普通方法一样,构造方法也可以重载。
对象的创建完全是由构造方法实现的吗?
不完全是。构造方法是创建Java对象重要途径,通过new关键字调用构造器时,构造器也确实返回了该类对象,但这个对象并不是完全由构造器负责创建的。创建一个对象分为如下四步:
- 分配对象空间,对象成员变量初始化为0或空
- 执行属性值的显示初始化(变量初始化为0或空)
- 执行构造方法
- 返回对象的地址给相关的变量
public class Person {
String name;
int age;
String address;
public Person() { //无参构造
}
public Person(String name, int age, String address) { //有参构造
this.name = name;
this.age = age;
this.address = address;
}
}
public class Test {
public static void main(String[] args) {
Person person=new Person("彦祖",40,"加利福尼亚");//用构造器实例化对象
}
this关键字
this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。
this最常的用法:
- 调用成员变量:如果成员变量和局部变量同名,this必须书写,用来区分两者;如果没有同名的局部变量,this可以不写。
- 调用成员方法:这种情况下,this可以省略。
- 调用构造方法:使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
- this不能用于static方法中。
使用this关键字区分成员变量和局部变量
public Dog(String type,String gender,String color,int month){
/*在方法中 出现了和成员变量同名的局部变量
* 在当前方法中,使用变量时,会优先使用方法内部的局部变量
* 如果当前方法中成员变量和局部变量的名称不同, this.可以省略不写
* */
this.type=type;
this.gender=gender;
this.color=color;
this.month=month;
System.out.println("Dog 类的构造方法执行了");
}
构造方法可以调用当前类的其他构造方法 通过this()的形式:
/*
* 构造方法之间是可以调用的 但是不能使用方法名,要是使用this
* 调用其他构造方法的代码必须是头一行代码
* */
public Dog(String type,String gender,String color,int month){
this(type,gender);
this.color=color;
this.month=month;
System.out.println("Dog 类的构造方法执行了");
}
//定义一个构造方法,专门用于初始化 type属性和 gender属性
public Dog(String type,String gender){
this.type=type;
this.gender=gender;
}
//无参构造
public Dog(){
}
方法的调用
java中的数据类型
- 基本数据类型 8个
- 引用类型 类和对象 数组 接口 抽象类 枚举 … …
方法调是Java开发中的基本操作。理解方法调用的内存分配过程,实参形参的传递过程非常必要。方法参数分为基本数据类型和引用数据类型两种,传递参数有着实质的区别。
实参给形参传递数据有两种方式
- 按值传递 参数为基本数据类型
- 按引(地址)用传递 参数为引用类型