第7章 面向对象编程(基础部分)
1. 类与对象
1.1 类与对象的关系与区别
- 类是抽象的,概念的,代表一类事物,比如动物类,人类等,即它是数据类型;
- 对象是具体的,实际的,代表一个具体事物,即 是实例;
- 类是对象的模板,对象是类的一个个体,对应一个实例。
1.2 对象在内存中存在形式
1.3 属性/成员变量/字段
成员变量=属性=field(字段)
class Car{
String name; // 属性,成员变量,字段 field
double price;
String color;
String[] master;
}
属性如果不赋值,有默认值,规则和数组一致,具体说: int 0, short 0, byte 0, long 0, float 0.0, double 0.0, char \u0000, boolean false, String null
1.4 如何创建对象
- 先声明再创建
Cat cat; // 声明对象 cat
cat=new Cat();// 创建
- 直接创建
Cat cat= new Cat();
1.5 类和对象的内存分配机制
-
Java内存的结构分析
- 栈:一般存放基本数据类型(局部变量);
- 堆:存放对象(Cat cat, 数组等)
- 方法区:常量池(常量,比如字符串),类加载信息;
- 示意区 [Cat(name, age, price)]
-
Java创建对象的流程简单分析
- 先加载Person类信息(属性和方法信息,只会加载一次)
- 在堆中分配空间,进行默认初始化(看规则)
- 把地址赋给p, p就指向对象
- 进行指定初始化;
Person p=new Person(); p.name="jack"; p.age=10
2. 成员方法
2.1 方法的调用机制原理
2.2 成员方法的好处
- 提高代码的复用性;
- 可以将实现的细节封装起来,然后供其他用户来调用即可;
public double f1(){
double d1=1.1*3;
return d1
}
3. 成员方法传参机制
3.1 基本数据类型的传参机制
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参。
3.2 引用数据类型的传参机制
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参。
例1:接收数组,修改数组
package com.hspedu.classes;
/**
* @version 1.0
* @auther oneline
*/
public class MethodParameter02 {
public static void main(String[] args) {
B b=new B();
int[] a={1,2,3};
b.test100(a);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]+"\t");
}
System.out.println();
}
}
class B{
public void test100(int[] arr){
arr[0]=200; // 修改元素
// 遍历数组
System.out.println("test100");
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]+"\t");
}
System.out.println();
}
}
输出:
test100
200
2
3
200
2
3
例2:接收对象,修改该对象的属性
package com.hspedu.classes;
/**
* @version 1.0
* @auther oneline
*/
public class MethodParameter03 {
public static void main(String[] args) {
Person p=new Person();
p.name="jack";
p.age=10;
B2 b=new B2();
b.test200(p);
System.out.println("main的p.age="+p.age);
}
}
class Person{
String name;
int age;
}
class B2{
public void test200(Person p){
p.age=10000;
}
}
输出:
main的p.age=10000
如果test200中内容变成:
class B2{
public void test200(Person p){
p=null;
}
}
age依然输出10
3.3 成员方法返回类型是引用类型应用实例
4. 方法递归调用
递归就是方法自己调用自己;执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。
5. 方法重载
java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致;
public int calculate(int n1, int n2){}
public double calculate(double n1, int n2){}
public int calculate(int n1, int n2, int n3){}
- 注意细节
- 方法名:必须相同;
- 形参列表:必须不同(形参类型或个数或顺序,至少有一样不同,参数名无要求);
- 返回类型:无要求;
6. 可变参数
java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。就可以通过可变参数实现。
//1. int... 表示接收的是可变参数,类型是int,即可以接收多个int;
//2. 使用可变参数时,可以当作数组来使用,即nums可以当作数组;
//3. 遍历nums求和即可;
public int sum(int... nums){
int res=0;
for(int i=0;i<nums.length;i++){
res+=nums[i];
}
}
- 注意细节
- 可变参数的实参可以为0或者任意多个;
- 可变参数的实参可以为数组;
- 可变参数的本质就是数字;
- 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后;
- 一个形参列表中只能出现一个可变参数;
7. 作用域
7.1 属性和局部变量
- 属性和局部变量可以重名,访问时遵循就近原则;
- 在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名。
- 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量,生命周期较短。
- 全局变量:可以被本类使用,或其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用; - 全局变量/属性:可以加修饰符;
局部变量:不可以加修饰符;
8. this关键字
8.1 什么是this
java虚拟机会给每个对象分配this, 代表当前对象。
- 注意事项和使用细节
- this 关键字可以用来访问本类的属性、方法、构造器;
- this用于区分当前类的属性和局部变量;
- 访问成员方法的语法: this.方法名(参数列表);
- this不能在类定义的外部使用,只能在类定义的方法中使用。