我在VScode学Java类与对象(Java显式参数和隐式参数、静态方法+main方法、Java访问修饰符、static关键字、Java的包、对象数组)第三辑

news2024/11/24 14:32:55

我的个人博客主页:如果’'真能转义1️⃣说1️⃣的博客主页
关于Java基本语法学习---->可以参考我的这篇博客:《我在VScode学Java》

续《我在VScode学Java(Java的类与对象)》 方法会操作对象并访问他们的实例字段。

  • 伍._. 显式参数和隐式参数:
    • 1. 显式参数(Explicit Parameters):
    • 2. 隐式参数(Implicit Parameters):
    • 关键字 this 指示隐式参数
  • 陆._.静态方法:
      • 以下是定义静态方法的格式:
      • 静态方法的使用:
      • 适用范围:
      • 注意事项:
    • 要调用静态方法,你可以使用类名直接调用,而不需要创建类的实例。例如,在其他类中调用staticMethod(),可以使用以下代码:
    • Main方法是一种特殊的静态方法。--->其不对任何对象操作。实际中,程序启动还没有任何对象
      • 在类中写main
      • 分开写的
  • 柒._. Java访问修饰符(四种):
    • 【 1 】代码:
      • **1. 代码示例:使用public访问修饰符**
      • **2. 代码示例:使用private访问修饰符**
      • **3. 代码示例:使用protected访问修饰符**
      • **4. 代码示例:使用default访问修饰符**
    • 【 2 】访问修饰符的存在是为了实现封装性和访问控制,以及提供对代码的良好组织和管理。以下是一些使用多种访问修饰符的原因:
    • 【 3 】注意事项:
  • 捌 ._. static关键字L:当在Java中使用 `static` 关键字时,它可以被用于方法、变量和内部类。下面我将一步步地讲解 `static` 关键字的不同用法。
      • 1. 静态变量(Static Variables)---> 在Java中,静态变量必须在类的作用域内声明,而不能在方法内部声明。
        • [ 1 ]错误提示:
        • [ 2 ]静态变量和实例变量是Java中两种不同类型的变量,它们之间有以下区别:
      • 2. 静态方法(Static Methods)
        • [ 1 ]在使用静态方法时,需要注意以下几点:
          • 1. 类的代码示例:
          • 2. 没有类的代码示例(静态方法在类外部):
        • [ 2 ]静态方法和实例方法在使用上有以下几个区别:
      • 3. 静态代码块(Static Blocks)
      • 4. 静态内部类(Static Inner Classes)
      • 总结
  • 玖._. Java包(package)
        • 包的使用范围,一个文件内能导入几个包:
    • 介绍
      • 包名:
        • 要使用库中的类或包,您需要使用关键字:import
  • Scanner类:
      • next() 与 nextLine() 区别
        • next():
        • nextLine():
    • 下面是一个使用Scanner类的示例:
  • 拾._.对象数组:

方法会操作对象并访问他们的实例字段。

伍._. 显式参数和隐式参数:

在Java中,显式参数和隐式参数是方法调用中的两种不同类型的参数。

1. 显式参数(Explicit Parameters):

它们是在方法调用时明确传递给方法的参数。
这些参数在方法调用表达式中以逗号分隔,并且要与方法定义中的形式参数匹配。显式参数提供了方法执行所需的具体值。

下面是一个示例代码:

public class ExplicitParametersExample {

    // 方法定义中的形式参数为 x 和 y
    public static int sum(int x, int y) {
        return x + y;
    }

    public static void main(String[] args) {
        int a = 5;
        int b = 10;

        // 显式参数 5 和 10 被传递给 sum 方法
        int result = sum(a, b);

        System.out.println("Sum: " + result);
    }
}

注释周期:

  • 第7行:sum 方法的参数 xy 是显式参数。
  • 第13行:sum(a, b) 中的 ab 是显式参数,它们被传递给 sum 方法进行求和操作。

解释:在上述示例中,sum 方法接收两个显式参数,将它们相加并返回结果。在 main 方法中,我们定义了变量 ab 并赋予它们具体的值。然后,我们调用 sum 方法并将变量 ab 作为显式参数传递给该方法。在方法内部,这些显式参数被用于执行求和操作,并将结果存储在 result 变量中。最后,我们打印出结果。

2. 隐式参数(Implicit Parameters):

它们是非显式传递给方法的参数,通常是指对象或类上下文中的成员变量或方法。
隐式参数不需要在方法调用表达式中显式提供,而是通过对象或类来访问。

下面是一个示例代码:

public class ImplicitParametersExample {

    private int value; // 隐式参数

    public void setValue(int newValue) {
        this.value = newValue;
    }

    public int getValue() {
        return value;
    }

    public static void main(String[] args) {
        ImplicitParametersExample example = new ImplicitParametersExample();

        example.setValue(42); // 隐式参数使用

        int result = example.getValue();
        System.out.println("Value: " + result);
    }
}

注释周期:

  • 第3行:value 是一个隐式参数,它是类 ImplicitParametersExample 的成员变量。
  • 第5行:setValue 方法接收一个隐式参数 newValue,并将其赋值给隐式参数 value
  • 第8行:getValue 方法返回隐式参数 value 的值。

解释:在上述示例中,我们创建了一个类 ImplicitParametersExample,它包含一个隐式参数 value,表示某个对象的特定值。在 main 方法中,我们创建了一个类的实例 example,然后通过调用 setValue 方法隐式地传递参数给隐式参数 value。接着,我们调用 getValue 方法来获取隐式参数 value 的值,并将其打印出来。

关键字 this 指示隐式参数

在Java中,关键字 this 用于指示隐式参数,而不是作为隐式参数本身。隐式参数通常是指对象或类上下文中的成员变量或方法。

在你提供的示例代码中,value 是一个隐式参数,它是类 ImplicitParametersExample 的成员变量。通过使用 this 关键字,我们可以访问隐式参数 value 并将其赋值为 newValue。所以,this.value = newValue; 是在使用隐式参数 value 来更新其值的操作。

总结:显式参数是在方法调用时明确传递的参数,而隐式参数是不需要显式提供,通过对象或类来访问的参数(通常是成员变量或方法)。

陆._.静态方法:

Java的静态方法是定义在类中的一种特殊类型的方法。这些方法与类本身相关,而不是与类的实例相关。可以通过类名直接调用静态方法,而无需创建类的实例。

以下是定义静态方法的格式:

access_modifier static return_type method_name(parameter_list) {
    // 方法体
}

其中:

  • access_modifier 表示访问修饰符,可以是 publicprivateprotected 或默认的访问修饰符。
  • static 关键字表示该方法是静态方法。
  • return_type 表示方法返回的数据类型,可以是基本类型或引用类型,如果方法不返回任何值,则使用 void
  • method_name 是方法的名称,按照命名规范进行命名。
  • parameter_list 是方法的参数列表,包含参数的类型和名称。

静态方法的使用:

  1. 可以通过类名直接调用静态方法,例如:ClassName.methodName(arguments)
  2. 在静态方法内部,只能调用类中定义的其他静态成员(包括静态变量和其他静态方法),不能访问非静态成员(实例变量或实例方法)。

适用范围:

  • 静态方法常用于工具类中的公共方法,这些方法与类的实例状态无关,主要用于提供通用的功能。

注意事项:

  • 由于静态方法不依赖于对象的状态,因此无法直接访问实例变量或实例方法。如果需要访问这些实例成员,可以通过创建类的实例来实现。
  • 静态方法无法被覆盖(override),子类只能隐藏父类的静态方法。
  • 静态方法不能使用 this 关键字,因为 this 指向当前对象,而静态方法与对象无关。
  • 静态方法可以在没有创建对象的情况下调用,但是在某些情况下,可能会影响应用程序的设计和结构,所以应该谨慎使用静态方法。

总结:静态方法是类级别的方法,可以通过类名直接调用,适用于提供通用的功能实现,但由于无法直接访问实例成员,使用时需注意上述事项。

要调用静态方法,你可以使用类名直接调用,而不需要创建类的实例。例如,在其他类中调用staticMethod(),可以使用以下代码:

Studentsss.staticMethod();
要调用返回char数组的方法printstu(),你需要首先创建Studentsss类的实例,然后使用该实例调用方法。例如:

Studentsss student = new Studentsss();
char[] result = student.printstu();
请注意,由于printstu()方法返回null,所以result变量将包含null值。你可以根据需要修改printstu()方法的实现,以返回所需的结果。
在这里插入图片描述

Main方法是一种特殊的静态方法。—>其不对任何对象操作。实际中,程序启动还没有任何对象

在类中写main

package work629;

class BOOK {
    private String author;
    private String title;
    private double price;
    private String publisher;
    private int publishedYear;

    public BOOK() {
    }

    public BOOK(String author, String title, double price, String publisher, int i) {
        this.author = author;
        this.title = title;
        this.price = price;
        this.publisher = publisher;
        this.publishedYear = i;
    }

    public String getAuthor() {
        return this.author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return this.title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public double getPrice() {
        return this.price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getPublisher() {
        return this.publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public int getPublishedYear() {
        return this.publishedYear;
    }

    public void setPublishedYear(int publishedYear) {
        this.publishedYear = publishedYear;
    }

    public void showDisplayBook() {
        System.out.println("Author: " + this.author);
        System.out.println("Title: " + this.title);
        System.out.println("Price: " + this.price);
        System.out.println("Publisher: " + this.publisher);
        System.out.println("Published Year: " + this.publishedYear);
    }

    public static void main(String[] args) {
        BOOK book123 = new BOOK("21", "32", 12, "32", 123);
        book123.showDisplayBook();
    }
}

分开写的

在这里插入图片描述

柒._. Java访问修饰符(四种):

在Java中,有四种访问修饰符:

  1. public:公共的访问修饰符,可以被任何类访问。如果一个类、方法或者变量使用了public修饰符,那么它们可以被任何其他类访问。

  2. protected:受保护的访问修饰符,可以被同一包内的其他类访问,以及该类的子类访问(不管是否在同一包内)。protected修饰符用于实现继承以及提供对相关类的一定程度的访问控制。

  3. default(默认):如果没有指定访问修饰符,即没有使用public、protected或private修饰符,那么该成员(类、方法或者变量)被默认为default访问修饰符。default修饰符允许同一包中的其他类访问。

  4. private:私有的访问修饰符,只能在同一类内访问,其他类无法访问私有成员。private修饰符主要用于实现封装,限制外部对类的访问,隐藏类内部的实现细节。

这些访问修饰符可应用于类、类的成员变量和方法,用于控制对类及其成员的访问级别,并确保良好的封装性和访问性。使用适当的访问修饰符可以提高代码的可维护性和安全性。

【 1 】代码:

1. 代码示例:使用public访问修饰符

public class Circle {
    public double radius;

    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle();
        circle.radius = 5.0;
        double area = circle.calculateArea();
        System.out.println("Area of the circle: " + area);
    }
}

好处:

  • 其他类可以直接访问Circle类的radius属性和calculateArea方法,无需通过中间层或者getter/setter方法来访问。
  • 允许其他类实例化Circle对象并调用其公共方法,以便执行相应的计算操作。

2. 代码示例:使用private访问修饰符

public class BankAccount {
    private String accountNumber;
    private double balance;

    public BankAccount(String accountNumber, double initialBalance) {
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }

    public void deposit(double amount) {
        balance += amount;
    }

    public void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
        } else {
            System.out.println("Insufficient balance");
        }
    }

    public double getBalance() {
        return balance;
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount("123456789", 1000.0);
        account.deposit(500.0);
        account.withdraw(200.0);
        double balance = account.getBalance();
        System.out.println("Current balance: " + balance);
    }
}

好处:

  • 通过将账户号码和余额设置为私有属性,可以防止其他类直接修改这些敏感信息,确保了数据的安全性。
  • 只允许通过公共方法进行存款、取款以及查询余额等操作,提供了更好的封装性和可控制性。
  • 可以在公共方法中进行逻辑验证,例如检查是否有足够的余额进行取款,从而保证了代码的正确性和可靠性。

3. 代码示例:使用protected访问修饰符

package com.example;

public class Shape {
    protected double area;

    protected void calculateArea() {
        // 计算面积的具体实现
    }
}

public class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        calculateArea();
        return area;
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);
        double area = circle.getArea();
        System.out.println("Area of the circle: " + area);
    }
}

好处:

  • 在Shape类中,将area属性和calculateArea方法设置为protected,这意味着它们可以被Circle类(在同一包中)继承并访问。
  • Circle类可以通过调用getArea方法来获取圆形的面积,而无需了解具体的计算过程。这样可以隐藏计算的细节并提高代码的抽象性和可重用性。

4. 代码示例:使用default访问修饰符

package com.example;

class Person {
    String name;
    int age;
    
    void displayInfo() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "John";
        person.age = 25;
        person.displayInfo();
    }
}

好处:

  • 在Person类中,没有指定任何访问修饰符(使用默认修饰符),这意味着该类只能在同一包中被访问和实例化。
  • 主类Main在同一个包中,可以创建Person对象并访问其属性和方法。但是在其他包中是无法访问Person类的,从而提供了一定程度的封装和隐藏性。

这些示例展示了不同访问修饰符的具体用法以及它们带来的好处。通过合理选择适当的访问修饰符,可以控制代码的可见性、封装性和可维护性,实现良好的代码组织和管理。

【 2 】访问修饰符的存在是为了实现封装性和访问控制,以及提供对代码的良好组织和管理。以下是一些使用多种访问修饰符的原因:

  1. 封装性:通过将成员变量和方法设置为private,可以隐藏类的内部实现细节,防止其他类直接访问和修改这些成员,从而确保数据的安全性和一致性。

  2. 访问控制:访问修饰符允许我们控制不同类之间的访问权限。public修饰符可以使得类的成员可被其他类访问,protected修饰符可以在继承关系中提供受限制的访问,default修饰符允许同一包中的其他类访问,并且private修饰符仅允许同一类内的访问。

  3. 模块化设计:访问修饰符有助于将代码划分为模块,每个模块可以有不同的访问级别。这种模块化设计使得代码更易于理解、维护和重用。

  4. 安全性和可靠性:通过限制对某些类成员的访问,可以减少错误和意外修改的可能性。只有有限的访问权限可以帮助我们保护重要的数据和方法,以确保代码的正确性和可靠性。

总之,访问修饰符的规定使得我们能够更好地控制代码的访问级别和使用范围,从而增强代码的封装性、安全性和可维护性。通过合理地选择适当的访问修饰符,我们可以组织和管理代码,并提供良好的编程实践。

【 3 】注意事项:

尽管访问修饰符在代码中有很多好处,但它们也可能带来一些潜在的坏处。以下是一些可能的问题:

  1. 过度暴露:使用public修饰符可能导致过度暴露类、方法或变量。如果不加限制地公开所有成员,其他类可能会直接访问和修改这些成员,从而破坏了封装性和数据的一致性。

  2. 过于限制:在某些情况下,过度使用private或protected修饰符可能会过于限制其他类对相关成员的访问。这可能导致其他类无法正常使用或扩展该类,从而降低了代码的可重用性和灵活性。

  3. 耦合性增加:当一个类使用了过多的protected成员时,它与其他继承它的子类之间可能产生紧密的耦合关系。这种紧密的耦合关系可能导致对基类的修改影响到子类的实现,从而增加了维护和扩展的难度。

  4. 可见性混乱:过多使用不同的访问修饰符可能导致代码的可见性变得混乱。特别是在大型项目中,过多的public、protected、default和private修饰符可能使得类之间的关系变得复杂,使代码难以理解和维护。

  5. 安全性风险:如果不正确地选择访问修饰符,可能会引入安全性风险。例如,将某些敏感信息设置为public或default访问修饰符,可能导致其他类或恶意用户直接访问和修改这些信息。

需要权衡和合理选择适当的访问修饰符,以确保代码具有适当的封装性、可维护性和安全性。遵循良好的设计原则和最佳实践,可以避免潜在的问题并提高代码质量。

捌 ._. static关键字L:当在Java中使用 static 关键字时,它可以被用于方法、变量和内部类。下面我将一步步地讲解 static 关键字的不同用法。

1. 静态变量(Static Variables)—> 在Java中,静态变量必须在类的作用域内声明,而不能在方法内部声明。

调用方式:
	对象名调用
	类名调用(推荐)

静态变量是被声明为 static 的成员变量。它们属于类而不是实例化对象,并且在整个类的所有实例之间共享相同的值。静态变量可以通过使用类名称直接访问,而不需要创建类的实例。

public class MyClass {
    static int myStaticVariable = 10;
    // ...
}

在上面的例子中,myStaticVariable 是一个静态变量,可以使用 MyClass.myStaticVariable 来访问它。

[ 1 ]错误提示:

在这里插入图片描述

[ 2 ]静态变量和实例变量是Java中两种不同类型的变量,它们之间有以下区别:

1. 作用域:

  • 静态变量(static variables)属于整个类,而不是类的实例。它们在类加载时被初始化,并且在整个类的所有实例之间共享相同的值。
  • 实例变量(instance variables)属于类的每个实例化对象。每个对象都有自己的实例变量副本,它们在对象创建时初始化。

2. 访问方式:

  • 静态变量可以通过类名直接访问,无需创建类的实例。(< 1 >在类的内部,可以在任何方法内直接访问静态变量;< 2 >在其他类中,可以通过类名访问该类中的静态变量。)例如:ClassName.staticVariable
  • 实例变量需要通过创建类的实例才能访问。(< 1 >在类的内部,可以在非静态方法中直接访问实例变量。< 2 >在本类的静态方法或其他类中则需要通过类的实例对象进行访问。)例如:objectName.instanceVariable

3. 生命周期:

  • 静态变量在类加载时初始化,并且在整个程序执行期间一直存在,直到程序终止。
  • 实例变量在对象创建时初始化,当对象不再被引用时,它们的内存会被垃圾回收器释放。

4. 内存占用:

  • 静态变量位于方法区(Method Area),只有一个副本。(所有实例都包含一个相同的常量属性,可以把这个属性定义为静态常量类型,从而节省内存空间)
  • 实例变量位于堆内存中的每个对象实例中,每个对象都有自己的副本。

5. 使用场景:

  • 静态变量适合保存与类相关的常量或需要在多个实例之间共享的数据。(静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据,增强实例之间的交互性。)
  • 实例变量适合保存对象的特定状态和属性。

下面是一个示例,演示了静态变量和实例变量的使用:

public class MyClass {
    static int staticVariable;
    int instanceVariable;

    public static void main(String[] args) {
        // 静态变量访问
        MyClass.staticVariable = 10;

        // 创建类的实例
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();

        // 实例变量访问
        obj1.instanceVariable = 20;
        obj2.instanceVariable = 30;
    }
}

在上面的示例中,staticVariable 是一个静态变量,可以通过类名直接访问。instanceVariable 是一个实例变量,需要通过创建类的实例来访问。

2. 静态方法(Static Methods)

调用方式:
	对象名调用
	类名调用(推荐)

静态方法是用 static 关键字修饰的方法。与静态变量类似,静态方法也属于类而不是实例化对象。它们可以通过类名直接调用,无需实例化对象。

public class MyClass {
    public static void myStaticMethod() {
        // 静态方法的实现
    }
    // ...
}

在上面的例子中,myStaticMethod() 是一个静态方法,可以通过 MyClass.myStaticMethod() 进行调用。

[ 1 ]在使用静态方法时,需要注意以下几点:

  1. 静态方法是属于类的,而不是类的实例。因此,可以通过类名直接调用静态方法,而无需创建类的实例。

  2. 静态方法不能访问类的非静态成员,如实例变量和非静态方法。它们只能访问静态成员,包括静态变量和其他静态方法。

  3. 静态方法中不能使用关键字"this",因为"this"代表当前对象的引用,而静态方法没有特定的对象实例。

  4. 静态方法在整个程序运行期间都存在,因此适合用于定义一些工具方法或公共方法,不依赖于对象的状态或实例化。

  5. 静态方法可以被子类继承和隐藏,但不能被子类重写。如果在子类中定义了与父类同名的静态方法,那么父类中的静态方法会被隐藏。

下面是一些关于类和没有类的代码示例:

1. 类的代码示例:
public class MathUtils {
    public static int add(int a, int b) {
        return a + b;
    }
}

// 调用类的静态方法
int sum = MathUtils.add(3, 5);
System.out.println(sum); // 输出:8
2. 没有类的代码示例(静态方法在类外部):
public class Main {
    public static void main(String[] args) {
        int result = Calculator.add(3, 5);
        System.out.println(result); // 输出:8
    }
}

// 定义静态方法
class Calculator {
    public static int add(int a, int b) {
        return a + b;
    }
}

请注意,以上示例仅用于说明静态方法的使用方法,并非完整的可运行代码。具体的代码实现可能需要更多的上下文和逻辑。

[ 2 ]静态方法和实例方法在使用上有以下几个区别:

  1. 访问方式:

    • 静态方法可以通过类名直接调用,无需创建类的实例。
    • 实例方法需要通过对象实例调用,必须先创建类的实例。
  2. 调用对象:

    • 静态方法没有特定的对象实例,因此不能访问实例变量或使用关键字"this"。
    • 实例方法是针对具体对象实例的操作,可以访问实例变量,并且可以使用关键字"this"引用当前对象。
  3. 内存分配:

    • 静态方法在程序运行期间一直存在于内存中,不依赖于对象的状态或实例化。
    • 实例方法需要在对象创建时分配内存,并且必须通过对象实例才能调用。
  4. 继承和重写:

    • 静态方法可以被子类继承和隐藏,但不能被子类重写。
    • 实例方法可以被子类继承、重写和覆盖。
  5. 访问权限:

    • 静态方法可以设置为public、protected、private等访问修饰符,控制其可见性。
    • 实例方法也可以设置为public、protected、private等访问修饰符,同时还可以使用默认访问修饰符(没有修饰符),在同一包内可见。

需要注意的是,静态方法适用于不依赖对象实例的操作,一般用于定义工具方法或公共方法;而实例方法适用于需要操作对象实例的行为。选择使用静态方法还是实例方法要根据具体的业务需求和设计目的来确定。

3. 静态代码块(Static Blocks)

静态代码块是在类加载过程中执行的一段代码块,用于对静态成员进行初始化操作或执行一些其他静态的预处理工作。静态代码块在类第一次被加载的时候执行,并且只会执行一次。

静态代码块的定义格式如下:

static {
    // 静态代码块的代码逻辑
}

静态代码块使用关键字static来修饰,后跟一对花括号{}包裹起来的代码块。在静态代码块内部可以编写任意的 Java 代码,用于完成相关的初始化或预处理操作。

静态代码块的特点如下:

  • 静态代码块在类加载时自动执行,只执行一次。
  • 静态代码块的执行顺序与其在源代码中的位置有关,先定义的静态代码块先执行。
  • 静态代码块不能接受传递给构造函数的参数,因为它不是用于创建对象实例的,而是在类加载过程中执行的。

静态代码块常见的应用包括:

  • 初始化静态变量:可以在静态代码块中对静态变量进行赋值或计算。
  • 执行一次性的静态预处理工作:比如加载配置文件、注册驱动程序等。

以下是一个静态代码块的示例:

public class MyClass {
    static {
        System.out.println("静态代码块执行");
        // 一些初始化操作或预处理工作
    }

    public static void main(String[] args) {
        System.out.println("主方法执行");
        // 主方法中的其他代码
    }
}

输出结果:

静态代码块执行
主方法执行

在上述示例中,静态代码块在类第一次被加载时执行,输出"静态代码块执行"。然后,调用了主方法,输出"主方法执行"。注意,静态代码块只会执行一次,不会因为创建对象实例而再次执行。

4. 静态内部类(Static Inner Classes)

静态内部类是定义在另一个类内部并被声明为 static 的类。它与外部类无关,并且可以直接通过外部类名访问。

public class OuterClass {
    static class StaticInnerClass {
        // 静态内部类的定义
    }
    // ...
}

在上面的例子中,StaticInnerClass 是一个静态内部类,可以使用 OuterClass.StaticInnerClass 来访问它。

总结

  • static 关键字用于创建静态成员,这些成员属于类而不是实例化对象。
  • 静态变量被整个类的所有实例共享,可以通过类名直接访问。
  • 静态方法不依赖于实例化对象,可以通过类名直接调用。
  • 静态代码块在类加载时执行一次,并用于初始化静态变量和执行其他与类有关的静态操作。
  • 静态内部类是定义在另一个类内部的类,并且可以直接通过外部类名访问。

Java静态变量是随着类的加载而加载的,它们在类被加载进内存时就会被初始化,并且在整个程序运行过程中只会有一份拷贝。相比之下,对象变量则需要在创建对象时才会被分配内存空间并进行初始化。因此,静态变量优先于对象的出现,可以通过类名直接访问,无需实例化对象。

玖._. Java包(package)

在Java中,包(Package)是一种用于组织和管理类和接口的机制。它提供了一种命名空间的概念,可以将相关的类和接口组织在一起,以便更好地组织和管理代码。

包的定义:
包是一个由点分隔的标识符序列,用于唯一标识一个类或接口所属的组织或模块。包名通常使用小写字母,按照约定采用逆域名命名规则,例如:com.example.mypackage

包的格式:
在源代码文件的开头,使用 package 声明来指定该文件中的类或接口所属的包。声明应该位于所有 import 语句之前,并且只能有一个包声明。例如:

package com.example.mypackage;

书写注意事项:

  • 包名应具有描述性,能够清晰表达其所包含的类或模块的功能。
  • 包名中使用小写字母,避免使用特殊字符或空格。
  • 包名要遵循逆域名命名规则,确保全局唯一性,避免与其他包产生冲突。
  • 包名中可以使用数字和下划线,但不推荐作为包名的开头字符。
  • 包名中的每个部分都应该是有效的标识符,不能使用Java的关键字作为包名。

简写形式:
Java中的包还支持使用通配符简写形式,用于导入整个包或包中的所有类。有两种常见的简写形式:

  • 导入整个包:import com.example.mypackage.*;,表示导入 com.example.mypackage 包中的所有类。
  • 导入特定类:import com.example.mypackage.MyClass;,表示只导入 com.example.mypackage 包中的 MyClass 类。

版本号:
包本身并不直接与版本号相关联,版本号更多地与类库(库文件)或JAR文件相关。在Maven等构建工具中,可以在依赖项声明中指定特定版本的库。例如,com.example:mylibrary:1.0.0 表示引用了名为 mylibrary 的库的版本 1.0.0

总之,包在Java中是一种组织和管理类和接口的机制,有固定的命名规则和书写格式。通过适当命名和组织包,可以提高代码的可读性、可维护性和模块化程度。

包的使用范围,一个文件内能导入几个包:

包的使用范围是限定在一个项目或模块内部,用于组织和管理代码。它帮助解决了命名冲突问题,并提供了更好的代码可读性和可维护性。

在一个Java源代码文件中,可以导入多个包。但是,只能有一个package声明用于指定该文件中的类或接口所属的包。这个声明应该放在文件顶部,位于所有import语句之前。

例如:

package com.example.mypackage;

import java.util.ArrayList;
import java.util.List;

上面的示例中,文件中的类或接口将归属于com.example.mypackage包。同时,通过import语句导入了java.util.ArrayListjava.util.List两个包,以便在代码中直接使用这些类而无需完整的类名。

在一个Java源代码文件中,可以根据需要导入多个包。每个import语句都可以单独指定一个包,也可以使用通配符(*)导入整个包或包中的所有类。

例如:

import java.util.*; // 导入java.util包下的所有类
import java.io.File; // 导入java.io包下的File类
import com.example.mypackage.MyClass; // 导入com.example.mypackage包下的MyClass类

需要注意的是,尽管可以导入多个包,但最好只导入实际需要使用的类,避免导入过多无用的类,以提高代码的可读性和维护性。重复导入同一个包是合法的,但没有额外的好处,因为只有一个package声明指定了文件中类所属的包。

介绍

Java 允许使用包(package) 将类组织在一个集合中。借助包可以方便地组织你的代码并将你自己的代码与其他人提供的代码库分开。

包名:

使用包的主要原因是确保类名的唯一性。假如两个程序员不约而同地提供了 Employee只要他们将自己的类放置在不同的包中,就不会产生冲突。
事实上,为了保证包名的绝对一性,可以使用一个因特网域名(这显然是唯一的)以逆序的形式作为包名,然后对于不的项目使用不同的子包。
例如,考虑域名 horstmann.c。如果逆序来写,就得到了包名cohorstmann。然后可以追加一个项目名,如com.horstmann.corejava。如果再把 Eployee 类放在这包里,那么这个类的“完全限定”名就是 com.horstmann.corejava,Employee。
注释:从编译器的角度来看,嵌套的包之间没有任何关系。例如,java.util 包与jutil.jar包毫无关系。每一个包都是独立的类集合。

要使用库中的类或包,您需要使用关键字:import

Scanner类:

Scanner类是Java中的一个工具类,用于从用户输入或文件中读取数据。它提供了一种简单的方式来解析基本类型和字符串。

要使用Scanner类,首先需要创建一个Scanner对象,并将输入源(如System.in或文件)作为参数传递给构造函数。然后,可以使用Scanner对象的方法来读取输入。

以下是Scanner类的一些常用方法:

next(): 读取并返回输入中的下一个单词(以空格分隔)。
nextInt(): 读取并返回输入中的下一个整数。
nextDouble(): 读取并返回输入中的下一个双精度浮点数。
nextLine(): 读取并返回输入中的下一行。

next() 与 nextLine() 区别

next():

1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。

nextLine():

1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。

下面是一个使用Scanner类的示例:

import java.util.Scanner;

public class MyClass {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入一个整数: ");
        int num = scanner.nextInt();
        System.out.println("您输入的整数是: " + num);

        System.out.print("请输入一个字符串: ");
        String str = scanner.next();
        System.out.println("您输入的字符串是: " + str);

        scanner.close();
    }
}

在上面的示例中,我们首先创建了一个Scanner对象,并将System.in作为输入源。然后,我们使用nextInt()方法读取用户输入的整数,并使用next()方法读取用户输入的字符串。最后,我们关闭了Scanner对象。

请注意,使用Scanner类时需要小心处理输入错误的情况,例如输入的数据类型与预期不符。可以使用异常处理机制来处理这些情况,以确保程序的稳定性和可靠性。

拾._.对象数组:

对象数组是一种数据结构,它可以存储多个对象。在Java中,可以使用对象数组来存储同一类的多个对象。每个数组元素都可以是该类的一个实例。

 public static void main(String[] args) {
        BOOK[] book = new BOOK[3];
        for (int i = 0; i < book.length; i++) {
            book[i] = new BOOK();
        }
        for (BOOK b : book) {
            b.showDisplayBook();
        }
    }

在访问数组中的对象时,需要进行类型转换。由于Object是所有类的基类,因此在存储和访问对象时,需要将其转换为实际的类型。

// 声明一个对象数组
Object[] myArray = new Object[5];

// 在数组中存储不同类型的对象
myArray[0] = "Hello";
myArray[1] = 42;
myArray[2] = new ArrayList<>();
myArray[3] = new Date();
myArray[4] = new MyClass();

// 访问数组中的对象
String str = (String) myArray[0];
int num = (int) myArray[1];
List<Object> list = (List<Object>) myArray[2];
Date date = (Date) myArray[3];
MyClass obj = (MyClass) myArray[4];

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合ehcache和redis实现多级缓存实战案例

一、概述 在实际的工作中&#xff0c;我们通常会使用多级缓存机制&#xff0c;将本地缓存和分布式缓存结合起来&#xff0c;从而提高系统性能和响应速度。本文通过springboot整合ehcache和redis实现多级缓存案例实战&#xff0c;从源码角度分析下多级缓存实现原理。 二、实战案…

STM32F407-- DMA使用

目录 1. DMA结构体 STM32F103&#xff1a; STM32F407&#xff1a; 2. F4系列实现存储器到存储器数据传输 1&#xff09;结构体配置&初始化 2&#xff09;主函数 补充知识点&#xff1a;关于变量存储的位置&#xff0c;关于内部存储器一般存储什么内容 3. F4系列实现…

Word 常用操作总结

文章目录 【公式篇】编号右对齐自动编号多行公式对齐编号右靠下编号右居中 公式引用更新编号 【公式篇】 简述&#xff1a;通过“#换行”的方式使编号右对齐&#xff0c;通过插入题注的方式使其自动编号&#xff0c;通过交叉引用的方式引用公式编号。 编号右对齐自动编号 在公…

【chrome】谷歌浏览器地址栏右侧“安装”按钮实现

这玩意学名叫PWA&#xff1a; 全称&#xff1a;Progressive Web App&#xff0c;是提升 Web App 的体验的一种新方法&#xff0c;能给用户原生应用的体验。 一、PWA安装条件&#xff1a; 在 Chrome 中&#xff0c;渐进式 Web 应用程序必须满足以下条件才能触发 beforeinstallpr…

session 生命周期和经典案例-防止非法进入管理页面

文章目录 session 生命周期和Session 经典案例-防止非法进入管理页面session 生命周期Session 生命周期-说明代码演示说明 Session 的生命周期创建CreateSession2创建ReadSession2 解读Session 的生命周期代码示例创建DeleteSession Session 经典案例-防止非法进入管理页面需求…

对接金蝶云星空,奥威软件SaaS BI能做的不止这一点

金蝶云星空提供了包括供应链管理、生产管理、销售与客户关系管理、人力资源管理、财务管理等功能&#xff0c;是一款基于云计算、大数据、人工智能等技术的商业智能软件服务。以云端数据可视化分析为主业的SaaS BI无一例外地提供了对接金蝶云星空数据源的路径&#xff0c;但接下…

你不能不知道的Word操作文本技巧!

在兽医诊所中&#xff0c;保持适宜的温湿度是非常重要的&#xff0c;因为动物的健康和舒适度受到环境条件的影响。 温度的控制对于动物的健康至关重要。过高或过低的温度可能会引起热应激或低体温等问题。适宜的温度范围有助于提供一个舒适的环境&#xff0c;促进动物的康复和治…

『CV学习笔记』ImportError: libGL.so.1和Dockerfile构建ubuntu18.04_miniconda_py37

ImportError: libGL.so.1: cannot open shared object file: No such file or directory 文章目录 一. opencv报错1.1. 解决办法11.2. 解决办法2二. Dockerfile文件(ubuntu18.04&miniconda_py37)一. opencv报错 容器报错内执行python程序报错ImportError: libGL.so.1: cann…

串口wifi6+蓝牙二合一系列模块选型参考和外围电路参考设计-WG236/WG237

针对物联网数据传输&#xff0c;智能控制等应用场景研发推出的高集成小尺寸串口WiFi串口蓝牙的二合一组合模块。WiFi符合802.11a/b/g/n无线标准&#xff0c;蓝牙支持低功耗蓝牙V4.2/V5.0 BLE/V2.1和EDR&#xff0c;WiFi部分的接口是UART&#xff0c;蓝牙部分是UART/PCM 接口。模…

又卡了,大数据平台容器化运维走起

文章目录 一、背景二、方案总结三、方案实施3.0 转移数据修改docker默认存储位置3.1 手动清理3.2 定时容器日志清理3.3 限制 Docker 容器日志大小 大家好&#xff0c;我是脚丫先生 (o^^o) 大数据基础平台的搭建&#xff0c;我采用的是全容器化Apache的大数据组件。 之前还很美…

基于协程和事件循环的c++网络库

完整资料进入【数字空间】查看——baidu搜索"writebug" 介绍 开发服务端程序的一个基本任务是处理并发连接&#xff0c;现在服务端网络编程处理并发连接主要有两种方式&#xff1a; 当“线程”很廉价时&#xff0c;一台机器上可以创建远高于CPU数目的“线程”。这时…

紧跟国家“新能源+”模式!涂鸦智慧能源方案助力夏季用电节能提效

“今天的你是几分熟&#xff1f;” 今年夏天&#xff0c;高温来得比往年更早&#xff0c;五六月份就提前开启了滚滚热浪模式&#xff0c;京津冀和山东等地最高气温也一度突破了历史极值。在提前到来的高温“烤”验下&#xff0c;全社会供电能力面临着极大挑战。 中国电力网预…

rce题目

<?php include "flag.php"; highlight_file(__FILE__); if(isset($_GET[HECTF])) { if (; preg_replace(/[^\W]\((?R)?\)/, NULL, $_GET[HECTF])) { if (!preg_match(/pos|high|op|na|info|dec|hex|oct|pi/i, $_GET[HECTF])) { eval(…

进阶C语言——字符串和内存函数

今天我们学点库函数 字符函数和字符串函数 求字符串长度函数->strlen strlen需要的头文件是string.h ,那它的作用是什么呢&#xff1f;&#xff1f; 他是来求字符串长度的&#xff0c;统计的是’\0’前的字符串长度 #include<stdio.h> #include<string.h> int …

office CVE-2022-30190 RCE 复现

简介: 当用户点击word等应用程序时&#xff0c;会使用URL协议调用MSDT,随即启动msdt.exe程序造成远程代码执行漏洞。简单来说就是攻击者可以恶意构造一个word文档&#xff0c;诱骗受害者点击&#xff0c;从而导致系统被黑。 0x01 环境部署 1. 测试版本 Microsoft Office LTSC …

FPGA XDMA 中断模式实现 PCIE3.0 视频采集 OV5640摄像头 提供2套工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案视频采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程1-->单路视频采集6、vivado工程2-->双路视频采集7、上板调试验证8、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI …

springboot整合feign实现RPC调用

目录 一、服务提供者 二、服务消费者 三、测试效果 feign/openfeign和dubbo是常用的微服务RPC框架&#xff0c;由于feigin内部已经集成ribbon&#xff0c;自带了负载均衡的功能&#xff0c;当有多个同名的服务注册到注册中心时&#xff0c;会根据ribbon默认的负载均衡算法将…

用 perfcollect 洞察 Linux 上.NET程序CPU爆高

一&#xff1a;背景 1. 讲故事 如果要分析 Linux上的 .NET程序 CPU 爆高&#xff0c;按以往的个性我肯定是抓个 dump 下来做事后分析&#xff0c;这种分析模式虽然不重但也不轻&#xff0c;还需要一定的底层知识&#xff0c;那有没有傻瓜式的 CPU 爆高分析方式呢&#xff1f;…

使用testify包辅助Go测试指南

我虽然算不上Go标准库的“清教徒”&#xff0c;但在测试方面还多是基于标准库testing包以及go test框架的&#xff0c;除了需要mock的时候&#xff0c;基本上没有用过第三方的Go测试框架。我在《Go语言精进之路》[2]一书中对Go测试组织的讲解也是基于Go testing包和go test框架…