韩顺平 零基础30天学会Java 学习笔记
第07章 面向对象编程(基础部分)(P192 - P262)
7.1 类与对象
-
类就是数据类型(包含属性和行为);对象就是类的一个具体的实例
-
对象内存布局
-
栈:一般存放基本数据类型(局部变量)
-
堆:存放对象(Cat cat, 数组等)
-
方法区:常量池(常量,比如字符串),类加载信息
-
流程简单分析
- 先加载Cat类信息(属性和方法信息,只会加载一次)
- 在堆中分配空间,进行默认初始化(看规则)
- 把地址赋给cat,cat就指向对象
- 进行指定初始化,比如cat.age=12
-
属性
- 成员变量 = 属性 = field(字段)
- 属性可以是基本数据类型,也可以是引用类型(对象,数组)
- 属性的定义语法同变量,示例:访问修饰符 属性类型 属性名
- 属性如果不赋值,有默认值,规则和数组一样
7.2 成员方法
- 方法调用机制
-
定义
访问修饰符 返回数据类型 方法名 (形参列表…) { // 方法体
语句;
return 返回值;
}
- 访问修饰符:public, private, protected, 默认
- 返回值:一个方法最多有一个返回值。可以通过数组返回多个结果
- 方法名最好见名知义
- 实参和形参的类型要一致或兼容、个数、顺序必须一致
- 方法体:方法不能嵌套定义
-
方法调用
- 同一个类中的方法调用:直接调用即可;
- 跨类中的方法A类调用B类方法:需要通过对象名调用;(注意访问修饰符)
7.3 成员方法传参机制
-
基本数据类型,传递是值(值拷贝),形参的任何改变不影响实参;
-
引用类型传递的是地址(传递的也是值,但是值是地址),可以通过形参影响实参。
-
实例
public class Prac { public static void main(String[] args) { Person p = new Person(); p.name = "jack"; p.age = 10; B b = new B(); b.test200(p); System.out.println("main 的 p.age= " + p.age); } } class Person { String name; int age; } class B { public void test200(Person p) { // 思考1 p.age = 10000; // 1.修改对象属性,main输出10000 // 思考2 // p = new Person(); // p.age = 99; // 2.p指向了新的地址,main输出10 // 思考3 // p = null; // 3.p指向了null,main输出10 } }
-
递归调用
自己调用自己
- 执行一个方法时,就创建一个新的受保护的独立空间(栈空间);
- 方法的局部变量是独立的,不会相互影响;
- 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据;
- 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflow Error;
- 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕
7.4 重载(Overload)
- java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致!
- 方法名相同
- 形参类型或者顺序不同
- 返回类型不要求
- 好处:减轻了起名的麻烦和记名的麻烦
7.5 可变参数
-
java允许将同一类中多个同名同功能但参数个数不同的方法封装成一个方法。就可以通过可变参数实现。
-
基本语法
访问修饰符 返回类型 方法名(数据类型… 形参名){}
// int... 表示接受的是可变参数,类型是int,既可以接收多个int(0-多) // 使用可变参数时,可以当作数组来使用,即nums可以当作数组 public int sum(int... nums) { int res = 0; for (int i = 0; i < nums.length; i++) { res += nums[i]; } return res; }
-
注意事项和使用细节
- 可变参数的实参可以为0个或任意多个
- 可变参数的实参可以为数组
- 可变参数的本质就是数组
- 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
- 一个形参列表中只能出现一个可变参数
7.6 作用域
- 全局变量:也就是属性,作用域为整个类体
- 局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中
- 全局变量可以不赋值,直接使用,因为有默认值。局部变量必须赋值后才能使用,因为没有默认值
- 属性和局部变量可以重名,访问时遵循就近原则
- 属性随对象的创建而创建,随对象的销毁而销毁;局部变量随代码块的创建而创建,随代码块的销毁而销毁
- 全局变量可以加修饰符,局部变量不可以加修饰符。
7.7 构造器
完成对 新对象 的初始化
-
基本语法
[修饰符] 方法名 (形参列表) {
方法体;
}
-
一些说明
-
构造器的修饰符可以默认,也可以是private, protected, public
-
构造器没有返回值
-
方法名和类名字必须一样
-
参数列表和成员方法一样的规则
-
构造器可以重载
-
如果没有定义构造器,系统会自动给类生成一个默认无参构造器,比如
Person(){}
, 使用javap
进行反编译 -
一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器除非显式地定义。
-
7.8 this
-
java 虚拟机会给每个对象分配 this,代表当前对象
-
哪个对象调用,this就代表哪个对象
-
访问成员方法的语法:
this.方法名(参数列表);
-
访问构造器语法:
this(参数列表);
注意只能在构造器中使用(即只能在构造器中调用另一个构造器,必须放在第一条语句)