十三、面向对象
一、简述
面向过程与面向对象:
面向过程:是一种以过程为中心的编程思路,功能的每一块都是由自己来实现的
面向对象:是一种以对象为中心的编程思路,通过指挥对象实现具体的功能
面向对象的三条主线:
Java类及类的成员:属性,方法,构造器,代码块和内部类
面向对象的三大特征:封装型,继承性,多态性,(抽象性)
其他关键字:this,super,static,final,import等
二、类和对象
类是对一类事物的描述,是抽象的、概念上的定义;
对象是实际存在的该类事物的每个个体,因而也称为实例(instance);
面向对象程序设计的重点是类的设计;类的设计,其实就是类的成员的设计。
1.1、类的成员
- 属性 属性 = 成员变量 = field = 域、字段
- 方法 方法 = 成员方法 = 函数 = method
- 创建类的对象 = 类的实例化 = 实例化类
public class PersonTest {
public static void main(String[] args) {
//创建Person 类的对象
Person p1 = new Person(); //【二】、创建Person 类的对象
//调用属性: 对象.属性
p1.name = "jankin"; //【三】、调用
p1.age = 22;
System.out.println("名字:"+p1.name+",年龄:"+p1.age);
//调用方法: 对象.方法
p1.talk("Chinese");
//************************ //【四】、每个对象都独立的拥有一套类的属性
Person p2 = new Person();
System.out.println(p2.name); //null
//************************ // 【五】、将变量保存的地址值给p3,导致p1和p3指向了对空间中的同一个实体
Person p3 = p1;
System.out.println(p3.name); //jankin
p3.age = 21;
System.out.println(p1.age); //21
}
}
class Person { //【一】 、创建类,设计类的成员
//属性
String name;
int age;
//方法
public void talk(String language){
System.out.println("我可以说"+language);
}
}

1.2、类成员之:属性和方法
类中属性的使用
属性(成员变量 vs 局部变量)
成员变量:直接定义在类的一对{}内的变量
局部变量:声明在方法内方法参数,代码块、构造器内部的变量
1.相同点:
1.1 变量格式是一样的 【变量类型 变量名= 变量值】
1.2 先声明,后赋值
1.3 变量都有其对应的作用域
2.不同点:
2.1 在类中声明的位置的不同
属性(成员变量),直接定义在类的{}内
局部变量:声明在方法内,方法形参,代码块内,构造器形参内的变量
2.2 关于权限修饰符的不同
属性:可以在声明属性时,指定其权限,使用权限修饰符
常用的权限修饰符:private,public,缺省,protected
局部变量:不可以使用权限修饰符的
2.3 默认初始化值的情况
属性:类的属性,根据其类型,都是默认初始化值
整形:0
浮点型:0.0
布尔值:false
char:'0'或‘\u0000’
引用型:null
局部变量:没有默认初始化值
意味着,我们调用变量的时候,一定要显式赋值(不然会报错)
特别的形参调用的时候,我们赋值即可
2.4加载的位置不同
属性:加载在堆空间中(非start)
局部变量:加载在栈空间
局部变量不能使用权限修饰符

局部变量没有初始值

类中的方法:描述类应该具有的功能
1.举例
public void eat(){}
public void eat(int num){}
public String eat(){}
2.方法的声明
权限修饰符 返回值类型 方法名(形参列表){方法体}
3.说明:
3.1 关于权限修饰符
java规定的4种权限修饰符:private,public,缺省,protected
3.2 返回值:有返回值vs没有返回值
- 如果方法有返回值,则必须在方法声明的时候,指定返回值的类型。同时,方法中,需要使用return返回指定类型的变量或常量。
- 如果方法没有返回值,则方法声明时,使用void表示。通常,没有返回值的方法中就不需要使用return ,但是,如果使用的话,只能“return;”表示结束此方法的意思
3.3方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
3.4形参列表:方法可以声明随意个形参,多个形参用“,”分格
3.5方法体:方法功能的实现
4.return 关键字的使用
> 使用范围:使用在方法体中
> 作用: 1.结束方法 2.针对有返回值类型的方法,返回“return 数据”
> 注意点:return关键字后面不能声明执行语句
5.方法的使用中,可以调用当前类中的属性或方法
> 特殊的:方法a中又调用方法a:称递归方法
> 方法中不能定义别的方法
1.3、万事万物皆对象
- 在java语言范畴中,我们都将功能,结构等封装到类中,通过类的实例化,来调用具体的功能结构
- 涉及到java语言与前段html,后端的数据交互时,前后端的结构在java层面交互时,都体现为类、对象
对象数组的内存解析说明
引用类型的变量,只能存储2类值 (null和地址值)

匿名对象的使用
new Phone().sendEmail();
1.理解:我们建的对象,没有显式的赋给一个变量,即为匿名对象
2.特征,匿名对象只能调用一次.
public class InstanceTest {
public static void main(String[] args) {
PhoneMall mall = new PhoneMall();
mall.show(new Phone());
}
}
class PhoneMall{
public void show(Phone ph1){
ph1.price = 1999;
ph1.showPrice();
}
}
class Phone{
double price;
public void showPrice(){
System.out.println("手机价格为:"+price);
}
}
1.4、再谈方法
1.4.1、方法的重载
- 定义:在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可
- 两同一不同
- 同一个类,相同的方法名
- 参数列表不同,参数个数不同,参数类型不同
- 跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系
- 在通过对象调用方法时,如何确定某一个指定的方法
- 方法名 ---> 参数列表
以上面的买手机为例
class PhoneMell{
public void show01(Phone p1){
p1.price = "1999元";
p1.show("优惠多多");
}
}
class Phone{
public String price;
public void show(){
System.out.println("手机价格:"+this.price);
}
public void show(String str){
System.out.println("手机价格:"+this.price + ";" + str);
}
}
1.4.2、可变个数的形参
-
jdk 5.0 新增的方法
-
具体使用:
1.可变个数的形参的格式:数据类型 ...变量名
2.当调用可变个数形参的时候,可以传任意个形参,包括0个,
3.可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
4.可变个数形参的方法与本类中方法名相同,形参类型也相同的 数组 之间不构成重载。可以说,二者不能共存
5.可变个数形参在方法的形参中,最多只能声明一个可变形参,并且只能放在最后

执行可变个数形参
public class zhTest {
public static void main(String[] args) {
zhTest z = new zhTest();
z.show("hello","world");
}
public void show(String str){
System.out.println(str);
}
public void show(String ...strs){
System.out.println("strs");
}
}
形参类型也相同的 数组,二者不能共存

1.4.3、方法形参的传递机制
形参:方法定义时,声明的小括号内的参数
实参:方法调用时,实际传递给形参的值
值传递机制:如果参数是基本数据类型,此时实参赋给形参的是实参真实储存的数值
果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值
基本数据类型形参的值传递机制

引用数据类型形参的值传递机制

1.4.4、递归方法
- 1.递归方法:一个方法体内调用它自身。
- 方法递归包含了一种隐式的循环,他会重复执行某段代码,但这种重复执行无须循环控制。
- 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似死循环
public static void main(String[] args) {
ZhTest test = new ZhTest();
int num = test.getSum(3);
System.out.println(num);
}
public int getSum(int n){
if(n == 1){
return 1;
}else{
return n + getSum(n-1);
}
}

浙公网安备 33010602011771号