Skip to content

❤️ 类与对象

[!quote] 类

类 是具有相同属性和行为的一组对象的集合,是 Java 的基本组成单位,由属性和行为组成:

  • 属性:通过成员变量【类中方法外的变量,描述类的属性】来体现
  • 行为:通过成员方法【描述类的行为的一种方法】来体现
  • 类其实就是一种数据类型,只不过比较特殊

[!hint] 深入理解类 类是非常抽象的,需要在其他类中实例化成对象,才能调用其方法【除了静态方法】

类的实质是一种引用数据类型,类似于 byteshortintlong 等基本数类。不同的是,他是一种复杂的数据类型(由于它是数据类型,不是数据,所以不存在于内存中,不能直接被操作,只有被实例化成对象,才变得可操作


[!hint] 判断某个对象是否是某个类的实例

使用 instanceof

if(event instanceof ApplicationReadyEvent) 检查当前的 event 对象是否是 ApplicationReadyEvent 类的实例,如果是则返回 true ,如果不是则返回 false

💛 创建对象

💙 构造方法

[!quote] 构造方法 是方法名是类名的方法,是用来创建对象

  • 构建类
java
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;  
    }   
}
  • 实例化类
java
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

如果不想某个类被外部实例化,比如这个类是一个静态方法工具类,那就可以私有化构造函数

java
public class UtilityClass {

    // 私有构造函数防止实例化
    private UtilityClass() throws Exception {
        throw new AssertionError("此类不能被实例化");
    }

    // 一个静态方法,提供工具功能
    public static void utilityMethod() {
        // 实现一些功能
    }
}

💛 对象与引用

java
Rectangle r1 = new Rectangle();

new 出一个对象之后,会把这个对象在内存中的地址返回,通过这个地址就可以找到这个对象,那么我们上面的写法,Rectangle r1 = new Rectangle(); ,把这个对象在内存中的地址赋值给变量 r1,这个 r1 就叫做引用。而 new 出来的东西才是对象


[!hint]

  • 构造方法 发生在实例对象赋值给引用变量之前
  • 最好把对象的初始化设置在构造函数中,不要设置在构造函数之外的方法里,防止用户忘记调用方法初始化

❤️ 封装

[!quote] 封装 封装 就是将数据【成员变量】和操作【方法·】封装在一个类中,并通过 private 限制对数据的直接访问,使得成员变量只能在本类被直接使用【其他类需要使用,需要本类提供 getset 方法

[!hint] 为什么要多此一举呢 ?

  • 将类的内部实现细节隐藏起来,让代码更加的模块化
  • 提供了 getset 方法来有效地控制操作数据,例如 set 内部,可以对输入值进行范围检查,类型转换 ……

`get`,`set` 方法的方法名是 “get / set”+ 首字母大写的变量名

java
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;
    }
}
java
public class studentTest {
    public static void main(String[] args){
        student s = new student();
        s.name = "大绿坦";
        s.setAge(30);
        s.getAge();
	}
}

---
30

方法

[!quote] 方法 可以把方法理解为数学中的函数

  • 方法不能嵌套

参数

[!quote] 形参 形参 是方法定义中的参数

java
public static void isEven(int number){ //此处的number就是形参
	number++;                        
}

[!quote] 实参 实参 是方法调用中的参数

java
isEven(10);  //此处的10就是实参

[!hint]+ 当我们将 基本数据类型 作为函数参数传递时,形参的改变不影响实参 因为基本数据类型在传递过程中是通过值传递的,函数会创建一个形参的副本来进行操作,而不是直接操作原始的实参

java
public 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]+ 当我们将 引用数据类型 作为函数参数传递时,形参的改变会影响实参 因为引用数据类型在传递过程中是通过引用传递的,函数操作的是实参的引用,所以对形参的修改会直接反映在原始的实参

java
public 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]

定义,调用

  • 定义方法
java
// 定义方法
权限修饰符 状态修饰符 返回值 方法名(……方法参数) {
	// 方法体
}
java
// 方法无返回值
public static void isEvenNumber(int i) {
	……
}

// 方法有返回值
public static int isEvenNumber1(int i) {
	……
	return i+1;
}
  • 调用方法
java
方法名(方法参数);
java
isEvenNumber(1);

方法重载

[!quote] 方法重载 方法重载 是在同一个类中,有多个具有不同参数【不同类型,或不同数量】,相同方法名的方法

java
public static int sum(int a, int b) {  
    return a + b;  
}  
  
public static double sum(double a, double b) {  
    return a + b;  
}