Java类及类的成员:
面向对象的三大特征:
其它关键字:
面向对象的思想
类是抽象概念
对象是类的实例化。
面向对象的重点是类的设计,即设计类的成员。
属性(field):即成员变量,也称为域、字段
方法(method):即成员方法
1. 类和对象的使用
1.⭐设计类
2.对象的创建
3.通过“对象.属性”“对象.方法”调用对象结构
public class PersonTest {
public static void main(String[] args) {
//2.对象的创建
Person p1 = new Person();
//3.调用
p1.name = "Tom";
p1.isMale = true;
p1.eat();
p1.talk("English");
}
}
//1.设计类
class Person{
//属性
String name;
boolean isMale;
//方法
public void eat(){
System.out.println("人可以吃饭");
}
public void talk(String language){
System.out.println("人可以说话,语言:"+language);
}
}
对象的创建和使用:内存解析
堆:存放对象实例(new出来的结构),包括属性,类中未赋值的属性会存储初始值。同一个类的多个对象是完全独立的结构。
栈:存储局部变量(例如对象名),其中保存的是对象的首地址。
方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。
2.万事万物皆对象
- Java语言中:将功能和结构等都封装到类中,通过类的实例化来调用具体的功能结构。
- 涉及到Java语言和前端Html、后端的数据库交互时:前后端结构在Java层面交互时,都体现为类、对象。
3.属性(成员变量) vs 局部变量
- 不同点
1.在类中声明的位置不同:
属性:直接定义在类的{ }内。
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
2.权限修饰符不同
属性:可以在声明属性时,指明权限修饰符(private、public、缺省、protected)
局部变量:不可以使用权限修饰符
3.默认初始化值
属性:根据类型,有默认初始化值。
局部变量:没有默认初始化值,调用之前必须显式赋值。(形参在调用时赋值)
4.在内存中加载的位置
属性:堆空间(非static)
局部变量:栈空间中
4. 方法
描述类应该具有的功能。
分类:
可以分为有形参、无形参。
也可以分为有返回值、无返回值
方法的声明:
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
方法的重载
同一个类中,允许存在一个以上的重名方法,只要参数个数或参数类型不同即可。
和权限修饰符、返回值、形参变量名、方法体都无关。
public void getMax(int i,int j){...};
public void getMax(double i,double j){...};
println()方法也是方法的重载。println(int m),println(String s)……
可变个数形参
传入的实参可以是0个、1个、多个。
public void show(String ... strs){
System.out.println(strs.length);
System.out.println(strs[0]);
}
可变个数形参的方法同样能够构成重载。例如:
public void show(String s){
}
可变个数形参另一种方式:数组
注意:两种方式不构成重载,只能选其一,否则会冲突。
public void show(String[] strs){
}
方法中的可变个数形参必须在最后,因此可知一个方法的可变个数形参只能有一个。
public void show(int i,String ... strs){
}
方法的形参的值传递机制
- 基本数据类型的实参,传递给形参的是实参的值。方法内做出的改变不会影响方法外的实参
- 引用数据类型的实参,传递给形参的是实参的对象的地址,方法内做出的改变会修改对象。
递归方法
5. 创建对象数组
例如已经定义Student类,当需要创建很多学生对象时
//声明Student类型的数组
Student[] stus = new Student[20];
for(int i=0;i<20;i++){
//给数组元素赋值
stus[i] = new Student();
}
对象数组的内存解析
-
声明数组:
堆中:长为20的数组,存储的元素都是null
栈中:变量stus,存储数组的首地址 -
给数组元素赋值
堆中:新生成20个Student对象,对象中有各种属性;数组中的元素分别是对象的首地址。
6. 匿名对象
创建的对象没有显式赋给变量名。
特点:只能调用 一次。
例如有一个Phone类,属性price,方法sendEmail()、playGame()。
new Phone().sendEmail;
new Phone().playGame;