一 面向对象
大纲
- Java类及类的成员:属性、方法、构造器;代码块;内部类
- 三大特征:封装性、继承性、多态性(抽象性)
- 其他关键字:this、super、static、final、abstract、interface、package、import…
1 面向过程(POP) 与 面向对象(OOP)
-
面向过程(Procedure Oriented Programming):强调的是功能行为,以函数为最小单位,考虑怎么做
//C //① 把冰箱门打开 //② 把大象塞进冰箱 //③ 把冰箱门关闭 void FriOpen(){ } void EleInFri(){ } void FriClose(){ } ----------- int main(){ FriOpen(); EleInFri(); FriClose(); }
-
面向对象(Object Oriented Programming):强调的是具备了功能的对象,以类/对象为最小单位,考虑谁来做
//Java class 大象{ public static void in(){ “装进大象” } } class 冰箱{ public static void open(){ “打开冰箱门” } public static void close(){ “关闭冰箱门” } } ------------------ class TestDemo{// 人 \ 测试类 public static void main(String[] args){ 冰箱.open();//冰箱调用开门 大象.in();//大象调用进去 冰箱.close();//冰箱调用关门 } }
像这样子,在解决问题的过程中,分析出每个参与解决问题的对象(冰箱),并确定这些对象的行为(开门,装大象,关门),最终由这些对象解决问题的编程思想,被称为面向对象的编程思想(Object Oriented Programming,简称OOP)。
在面向对象编程中,这张图纸就被称为类,而按照这张图纸生产出来的一台台冰箱,则被称为类的实例或者对象,这一生产过程,就被称为类的实例化。
也许有人会问:我要这图纸有何用?我写个函数,一样可以实现这个功能,只要在需要开门的时候调用这个函数就行了,又何需考虑自动开门的冰箱怎么设计?
这个想法固然好,但问题在于,每当冰箱换个型号,我们就要因为其中的微小变动而重写一遍这个函数。
程序员从面向过程的执行者转化成了面向对象的指挥者
2 类和对象
两个要素:类(Class)、对象(Object)
-
类是对一类事物的描述,是抽象概念的定义 = 抽象概念的人
-
对象是实际存在的该类事物的每个个体 = 实实在在的人
2.1 类
- 属性(field):对应类中的成员变量
- 行为(method):对应类中的成员方法
class Person{
//属性
Sting name;
int age;
boolean isMale;
//方法
public void eat(){
----
}
public void sleep(){
----
}
public void talk(String language){
----
}
}
2.2 对象
java类的设计完成之后,就是java类的实例化,即创建类的对象(类的实例化 = 实例化类 = 创建类的对象)
public class PersonTest{
public static void main(String[] args){
//创建类的对象
Person p1 = new Person();
//调用对象的结构:属性、方法
//调用属性:“对象.属性”
p1.name = "Tome";
p1.isMale = true;
//调用方法:“对象.方法”
p1.eat();
p1.sleep();
p1.talk("----");
}
}
2.3 类和对象的使用
- 创建类,设计类的成员和方法
- 创建类的对象
- 通过“对象.属性” “对象.方法”调用对象的结构
3 赋值与复制
将p1变量保存的对象地址值赋给p2,导致p1和p2指向堆空间的同一个实体
Person p2 = p1;
Sytem.out.println(p2.name);//Tom
p2.age = 10;
Sytem.out.println(p1.age);//10
4 内存解析
5 成员变量(属性)与局部变量
5.1 声明位置不同
成员变量:类中方法外面
局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中),
即在方法内√、方法形参√、代码块内、构造器形参、构造器内部…的变量
5.2 内存位置不同
成员变量:堆内存的对象中(而static修饰的放在方法区中的静态区)
局部变量:栈内存的方法中
5.3 生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的运行而存在,随着方法的弹栈而消失
5.4 初始化不同
成员变量:有默认初始值
整型(byte、short、int、long):0
浮点型(float、double):0.0
字符型(char):0(或‘\u0000’)
布尔型(boolean):false
引用数据类型(类、数组、接口…):null
局部变量:没有默认初始值,使用之前需要赋值,否则编译器会报错
6 方法
6.1 声明
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
pubili void eat(String foods){
System.----.println("----");
}
6.1.1 权限修饰符
private、public、缺省、protected
static、final、abstract
6.1.2 返回值类型
6.1.3 方法名
6.1.4 形参列表
6.1.5 方法体
- 注意递归要设计好,否则会导致栈溢出
- 可以调用自身的属性,方法