Java学习笔记-类的基本概念
1.类和对象的关系
提取特征 --> 将属性行为放在一起构成类 --> 创造对象(将类实例化)
类 == 函数容器 + 自定义数据类型
类和对象的区别联系:
- 类是抽象的,概念的,代表一类事务,是自定义的数据类型。
- 对象是具体的,实际的,代表一个具体事务,是实例。
- 类是对象的模板,对象是类的一个个体,对应一个实例。
例如,人类,是一个类,但是某一个具体的人,就是一个对象。人类 == 类,我 == 对象, 眼睛 == 属性,看 == 方法。
2.属性/成员变量/字段
1)基本介绍:成员变量 = 属性 = field(字段).成员变量用来表示属性。
2)属性是类的组成部分,一般为基本数据类型,也可以为引用数据类型(对象,数组)。
如果不赋值,有默认值,规则同数组。
定义语法同变量。
访问修饰符可以控制属性的访问范围:public,protected,默认,private。
3.对象创建、属性访问
- 对象创建
-
- 先声明在创建
Cat cat;//声明 cat = new Cat;//创建
- 直接创建
Cat cat = new Cat();
- 先声明在创建
-
- 属性访问
- 对象名.属性名
cat.name;
- 对象名.属性名
Cat cat = new Cat();
分三部分①声明一个引用变量
Cat cat
; //声明变量只会分配存放位置的地址空间②创建对象
new Cat()
③连接对象和引用 =
Cat cat = new Cat();
//地址空间指向了实际的内容对象存在于堆上,cat 是一个引用变量,保存存取对象的方法,代表取得特定对象的位表示法。
4.内存分配机制
- 栈:存放基本数据类型(局部变量)
- 堆:存放对象(Cat cat,数组)
- 方法区:常量池(存放常量),类加载信息
Java对象创建流程分析:
Person p = new Person();
p.name = "jack";
p.age = 10;
1)先加载Person类的信息(属性和方法,只加载一次
2)在堆中分配空间,进行默认初始化
3)把地址赋给p,p指向对象
4)进行指定初始化,name,age
5.方法
-
成员方法:在类中定义成员方法,来完成对象的行为举动。类所描述的是对象知道什么与执行什么。
-
方法定义:
访问修饰符 返回数据类型 方法名(形参列表...){ //方法体
语句;
return 返回值;
}
public int getSum(int num1, int num2){
int res = num1 + num2;
return res;
}
1)形参列表:表示成员方法输入,getSum(int num1, int num2)
2)返回数据类型:表示成员方法输出,void
表示没有返回值,可以不用return或者只需要return;
3)方法主体:表示为了实现某一功能代码块
4)如果方法声明了非void
的返回类型,就一定要返回与声明类型一致或兼容的值
5)一个方法最多只能有一个返回值,但返回类型可以为任意类型,包括基本类型和引用类型
- 成员方法的传参机制:
基本类型是通过值传递的,传递的是值(值拷贝),通过拷贝传递,形参的改变不影响实参。
引用类型传递的是地址(传递的也是值,但是值是地址),可以通过形参影响实参。
4.调用机制:
好处:提高了代码复用性,可以封装细节供其他用户调用。
5.方法递归调用
- 递归就是自己调用自己,每次调用时传入不同的变量。
- 规则:
- 执行一个方法时,会创造一个新的受保护的独立空间(栈空间)
- 方法的局部变量是独立的,不会相互影响
- 如果方法中使用的是引用类型的变量,会共享该引用类型的数据
- 递归必须要向推出递归的条件逼近,否则无限递归会StackOverflowError,栈溢出
- 当方法执行完毕或者遇到return,会返回,遵循谁调用就将结果返回给谁
6.方法重载(OverLoad)
- 概念:Java中允许同一个类中有多个同名方法出现,但要求形参列表不一致。
- 方法名:必须相同
- 形参列表:必须不同(形参类型、个数、顺序,至少要有一样不同,参数名无要求)
- 返回类型:无要求
- 好处:减轻了记名起名的麻烦。
与 void show(int a, char b, double c){}构成重载的
void show(int a, char y ,double z){} //不是,形参类型、顺序、个数是相同,改变的只有参数名
void show(int a, double c, char b){} //是,形参类型、个数、顺序都不同
void show(double c){} //是,形参类型、个数、顺序都不同
double show(int a, char b, double c){} //不是,形参无改变,改变返回形式无影响
-
可变参数:Java允许同类中多个同名同功能但参数个数不同的方法,封装成一个方法,就通过可变参数实现。
- 基本语法: 访问修饰符 返回类型 方法名(数据类型… 形参名){}
public void f1(int... nums){ System.out.println("长度" + nums.length); } public void f2(String str, double... nums){ } 1)可变参数的实参为0个或任意多个 2)可变参数的实参可以为数组 3)可变参数的本质是数组 4)可变参数可以和普通类型的参数一起放在形参列表,但可变参苏要放在最后 5)一个形参列表中只能出现一个可变参数
7.作用域
- 变量:
- 成员变量(属性):
- 作用域为整个类体,可以不赋初值,有默认值。
- 可以加修饰符。被本类或其他类通过对象调用使用。
- 存在于对象所属的堆空间上,存放于对象中
- 局部变量:
- 定义在成员方法中的变量,必须赋初值,没有默认值。
- 作用域为定义的代码块中。不可以加修饰符。只能在本类对应方法使用
- 存在于栈上相对应的堆栈
- 成员变量(属性):
- 属性和局部变量可以重名,访问遵循就近原则。相同作用域中,局部变量不能重名。
8.构造器/构造方法
-
概念:构造方法又叫构造器,是类的一种特殊方法,作用是完成对新形象的初始化
-
特点:
- 方法名和类名相同
- 没有返回值
- 创建对象时系统会自动调用该类的构造器完成初始化
-
基本语法: [修饰符] 方法名(形参列表){ 方法体; } //修饰符可以默认也可以public、protected、private Person p1 = new Person("jack",18); //new Person() 创造对象过程中是要调用构造函数,在初始化时执行 class Person(){ public Person(String name, int age){ } Person(){ //无参构造器显式定义 } }
- 构造器可以重载
- 构造器名要与类名相同
- 构造器没有返回值
- 构造器是完成对象的初始化,并不是创建对象
- 创造对象时,自动调用构造器
- 没有定义构造器,系统会默认生成无参构造器
- 定义了构造器后,默认的构造器会被覆盖,如果要使用默认的午餐构造器,要显式定义
-
对象创造流程分析:
Person p = new Person("小小",20); class Person{ int age = 90; String name; Person(String n, int a){ name = n; age = a; } } 1.加载Person类的信息,只加载一次 2.在堆中分配空间 3.对象初始化 3.1默认初始化,age = 0,name = null 3.2显式初始化,age = 90,name = null 3.3构造器初始化,age = 90,name = "小小" 4.把对象在堆中的地址返回给p
9.this关键字
- Java虚拟机给每个对象分配
this
代表当前对象。- 哪个对象调用,this就代表哪个对象
- 用于区分当前类的属性和局部变量
class Person{
int age;
String name;
/*
Person(String n, int a){ //传入的形参代表类中的属性,但n和a属于局部变量,而不是属性,于是提出this
name = n;
age = a;
}
*/
//等价于上边
Person(String name, int age){ //this.name表示当前对象的属性name
this.name = name;
this.age = age;
}
}
访问成员方法:this.方法名(参数列表)
访问构造器语法:this(参数列表),只能在构造器中使用,必须放在第一条,即在一个构造器中调用另一个