Java笔记——面向对象编程(基础部分)
面向对象编程(基础)
类和对象
单独变量来解决,不利于数据的管理;数组,数据类型体现不出,不能体现行为; 类 (自定义数据类型)--------> 对象【属性, 行为】(具体的实例) 类是抽象的;对象是具体的;类是对象的模板
对象内存布局
字符串常量是索引
类和对象的内存分配机制
栈:一般存放基本数据类型(局部变量);堆:存放对象(Cat cat, 数组等);方法区:常量池(常量,比如字符串),类加载信息
对象创建过程
先加载Person类信息(属性和方法信息,只会加载一次)
在堆中分配空间,进行默认初始化(看规则)
把地址赋给p,p就指向对象
进行指定初始化,比如
p.name = "jack";p.age = 10;
属性/成员变量
- 属性的定义语法同变量,实例:访问修饰符 属性类型 属性名;
- 属性的定义类型可以为任意类型,包含基本数据类型和引用类型;
- 属性若不赋值,有默认值,规则和数组一致; 访问属性 :
对象名.属性名
成员方法
方法调用机制
成员方法的好处
- 提高代码的复用性
- 将实现细节封装起来,供其他用户调用
方法使用细节
- 访问修饰符(作用是控制 方法使用的范围) 如果不写,则默认访问, 【有四种:public, protected, default, private】
- 返回数据类型
- 一个方法最多有一个返回值【通过数组返回多个结果】
- 返回类型可以任意类型,包含基本类型和 引用类型(数组、对象)
- 返回值类型必须和return的值类型一致或者
兼容(自动类型转换) - 驼峰命名法
- 方法体
- 方法不能嵌套定义
- 方法调用
- 同一个类中的方法调用:直接调用即可
- 跨类中的方法A类调用B类方法:需要通过对象名调用。先创建对象,再调用
- 跨类的方法调用和方法的访问修饰符相关
编写方法的思路
- 方法的返回类型
- 方法的名字
- 方法的形参
- 方法体
成员方法传参机制
1 | |
int[] arr = {1, 2, 3};引用类型传递的是地址(传递也是值,但值是地址),指向堆的相应位置,可以通过形参影响实参!
方法重载OverLoad
Java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致!
比如:System.out.println(); 中out是PrintStream类型
- 方法名:必须相同
- 形参列表:必须不同(形参类型或个数或顺序,至少有一个不同)
- 返回类型:无要求
可变参数
Java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
1 | |
- 可变参数的实参可以为0个或者任意多个;
- 可变参数的实参可以是数组;
- 可变参数的本质是数组;
- 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后;
- 一个形参列表中只能出现一个可变参数;
作用域
- 全局变量:属性(成员变量),作用域是整个类体;
- 局部变量:除了属性之外的其他变量,作用域是定义它的代码块;
- 全局变量可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值;
- 属性的生命周期比较长,伴随着对象的创建而创建,伴随着对象的死亡而死亡。局部变量,生命周期比较短,在一次方法调用过程中。
注意事项
- 全局变量/属性:可以被本类使用,或者其它类使用(通过对象调用)
- 局部变量:只能在本类中对应的方法使用
- 全局变量可以加修饰符,局部变量不可以加修饰符
构造器 Constructor
构造器又叫构造方法,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。特点如下:
1)方法名和类名相同 2)没有返回值
3)在创建对象时,系统会自动的调用该类的构造器完成对对象的初始化
注意事项
- 一个类可以定义多个不同的构造器
- 构造器名和类名要相同
- 构造器是完成对象的初始化,并不是创建对象
- 若开发者没有定义构造器,系统会自动给类生成一个默认无参构造器,
javap反编译 - 一旦自定义了构造器,默认构造器就被覆盖
对象创建流程
- 加载Person类信息(Person.class),只会加载一次
- 在堆中分配空间(地址)
- 完成对象初始化 3.1 默认初始化 age = 0, name = null 3.2 显示初始化 age = 90, name = null 3.3 构造器初始化 age = 10, name = “小倩”
- 把对象在堆中的地址,返回给p(p是对象名,也可以理解成对象的引用)
## this Java虚拟机会给每个对象分配
1
2
3
4
5
6
7
8
9class Person {
int age = 90;
String name;
Person(String n, int a) {
name = n;
age = a;
}
}
Person p = new Person("小倩", 10);this,代表当前对象。使用this解决变量命名问题
dog1.age 等同于this.age,
可以用hashCode验证
this的使用细节
- this关键字可以用来访问本类的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问成员方法的语法:
this.方法名(参数列表); - 访问构造器语法:
this(参数列表);注意只能在构造器中的第一个语句使用(即只能在构造器中访问另一个构造器) - this不能在类定义的外部使用
Java笔记——面向对象编程(基础部分)
https://nessaj7.github.io/2021/11/06/547b5e049711.html