Java笔记——面向对象编程(基础部分)

面向对象编程(基础)

类和对象

单独变量来解决,不利于数据的管理;数组,数据类型体现不出,不能体现行为; 类 (自定义数据类型)--------> 对象【属性, 行为】(具体的实例) 类是抽象的;对象是具体的;类是对象的模板

对象内存布局

image-20211104172142987 字符串常量是索引

  • 类和对象的内存分配机制

    :一般存放基本数据类型(局部变量);:存放对象(Cat cat, 数组等);方法区:常量池(常量,比如字符串),类加载信息

对象创建过程

  1. 先加载Person类信息(属性和方法信息,只会加载一次)

  2. 在堆中分配空间,进行默认初始化(看规则)

  3. 把地址赋给p,p就指向对象

  4. 进行指定初始化,比如p.name = "jack"; p.age = 10;

    image-20211104214002977

属性/成员变量

  1. 属性的定义语法同变量,实例:访问修饰符 属性类型 属性名;
  2. 属性的定义类型可以为任意类型,包含基本数据类型和引用类型;
  3. 属性若不赋值,有默认值,规则和数组一致; 访问属性 : 对象名.属性名

成员方法

方法调用机制

image-20211105153704015

成员方法的好处

  1. 提高代码的复用性
  2. 将实现细节封装起来,供其他用户调用

方法使用细节

  1. 访问修饰符(作用是控制 方法使用的范围) 如果不写,则默认访问, 【有四种:public, protected, default, private】
  2. 返回数据类型
    • 一个方法最多有一个返回值【通过数组返回多个结果】
    • 返回类型可以任意类型,包含基本类型和 引用类型(数组、对象)
    • 返回值类型必须和return的值类型一致或者兼容(自动类型转换)
    • 驼峰命名法
  3. 方法体
    • 方法不能嵌套定义
  4. 方法调用
    • 同一个类中的方法调用:直接调用即可
    • 跨类中的方法A类调用B类方法:需要通过对象名调用。先创建对象,再调用
    • 跨类的方法调用和方法的访问修饰符相关

编写方法的思路

  1. 方法的返回类型
  2. 方法的名字
  3. 方法的形参
  4. 方法体

成员方法传参机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 实参和形参,位于不同栈中
public class method {
public static void main(String[] args) {
int a = 10, b = 20;
AA s = new AA();
s.swap(a, b); // 调用方法,会创建新栈
System.out.println("\nmain中a = " + a + ", b = " + b);
}
}

class AA {
public void swap(int a, int b) {
int tmp = a;
System.out.println("\n交换前a = " + a + ", b = " + b);
a = b;
b = tmp;
System.out.println("\n交换后a = " + a + ", b = " + b);
}
}

int[] arr = {1, 2, 3};引用类型传递的是地址(传递也是值,但值是地址),指向的相应位置,可以通过形参影响实参!

方法重载OverLoad

Java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致! 比如:System.out.println(); 中out是PrintStream类型

  1. 方法名:必须相同
  2. 形参列表:必须不同(形参类型或个数或顺序,至少有一个不同)
  3. 返回类型:无要求

可变参数

Java允许将同一个类中多个同名同功能参数个数不同的方法,封装成一个方法。

1
2
3
访问修饰符 返回类型 方法名(数据类型... 形参名) {
// 使用可变参数时,可以当作数组来使用
}
  1. 可变参数的实参可以为0个或者任意多个;
  2. 可变参数的实参可以是数组;
  3. 可变参数的本质是数组;
  4. 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后;
  5. 一个形参列表中只能出现一个可变参数;

作用域

  • 全局变量:属性(成员变量),作用域是整个类体;
  • 局部变量:除了属性之外的其他变量,作用域是定义它的代码块;
  • 全局变量可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值;
  • 属性的生命周期比较长,伴随着对象的创建而创建,伴随着对象的死亡而死亡。局部变量,生命周期比较短,在一次方法调用过程中。

注意事项

  1. 全局变量/属性:可以被本类使用,或者其它类使用(通过对象调用)
  2. 局部变量:只能在本类中对应的方法使用
  3. 全局变量可以加修饰符,局部变量不可以加修饰符

构造器 Constructor

构造器又叫构造方法,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。特点如下: 1)方法名和类名相同 2)没有返回值 3)在创建对象时,系统会自动的调用该类的构造器完成对对象初始化

注意事项

  1. 一个类可以定义多个不同的构造器
  2. 构造器名和类名要相同
  3. 构造器是完成对象的初始化,并不是创建对象
  4. 若开发者没有定义构造器,系统会自动给类生成一个默认无参构造器, javap反编译
  5. 一旦自定义了构造器,默认构造器就被覆盖

对象创建流程

  1. 加载Person类信息(Person.class),只会加载一次
  2. 在堆中分配空间(地址)
  3. 完成对象初始化 3.1 默认初始化 age = 0, name = null 3.2 显示初始化 age = 90, name = null 3.3 构造器初始化 age = 10, name = “小倩”
  4. 把对象在堆中的地址,返回给p(p是对象名,也可以理解成对象的引用)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Person {
    int age = 90;
    String name;
    Person(String n, int a) {
    name = n;
    age = a;
    }
    }
    Person p = new Person("小倩", 10);
    ## this Java虚拟机会给每个对象分配this,代表当前对象。使用this解决变量命名问题
image-20211106165450967

dog1.age 等同于this.age, 可以用hashCode验证

this的使用细节

  1. this关键字可以用来访问本类的属性、方法、构造器
  2. this用于区分当前类的属性和局部变量
  3. 访问成员方法的语法:this.方法名(参数列表);
  4. 访问构造器语法:this(参数列表); 注意只能在构造器中的第一个语句使用(即只能在构造器中访问另一个构造器)
  5. this不能在类定义的外部使用

Java笔记——面向对象编程(基础部分)
https://nessaj7.github.io/2021/11/06/547b5e049711.html
作者
kuhn
发布于
2021年11月6日
许可协议