一,Java面向对象的特点其一:封装

bjynjj / 2024-10-29 / 原文

Java面向对象:深入理解封装

在Java编程中,封装是面向对象编程的核心概念之一,它允许我们隐藏对象的内部状态和行为,只暴露有限的访问接口。封装的目的是增强安全性和简化复杂性,同时提供代码复用性。本文将详细探讨Java中的封装机制,包括private关键字、this关键字、构造方法和static关键字的使用和特点。

private关键字

private关键字用于限制成员变量和方法的访问权限,确保它们只能在类内部被访问。

特点

  • private修饰的成员只能在同一个类中互相访问。

示例代码

public class PrivateDemo {
    private int secretNumber = 42; // 私有成员变量

    public int getSecretNumber() {
        return secretNumber; // 提供外部访问的公共方法
    }
}

this关键字

this关键字用于引用当前对象的实例,即当前方法所属对象。

使用方式

  • 成员变量this.成员变量名
  • 构造方法this(参数列表);
  • 成员方法this.成员方法名(参数列表);

示例代码

public class ThisDemo {
    private String name;

    public ThisDemo(String name) {
        this.name = name; // 使用this关键字引用成员变量
    }

    public void showName() {
        System.out.println(this.name); // 使用this关键字引用成员方法
    }
}

方法重载(Overloading)详解

在Java编程中,方法重载(Method Overloading)是一种允许在同一个类中定义多个同名方法,但参数列表(参数类型和数量)不同的技术。这是多态性的一种形式,允许根据传入的参数类型和数量来决定调用哪个方法。方法重载使得我们可以定义多个行为相同但操作不同数据类型的方法。例如,我们可以定义多个名为print的方法,一个接受一个int参数,另一个接受一个String参数。

特点

  1. 方法名相同:所有重载方法必须有相同的方法名。
  2. 参数列表不同:参数的数量或类型必须不同。
  3. 返回类型可以相同或不同:返回类型可以相同也可以不同,但这不影响重载决策。
  4. 访问修饰符和返回类型不影响重载:访问修饰符(如public, private)和返回类型不影响重载。

示例代码

public class OverloadingExample {
    // 重载方法:接受一个int参数
    public void print(int number) {
        System.out.println("整数: " + number);
    }

    // 重载方法:接受一个String参数
    public void print(String text) {
        System.out.println("字符串: " + text);
    }

    // 重载方法:接受两个int参数
    public void print(int num1, int num2) {
        System.out.println("两个整数的和: " + num1 + " + num2);
    }

    public static void main(String[] args) {
        OverloadingExample example = new OverloadingExample();
        example.print(10); // 调用接受一个int的方法
        example.print("Hello"); // 调用接受一个String的方法
        example.print(3, 4); // 调用接受两个int的方法
    }
}

注意事项

  1. 参数列表差异:重载主要通过参数列表的不同来区分不同的方法。
  2. 调用时的决策:JVM在运行时根据方法调用时提供的参数类型和数量来决定调用哪个重载方法。
  3. 返回类型不影响重载:即使两个重载方法的返回类型不同,也不会影响重载。

总结

方法重载是Java中一个强大的特性,它提供了灵活性和可读性,使得我们可以为不同的数据类型定义行为相似的方法。理解方法重载对于编写清晰、可维护的代码非常重要。通过方法重载,我们可以更好地组织代码,避免方法名的冲突,同时提供更丰富的API。

构造方法

构造方法的主要作用是在创建对象时设置对象的初始状态。每个类可以有多个构造方法,只要它们的参数列表不同。

特点

  1. 方法名与类名保持一致:构造方法的名称必须与类名相同。
  2. 没有返回值:构造方法不返回任何值,包括void
  3. JVM自动提供默认构造方法:如果没有显式定义构造方法,Java虚拟机(JVM)会提供一个无参的默认构造方法。
  4. 重载:可以定义多个构造方法,只要它们的参数列表不同。

示例代码

public class Person {
    private String name;
    private int age;

   // 无参构造方法
   public Person() {
       this.name = "Unknown";
       this.age = 0;
   }

   // 有参构造方法
   public Person(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public void display() {
       System.out.println("Name: " + this.name + ", Age: " + this.age);
   }
}

public class ConstructorExample {
    public static void main(String[] args) {
         Person p1 = new Person(); // 调用无参构造方法
         Person p2 = new Person("John", 30); // 调用有参构造方法

         p1.display(); // 输出: Name: Unknown, Age: 0
         p2.display(); // 输出: Name: John, Age: 30
    }
}

注意事项

  1. 如果类中没有定义任何构造方法,JVM会提供一个默认的无参构造方法。
  2. 如果类中定义了至少一个构造方法,JVM将不再提供默认构造方法。
  3. 构造方法可以重载,即一个类可以有多个构造方法,只要它们的参数列表不同。

构造方法的重载

构造方法的重载允许一个类有多个构造方法,这在创建具有不同初始状态的对象时非常有用。

总结

构造方法是对象创建和初始化的关键部分。理解构造方法的工作原理和如何重载构造方法是Java面向对象编程的基础。通过使用构造方法,我们可以确保每个创建的对象都处于一个一致和有效的初始状态。

static关键字

static关键字用于修饰成员变量和成员方法,表示它们属于类,而不是类的某个对象。

特点

  1. 可以直接通过类名进行访问使用。
  2. 随着类的加载,而加载到方法区中的静态区。
  3. 优先于对象而存在。
    4.静态成员只之间可以互相访问,但是不能访问动态成员:而动态成员既可以访问静态的成员也可以访问动态的成员
    5.修饰成员变量使其变成共享的

示例代码

//创建类
class Person{
    //成员变量私有化
    private int age;
    private String name;
    private static String national;//static修饰的成员变量变成了共享的变量

    //构造方法无参和有参
    public Person() {
    }

    public Person( String name, int age,String national) {
        this.age = age;
        this.name = name;
        this.national = national;
    }

    //成员方法get和set


    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNational() {
        return national;
    }

    public void setNational(String national) {
        this.national = national;
    }

    //show方法
    public void show(){
        System.out.println("姓名:"+getName()+" 年龄:"+getAge()+" 国籍:"+getNational());
    }
}


//测试类
public class Demo2static {
    public static void main(String[] args) {
        //调用方法先创建对象
        Person p1 = new Person("张三",12,"");
        p1.setAge(88);
        Person p2 = new Person("李四",22,"中国");
        p1.show();
        p2.show();
    }

}