目录
学习面向对象内容的三条主线
面向过程与面向对象
面向过程(POP) 与 面向对象(OOP)
面向对象的三大特征
例子:人把大象装进冰箱
面向对象的思想概述
类和对象
面向对象的思想概述
Java类及类的成员
类的语法格式
创建Java自定义类
对象的创建和使用
类的访问机制:
对象的产生
对象的生命周期
内存解析
匿名对象
类的成员之一:属性
语法格式:
成员变量与局部变量
成员变量(属性)和局部变量的区别?
成员变量vs局部变量的内存位置
对象属性的默认初始化赋值
方 法(method)
什么是方法(method、函数):
方法的声明格式:
方法的分类:按照是否有形参及返回值
方法调用的过程分析
总结
学习面向对象内容的三条主线
- 1.Java类及类的成员
- 2.面向对象的三大特征
- 3.其它关键字
面向过程与面向对象
首先解释一下“思想”。 先问你个问题:你想做个怎样的人? 可能你会回答:我想做个好人,孝敬父母,尊重长辈,关爱亲朋…… 你看,这就是思想。这是你做人的思想,或者说,是你做人的原则。 做人有做人的原则,编程也有编程的原则。这些编程的原则呢,就是编程思想。
面向过程(POP) 与 面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,
强调的 是功能行为,以函数为最小单位,考虑怎么做
。面向对象,将功能封装进对象,
强调具备了功能的对象,以类
/
对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等
面向对象的三大特征
- 封装 (Encapsulation)
- 继承 (Inheritance)
- 多态 (Polymorphism)
例子:人把大象装进冰箱
面向对象的思想概述
程序员从面向过程的
执行者
转化成了面向对象的
指挥者
- 面向对象分析方法分析问题的思路和步骤:
- 根据问题需要,选择问题所针对的现实世界中的实体。
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
- 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
- 将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具
类和对象
类
(Class)
和
对象
(Object)
是面向对象的核心概念。
- 类是对一类事物的描述,是抽象的、概念上的定义
- 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
- “万事万物皆对象
面向对象的思想概述
可以理解为:
类 = 抽象概念的人;对象 = 实实在在的某个人
- 面向对象程序设计的重点是类的设计
- 类的设计,其实就是类的成员的设计
Java类及类的成员
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的
细胞
构成的。同理,Java
代码世界是由诸多个不同功能的
类
构成的。
现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、
…
那么, Java中用类
class
来描述事物也是如此。常见的类的成员有:
- 属 性:对应类中的成员变量
- 行 为:对应类中的成员方法
Field = 属性 = 成员变量,Method = (成员)方法 = 函数
类的语法格式
修饰符 class 类名 {属性声明 ;方法声明 ;}说明: 修饰符 public :类可以被任意访问类的正文要用 { } 括起来
public class Person{
private int age ; //声明私有变量 age
public void showAge(int i) { //声明方法showAge( )
age = i;
}
}
创建Java自定义类
步骤:
- 1. 定义类(考虑修饰符、类名)
- 2. 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 3. 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
对象的创建和使用
- 创建对象语法: 类名 对象名 = new 类名();
- 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
public class Zoo{
public static void main(String args[]){
//创建对象
Animal xb=new Animal();
xb.legs=4;//访问属性
System.out.println(xb.legs);
xb.eat();//访问方法
xb.move();//访问方法
}
}
public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public viod move(){
System.out.println(“Move.”);
}
}
如果创建了一个类的 多个对象,对于类中 定义的属性,每个对 象都拥有各自的一套 副本,且互不干扰
类的访问机制:
在一个类中的访问机制:
类中的方法可以直接访问类中的成员变量。
(例外:
static
方法访问非
static
,
编译不通过。
)
在不同类中的访问机制:
先创建要访问类的对象,再用对象访问类中
定义的成员
对象的产生
Person p1 = new Person();执行完后的内存状态。其中类定义如下:
class Person{
int age;
void shout(){
System.out.println(“oh,my god! I am ” + age);
}
}
对象的生命周期
你要没有引用就会被回收
内存解析
- 堆(Heap),此内存区域的唯一目的 就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
- 通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的 各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、 long 、double)、对象引用(reference类型, 它不等同于对象本身,是对象在堆内 存的首地址)。 方法执行完,自动释放。
- 方法区(Method Area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。对象的内存解析
Person p1 = new Person();
p1.name = "Tom";
p1.isMale = true;
Person p2 = new Person();
sysout(p2.name);//null
Person p3 = p1;
p3.age = 10;
匿名对象
我们也可以不定义对象的句柄,而直接调用这个对象的方法。这 样的对象叫做匿名对象。
: new Person().shout();
- 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
- 我们经常将匿名对象作为实参传递给一个方法调用
类的成员之一:属性
语法格式:
语法格式:
修饰符
数据类型
属性名
=
初始化值
;
说明
1:
修饰符
- 常用的权限修饰符有:private、缺省、protected、public
- 其他修饰符:static、final (暂不考虑)
说明
2
:数据类型
- 任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
说明
3
:属性名
- 属于标识符,符合命名规则和规范即可。
public class Person{
private int age; //声明private变量 age
public String name = “Lila”; //声明public变量 name
}
成员变量与局部变量
在方法体外,类体内声明的变量称为成员变量。 在方法体内部声明的变量称为局部变量。
注意:二者在初始化值方面的异同
:
- 同:都有生命周期
- 异:局部变量除形参外,均需显式初始化
成员变量(属性)和局部变量的区别?
成员变量vs局部变量的内存位置
class Person{//人类
//1.属性
String name;//姓名
int age = 1;//年龄
boolean isMale;//是否是男性
public void show(String nation){
//nation:局部变量
String color;//color:局部变量
color = "yellow";
}
}
//测试类
class PersonTest{
public static void main(String[] args){
Person p = new Person();
p.show(“USA”);
}
}
对象属性的默认初始化赋值
当一个对象被创建时,会对其中各种类型的
成员变量
自动进行初始化赋值。除了 基本数据类型之外的变量类型都是引用类型,如上面的Person
及前面讲过的数组。
方 法(method)
什么是方法(method、函数):
- 方法是类或对象行为特征的抽象,用来完成某个功能操作在某些语言中也称为函数或过程。
- 将功能封装为方法的目的是,可以实现代码重用,简化代码
- Java里的方法不能独立存在,所有的方法必须定义在类里。
public class Person{
private int age;
public int getAge() { //声明方法getAge()
return age;
}
public void setAge(int i) { //声明方法setAge
age = i; //将参数i的值赋给类的成员变量age
}
}
方法的声明格式:
修饰符 返回值类型 方法名 ( 参数类型 形参 1 , 参数类型 形参 2 , …. ){方法体程序代码return 返回值 ;}
其中:
修饰符:
public,
缺省
,private, protected
等
返回值类型:
- 没有返回值:void。
- 有返回值,声明出返回值的类型。与方法体中“return 返回值”搭配使用
- 方法名:属于标识符,命名时遵循标识符命名规则和规范,“见名知意”
- 形参列表:可以包含零个,一个或多个参数。多个参数时,中间用“,”隔开
返回值:方法在执行完毕后返还给调用它的程序的数据
方法的分类:按照是否有形参及返回值
方法调用的过程分析
方法通过方法名被调用,且只有被调用才会执行
- 方法被调用一次,就会执行一次
- 没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可 以不必使用return语句。如果使用,仅用来结束方法。
- 定义方法时,方法的结果应该返回给调用者,交由调用者处理。
- 方法中只能调用方法或属性,不可以在方法内部定义方法。
总结
/*
①
1.java类及类的成员,属性,方法,构造器,代码块 内部类
2.面向对象的三大特征:封装,继承 多态 抽象
3.其他关怀字 this. super. static final .abstract .interface packge import
②
“大象装进冰箱”
面向过程:强调的是功能行为,以函数为最小单位 考虑怎么做
1.把冰箱打开 2.把大象放进去 3.关上冰箱
面向对象:强调了具体的功能对象 以类、对象为最小单位
人{
打开(冰箱){}
抱起(大象){}
关闭(冰箱){}
}
冰箱{
打开(){}
关闭(){}
}
大象{
进入(冰箱){}
}
③ 面向对象的两个要素
类:对一个事物的描述,概念上的定义
对象:是实际存在该类事物的某个个体,因而也称为实例(instance)
面向对象程序设计重点是类的设计
④ 设计类就是设计类的成员
属性=成员变量=field=域,字段
方法 =成员方法 函数 methods
创建类的对象=类的实例化=实例化类
⑤ 类和对象的使用
创建类 设计类的成员
创建类的对象
同过 对象.属性 对象.方法 调用对象结构
⑥ 如果 创建了一个类的多个对象 则每个对象都独立的拥有一套类的属性(非static)
意味着 如果我们修改一个对象的属性a,则不会影响另一个对象的属性a
⑦ 类中属性的使用
属性 成员变量 vs 局部变量
相同点
定义变量的格式 数据类型 变量名=变量值
先声明,后使用
变量都尤其对应的作用域
不同点
1.声明位置的不同
成员变量:直接定义在{}内
局部变量: 声明在方法内 方法形参 代码块 构造器形参 构造器内部变量
2.关于权限修饰符的不同
成员变量:可以在生命属性时,指名其权限,使用权限修饰符
常用的权限修饰符 private. public. protected 缺省
局部变量不可以使用权限修饰符
3.默认初始值的情况
成员变量 类的属性根据其类型,都有默初始化值
整型( byte short int long)0
浮点型( float double) 0.0
字符型(char) 0或("\u000")
布尔型 Boolean false
引用数据类型 (类 数组 接口) null
局部变量没有默认初始值
意味着在调用局部变量之前,一定要显式赋值
特别的 形参在调用时我们赋值即可
4.在内存中加载的位置
成员变量 加载到堆空间(非static)
局部变量 加载到栈空间
⑧类中方法的声明和使用
方法:描述类应该具备哪些方法
如:Scanner类 获取键盘 Math类 数学类 Arrays 数组类
方法的声明 权限修饰符 返回值类型 方法名(形参列表){方法集}
注意: static final abstract 来修饰方法的
说明
权限修饰符
java规定四种权限修饰符 private public 缺省 protected
返回值类型 :有返回值 vs 无返回值
如果方法有返回值在,则必须在方法声明时 指定返回的类型 同时方法中需要
使用return关键字返回指定类型的变量或常量
如果方法没有返回值 则方法声明时 使用void表示 通常没有返回值的方法中
就不需要使用return 如果使用的话 只能“return”表示结束此方法
方法名 属于标识符,遵循标识符规则和规范
形参列表 方法可以声明 0个 1个 多个(格式 数据类型1 形参1)
⑨ return关键字的使用
使用范围 使用在方法体中
作用:结束方法 针对有返回值的方法 使用return 数据的格式返回数据
注意不要使用执行语句
⑩ 方法的使用中 可以调用当前类的属性或方法(可以递归调用)
方法中不可以在定义方法
*/
//测试类
public class person {
public static void main(String[] args){
//初始化people类的对象
people p1=new people();
//调用对象的结构属性方法
//调用属性 对象.属性
p1.name="Tom";
p1.isMale=true;
System.out.println(p1.name);
//调用方法对象.方法
p1.eat();
//-------------
people p2=new people();
System.out.println(p2.name);
//-------------
//将p1变量保存的对象地址赋值给p3 导致p1和 p3指向了同一个堆空间地址
people p3=p1;
p3.age=18;
System.out.println(p1.age);
}
}
class people{
//属性
String name;
int age=1;
boolean isMale;
//方法
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep( int hour){
System.out.println("休息了"+hour +"小时");
}
public void talk(String languge){
System.out.println("人可以吃饭"+languge);
}
public String getName(){
return name;
}
public String getNation(String nation){
String info="我的国籍"+nation;
return info
}
`1
}