面向对象
面向对象
面向对象思想(Object Oriented Programming )OOP:
- 一切客观存在的事物都是对象,万物皆对象
- 任何对象,一定具有自己的特征和行为
对象:
特征:称为属性,一般为名词,代表对象有什么
行为:称为方法,一般为动词,代表对象能做什么
现实中的对象
手机:有品牌、颜色、价格、重量 能打电话、发短信
车:有品牌、颜色、型号、产地 能前进、后退
程序中的对象
-
如何使用程序模拟现实世界,解决现实问题?
1、首先,在程序当中,必须具有和现实中相同的对象,用以模拟现实实际
2、然后,使用程序中的对象代表现实中的对象,并执行操作,进而解决现实问题
-
现实中的对象多数来自于"模板",程序中的对象也应该具有"模板"
什么是类
程序中的模板 Java的基本编程单元是类
通过程序中的模板创造出来的实体,即为程序中的对象
类的抽取
在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分
类的定义
public class Dog{//类名
String breed;//品种
int age;//年龄
String sex;//性别
String furColor;//毛色
public void eat(){
System.out.println("eating....");
}
public void sleep(){
System.out.println("sleeping....");
}
}
属性:通过变量表示,又称实例变量
语法:数据类型 属性名;
位置:类的内部,方法的外部
方法:通过方法表示,又称实例方法
语法:
publi 返回值类型 方法名(形参){
//方法的主体
}
注意:不再书写static
对象的创建
public static void main(String[] args) {
/*
* 将对象保存在相同类型的myDog变量中, myDog变量称为"对象名"或"引用名"
**/
Dog myDog = new Dog();// 基于Dog类创建对象
// 访问属性: 对象名.属性名 = 值;//赋值
myDog.breed = "萨摩";
myDog.age = 2;
myDog.sex = "公";
myDog.furColor = "白色";
// 访问属性: 对象名.属性名;//取值
System.out.println(myDog.breed + "\t" + myDog.age + "\t" + myDog.sex + "\t" + myDog.furColor + "\t");
//调用方法:对象名.方法名();
myDog.eat();
myDog.sleep();
}
类与对象的关系
类:定义了对象应具有的特征和行为,类是对象的模板 类是对象的抽象
对象:拥有多个特征和行为的实体,对象是类的实例
实例变量
对于实例变量而言,为赋值并不会编译错误。
实例变量的默认值:
整数:0
小数:0.0
字符:\u0000(空格)
布尔:false
其他:null
实例变量与局部变量的区别
局部变量 | 实例变量 | |
---|---|---|
定义位置 | 方法或方法内部的结构当中 | 类的内部、方法的外部 |
默认值 | 无默认值 | 字面值(与数组相同) |
使用范围 | 从定义行到包含其结构结束 | 本类有效 |
命名冲突 | 不允许与局部变量重名 | 不允许与实例变量重名,可与局部变量重名,局部变量优先 |
实例方法
对象的实例方法包含两部分:方法的声明和方法的实现
方法的声明:
- 代表对象能做什么
- 组成:修饰符 返回值类型 方法名(形参列表)
方法的实现:
- 代表对象怎么做:即如何实现对应的功能
- 组成:{逻辑代码}
课堂案例
方法重载的概念:
有些情况下,对象的同一种行为可能存在多种实现过程
例如:人对象的"吃"行为,吃饭和吃药的过程就存在差异
到底采用哪种实现过程,需要取决于调用者给定的参数
方法重载
重载(Overload):一个类定义多个相同名称的方法
要求:
- 方法名相同
- 参数列表不同(类型、个数、顺序)
- 与访问修饰符、返回值类型无关
调用带有重载的方法时,需要根据传入的实参去找到与之匹配的方法
好处:灵活、方便、屏蔽使用差异
代码调错
两个方法的方法名称和参数列表都相同,只要参数名称不一样,编译报错
注意:只是参数名称不同,并不能构成方法的重载
构造方法
构造方法:类中的特殊方法,主要用于创建对象
特点:
- 名称与类名完全相同
- 没有返回值类型
- 创建对象时,触发构造方法的调用,不可通过句点手动调用
注意:如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法
创建对象的过程
new Student(); 触发对象创建
对象的创建过程:
- 内存中开辟对象空间
- 为各个属性赋予初始值
- 执行构造方法中的代码
- [将对象的地址赋值给变量]
对象的内存分配
存储对象的变量(引用)中保存对象的地址,通过变量中的地址访问对象的属性和方法
构造方法重载
构造方法也可重载,遵循重载规则
创建对象时,根据传入的参数,匹配对应的构造方法
默认构造方法
在类中,如果没有显示定义构造方法,则编译器默认提供无参构造方法
如已手动添加有参构造方法,则无参构造方法不再默认提供,可根据务求自行添加
经验:虽然编译器会默认提供无参构造 但是还是每一次都添加上无参构造
this关键字
类是模板,可服务于此类的所有对象;
this是类中默认引用,代表当前实例;
当类服务于某个对象时,this则指向这个对象
this的第一种用法
调用实例属性、方法
当实例变量和局部变量重名时,优先访问局部变量;此时,如需访问实例变量,
需要增加this.前缀。不存在重名时,则可以省略
public class T2 {
public static void main(String[] args) {
Student s1 = new Student();
s1.sayHi();
}
}
class Student {
String name = "tom";
public void sayHi() {
String name = "jack";
System.out.println(name);
System.out.println(this.name);
}
}
this的第二种用法
调用本类中的其他构造方法 如:this()、this(实参)
在构造方法中,调用本类的其他构造方法,即可复用构造方法中的逻辑代码
this():调用无参构造
this(实参):调用有参构造
注:必须在构造方法的首行
总结
-
什么是对象
一切客观存在的事物都是对象,万物皆对象
-
什么是类
定义了对象应具有的特征和方法,类是对象的模板
-
什么是方法重载
方法名相同、参数列表不同
-
什么是构造方法
类中用于创建对象的特殊方法,名称与类名相同,没有返回值,不可通过句点调用
-
什么是this关键字
代表当前实例,通过this.访问实例成员;
通过this()/this(xxx)访问本类中的其他构造方法