四.面向对象编程(基础)
1.类与对象概念
- 类与对象
class Cat {
//属性、成员变量、字段(field)
String name;
int age;
String color;
String[] master;//属性可以是基本类型、也可以是引用类型
}//这是一个类
Cat cat1 = new Cat();//cat1是一个对象
-
对象的存在形式
-
访问修饰符:控制属性的访问范围(后边会详细讲 )
- public、protected、private、默认
-
Java创建对象流程(要理解,很重要!!)
- 先加载类信息(属性和方法信息,只会加载一次)
- 在堆中分配空间,根据类内属性类型进行默认初始化
- 把地址赋给对象名,也就是对象名指向对象数据
- 进行指定初始化
-
方法的调用机制原理
- 当程序执行到方法时,就会开辟一个独立的空间(栈空间)
- 当方法执行完毕,或者执行到return语句,就会返回到调用方法的地方
- 返回后继续执行方法后边的代码
- 当main()方法(栈)执行完毕,整个程序退出
-
方法的好处
- 提高代码的复用性
- 内部封装起来
-
方法里边不能嵌套方法!!!
-
类中方法调用
- 同一个类中的方法,直接调用即可,即不需要声明类对象
- 跨类中的方法A类调用B类中的方法,需要先声明一个对象,并通过对象名调用
public class Homework02{
public static void main(String[] args) {
A a = new A();
a.sayOk();
a.m1();
}
}
class A {
public void print (int n) {
System.out.println("print()方法被调用 n = "+n);
}
public void sayOk() {
System.out.println("sayOk()方法被执行");
print(10);
}
public void m1() {
System.out.println("m1()方法被调用");
B b = new B();
b.hi();
}
}
class B {
public void hi() {
System.out.println("B类中的hi()方法被执行");
}
}
- 参数传递机制
- 基本变量类型是值传递(拷贝),形参的任何改变不影响实参
- 引用变量类型是地址传递,形参的改变影响实参
2.递归
有时间再细看
3.重载、可变参数、作用域、构造器、this
-
重载:
- 同一个类中,多个同名方法存在,形参列表不一致
- 方法名必须相同,形参类型或者个数或者顺序至少有一个不一样,返回类型无要求
-
可变参数
- 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法
public int sum(int... nums){ //nums 可以传递0-N个int类型参数 int res = 0; for(int i = 0; i < nums.length; i++){ //可变参数可以当做数组来求长度 res += nums[i]; } return res; }
- 注意:一个形参列表中最多只能出现一个可变参数,且参数必须放到最后
-
作用域
-
全局变量
- 也就是属性,作用域是整个类,不赋值也有默认值
- 生命周期长,伴随对象的创建而创建,伴随对象的销毁而销毁
- 可以被本类使用,可以被其他类使用(通过对象调用属性)
- 可以加修饰符
-
局部变量
- 除了属性之外的其他变量,作用域为定义它的代码块中,必须赋值才能使用!
- 生命周期短,伴随着它的代码块而创建,即在一次方法调用的过程中
- 只能在对应的代码块中使用
- 不能加修饰符
-
细节:全局变量和局部变量可以重名,就近原则使用
-
-
构造器
- 分为有参构造器、无参构造器、默认构造器
- 构造器可以有修饰符(默认、public protected private)
- 构造器没有返回值,而且方法名必须和类名一致
- 构造器也是一种方法,所以可以重载
- 不写构造器,系统自动给一个默认无参数构造器(也叫默认构造器)
Dog dog = new Dog(); //这里用Dog()其实就是因为使用一下类的默认构造器
- 一个小技巧:反编译
- 在控制台数输入
javap Dog.class
即可以把class文件反编译为源文件java
- 在控制台数输入
- 一旦定义了自己的构造器,那默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非再显示的定义一下
public class MyClass { // 有参构造器 public MyClass(int value) { // 构造器的初始化逻辑 } // 显式定义无参构造器 public MyClass() { // 可以在这里添加初始化逻辑,或者留空表示不进行额外的初始化 } }
-
对象创建流程(理解了非常重要)
-
先加载Preson类信息,整个程序只会加载一次,加载到方法区
-
在堆中分配一个对象地址
-
完成对象初始化
3.1 默认初始化
3.2 显式初始化
3.3 构造器初始化
-
将对象在堆中的地址,返回给栈中的对象引用
-
-
this关键字
- 简单滴说,那个对象调用,this就代表哪个对象,可以把它理解成一个引用对象名
- this可以用来访问本类的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问成员方法的语法是:
this.方法名(参数列表)
- 访问构造器语法:
this(参数列表)
注意只能在构造器中使用(只能在构造器中访问另外一个构造器, 必须放在第一条语句)
- 简单滴说,那个对象调用,this就代表哪个对象,可以把它理解成一个引用对象名