6-1.Java 面向对象 - 初级(对象与属性、对象与方法、递归、重载、可变参数、作用域、构造器、对象创建流程详解、this 关键字)
一、对象与属性
1、基本介绍
- 属性是类的一个组成部分,一般是基本数据类型,也可以是引用数据类型
- 属性的定义语法类似变量
【访问修饰符】 【属性类型】 【属性名】;
-
属性的定义类型可以为任何类型(基本数据类型、引用数据类型)
-
属性如果不赋值,有默认值
2、对象创建与属性访问
- 创建对象
// 先声明再创建
Cat cat;
cat = new Cat();
// 直接创建
Cat cat = new Cat();
- 访问属性
cat.name;
cat.age;
3、Java 内存结构
-
栈:一般存放基本数据类型
-
堆:存放对象
-
方法区:包括常量池(如字符串)和类加载信息(属性和方法信息)
4、Java 对象创建流程
Person p = new Person();
p.name = "jack";
p.age = 10;
-
加载 Person 类信息
-
在堆中分配空间,进行默认初始化
-
把地址赋给 p,p 指向对象
-
进行指定初始化
二、对象与方法
1、基本介绍
public 【返回数据类型】 【方法名】(【参数列表】) {
【方法体】;
return 【返回值】;
}
- | 说明 |
---|---|
public | 访问修饰符 |
返回数据类型 | 表示成员方法输出的数据类型,void 表示没有返回值 |
参数列表 | 表示成员方法的输入 |
方法体 | 表示为实现某一功能的代码块 |
return | 表示成员方法的输出(不是必须的) |
2、注意事项
(1)返回数据类型
-
一个方法最多有一个返回值
-
返回类型可以为任何类型(基本数据类型、引用数据类型)
-
如果方法有返回数据类型,则方法中最后的执行必须为 return 语句,且 return 的值类型必须和要求返回的数据类型一致
-
如果方法有 void,则方法体中可以没有 return 语句
(2)参数列表
-
一个方法可以没有参数,也可以有多个参数,中间用逗号隔开
-
参数类型可以为任何类型(基本数据类型、引用数据类型)
-
调用带参方法时,一定要对应参数列表传入相应类型或兼容类型的参数
-
方法定义时的参数成为形式参数,简称形参,方法调用时的参数成为实际参数,简称实参,实参和形参的类型要一致或兼容,个数、顺序必须一致
(3)方法体
- 里面编写完成功能的具体语句,但里面不能再定义方法
(4)方法调用
-
同一个类中的方法可直接调用
-
跨类方法调用需要通过对象名调用,受访问修饰符影响
【对象名】.【方法名】(【参数】);
(5)方法名
- 建议遵循小驼峰式命名法
三、递归
1、基本介绍
- 递归就是方法自己调用自己,每次调用时传入不同的变量
-
执行一个方法就是创建一个新的受保护的独立空间(栈空间)
-
方法的局部变量是独立的,不会互相影响
-
如果方法中使用的是引用类型变量,会共享该引用类型的数据
-
递归必须向退出条件逼近,否则会无限递归
-
当一个方法执行完毕或遇到 return 时返回,遵循谁调用,就将结果返回给谁
2、实例实操
- RecursionTest.java
package com.my.primary;
public class RecursionTest {
public static void main(String[] args) {
System.out.println(factorial(10));
printNum(5);
}
// 递归阶乘
public static int factorial(int num) {
if (num == 1) {
return 1;
} else {
return factorial(num - 1) * num;
}
}
// 递归打印
public static void printNum(int num) {
if (num > 2) {
printNum(num - 1);
}
System.out.println(num);
}
}
四、重载
- Java 中允许同一个类中有多个同名方法的存在,但需要满足以下需求
-
方法名相同
-
参数列表(参数类型,个数)必须不同,参数名无要求
-
返回类型无要求
五、可变参数
- 可变参数可将一个类中多个同名同功能,但参数个数不同的方法,封装成一个方法
【访问修饰符】 【返回数据类型】 【方法名】(【数据类型】... 【形参名】) {
【方法体】;
return 【返回值】;
}
-
可变参数的实参可以为 0 个或多个
-
可变参数的实参可以是数组
-
可变参数的本质就是数组
-
可变参数可以和普通类型的参数一起放在形参列表,但是必须保证可变参数放在最后
-
一个形参列表中只能出现一个可变参数
六、作用域
1、属性和局部变量命名
-
属性和局部变量可以重名,访问时遵循就近原则
-
在同一个作用域中,两个局部变量,不能重名
2、属性和局部变量生命周期
-
属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁
-
局部变量生命周期较短,伴随的代码的创建而创建,伴随着代码块的销毁而销毁
3、属性和局部变量作用范围
-
属性可以被本类或其他类使用
-
局部变量只能在本类对应的方法中使用
4、属性和局部变量修饰符使用
-
属性可以加修饰符
-
局部变量不可以加修饰符
七、构造器
1、基本介绍
【访问修饰符】 【方法名】(【形参列表】) {
【方法体】;
}
-
构造器的访问修饰符可以是默认
-
一个类可以定义多个不同的构造器,即构造器重载
-
构造器名和类名必须一致
-
构造器没有返回值
-
构造器是完成对象的初始化,不是创建对象
-
在创建对象时,系统自动的调用该类的构造器
-
如果没有定义构造器,系统会自动给类生产一个默认的无参构造器
-
一旦定义了构造器,默认的无参构造器就会被覆盖,无法使用,但可以显式定义
2、基本使用
- ConstructorTest.java
package com.my.primary;
public class ConstructorTest {
public static void main(String[] args) {
Dog dog = new Dog("阿黄", 2);
System.out.println(dog.name);
System.out.println(dog.age);
}
}
class Dog {
String name;
int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
八、对象创建流程详解
1、示例代码
class Dog {
String name;
int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
// 创建对象
Dog dog = new Dog("阿黄", 2);
2、流程详解
-
加载 Dog 类信息(Dog.class),只会加载一次
-
在堆中分配空间(地址)
-
默认初始化
age = 0;
name = null;
- 显式初始化
age = 1;
name = null;
- 构造器初始化
age = 2;
name = "阿黄";
- 把对象在堆中的地址赋给 dog
九、this 关键字
- this 关键字代表当前对象
-
this 关键字可以用来访问本类的属性、方法、构造器
-
this 关键字可用于区分当前类的属性和局部属性
-
访问成员
this.【方法名】(【参数列表】);
- 访问构造器,只能在构造器中使用,即只能在构造器中访问另外一个构造器,且必须作为第一条语句
this(参数列表);
- this 关键字不能在类的外部使用,只能在定义类的方法中使用