❤️ 类与对象
[!quote] 类
类 是具有相同属性和行为的一组对象的集合,是 Java 的基本组成单位,由属性和行为组成:
- 属性:通过成员变量【类中方法外的变量,描述类的属性】来体现
- 行为:通过成员方法【描述类的行为的一种方法】来体现
- 类其实就是一种数据类型,只不过比较特殊
[!hint] 深入理解类 类是非常抽象的,需要在其他类中实例化成对象,才能调用其方法【除了静态方法】
类的实质是一种引用数据类型,类似于
byte,short,int,long等基本数类。不同的是,他是一种复杂的数据类型(由于它是数据类型,不是数据,所以不存在于内存中,不能直接被操作,只有被实例化成对象,才变得可操作)
[!hint] 判断某个对象是否是某个类的实例
使用
instanceof
if(event instanceof ApplicationReadyEvent)检查当前的event对象是否是ApplicationReadyEvent类的实例,如果是则返回true,如果不是则返回false
💛 创建对象
💙 构造方法
[!quote] 构造方法 是方法名是类名的方法,是用来创建对象的
- 构建类
public class Rectangle {
private static int width;
private static int height;
//无参构造方法
public Rectangle(){
//当用无参构造方法创建对象时,就会执行这条语句
System.out.println("我是无参构造方法");
}
//带参构造方法
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
}- 实例化类
public class Demo{
public static void main(String[] args) {
// 创建对象,使用对象,()指创建Rectangle类型的对象后,自动调用Rectangle类中的构造方法,来进行成员变量的初始化
Rectangle r1 = new Rectangle(); //用无参构造方法创建对象
Rectangle r2 = new Rectangle(2, 3); //用带参构造方法创建对象
System.out.println(r2.getArea());
}
}
---
我是无参构造方法
6如果不想某个类被外部实例化,比如这个类是一个静态方法工具类,那就可以私有化构造函数 :
public class UtilityClass {
// 私有构造函数防止实例化
private UtilityClass() throws Exception {
throw new AssertionError("此类不能被实例化");
}
// 一个静态方法,提供工具功能
public static void utilityMethod() {
// 实现一些功能
}
}💛 对象与引用
Rectangle r1 = new Rectangle();new 出一个对象之后,会把这个对象在内存中的地址返回,通过这个地址就可以找到这个对象,那么我们上面的写法,Rectangle r1 = new Rectangle(); ,把这个对象在内存中的地址赋值给变量 r1,这个 r1 就叫做引用。而 new 出来的东西才是对象
[!hint]
- 构造方法 发生在实例对象赋值给引用变量之前
- 最好把对象的初始化设置在构造函数中,不要设置在构造函数之外的方法里,防止用户忘记调用方法初始化
❤️ 封装
[!quote] 封装 封装 就是将数据【
成员变量】和操作【方法·】封装在一个类中,并通过private限制对数据的直接访问,使得成员变量只能在本类被直接使用【其他类需要使用,需要本类提供】get,set方法
[!hint] 为什么要多此一举呢 ?
- 将类的内部实现细节隐藏起来,让代码更加的模块化
- 提供了
get,set方法来有效地控制操作数据,例如set内部,可以对输入值进行范围检查,类型转换 ……
`get`,`set` 方法的方法名是 “get / set”+ 首字母大写的变量名
public class student {
String name;
private int age;
public void setAge(int a) {
if (a < 0 | a > 100) {
this.age = a;
} else {
System.out.println("你输入的年龄有误");
}
}
public String getAge(){
String a = age+""; //把int转成String
System.out.println(a);
return a;
}
}public class studentTest {
public static void main(String[] args){
student s = new student();
s.name = "大绿坦";
s.setAge(30);
s.getAge();
}
}
---
30方法
[!quote] 方法 可以把方法理解为数学中的函数
- 方法不能嵌套
参数
[!quote] 形参 形参 是方法定义中的参数
javapublic static void isEven(int number){ //此处的number就是形参 number++; }
[!quote] 实参 实参 是方法调用中的参数
javaisEven(10); //此处的10就是实参
[!hint]+ 当我们将 基本数据类型 作为函数参数传递时,形参的改变不影响实参 因为基本数据类型在传递过程中是通过值传递的,函数会创建一个形参的副本来进行操作,而不是直接操作原始的实参
javapublic class Main { psvm { int num = 10; System.out.println("Before: " + num); modifyPrimitive(num); System.out.println("After: " + num); } public static void modifyPrimitive(int value) { value = 20; // 修改形参 System.out.println("Inside Method: " + value); } } -- Before: 10 Inside Method: 20 After: 10
[!hint]+ 当我们将 引用数据类型 作为函数参数传递时,形参的改变会影响实参 因为引用数据类型在传递过程中是通过引用传递的,函数操作的是实参的引用,所以对形参的修改会直接反映在原始的实参
javapublic class Main { public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println("Before: " + Arrays.toString(arr)); modifyReference(arr); System.out.println("After: " + Arrays.toString(arr)); } public static void modifyReference(int[] array) { array[0] = 10; // 修改形参 System.out.println("Inside Method: " + Arrays.toString(array)); } } -- Before: [1, 2, 3] Inside Method: [10, 2, 3] After: [10, 2, 3]
定义,调用
- 定义方法
// 定义方法
权限修饰符 状态修饰符 返回值 方法名(……方法参数) {
// 方法体
}// 方法无返回值
public static void isEvenNumber(int i) {
……
}
// 方法有返回值
public static int isEvenNumber1(int i) {
……
return i+1;
}- 调用方法
方法名(方法参数);isEvenNumber(1);方法重载
[!quote] 方法重载 方法重载 是在同一个类中,有多个具有不同参数【不同类型,或不同数量】,相同方法名的方法
public static int sum(int a, int b) {
return a + b;
}
public static double sum(double a, double b) {
return a + b;
}