我的个人博客主页:如果’'真能转义1️⃣说1️⃣的博客主页
关于Java基本语法学习---->可以参考我的这篇博客:《我在VScode学Java》
在Java中,显式参数和隐式参数是方法调用中的两种不同类型的参数。
它们是在方法调用时明确传递给方法的参数。
这些参数在方法调用表达式中以逗号分隔,并且要与方法定义中的形式参数匹配。显式参数提供了方法执行所需的具体值。
下面是一个示例代码:
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);
}
}
注释周期:
sum
方法的参数 x
和 y
是显式参数。sum(a, b)
中的 a
和 b
是显式参数,它们被传递给 sum
方法进行求和操作。解释:在上述示例中,sum
方法接收两个显式参数,将它们相加并返回结果。在 main
方法中,我们定义了变量 a
和 b
并赋予它们具体的值。然后,我们调用 sum
方法并将变量 a
和 b
作为显式参数传递给该方法。在方法内部,这些显式参数被用于执行求和操作,并将结果存储在 result
变量中。最后,我们打印出结果。
它们是非显式传递给方法的参数,通常是指对象或类上下文中的成员变量或方法。
隐式参数不需要在方法调用表达式中显式提供,而是通过对象或类来访问。
下面是一个示例代码:
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);
}
}
注释周期:
value
是一个隐式参数,它是类 ImplicitParametersExample
的成员变量。setValue
方法接收一个隐式参数 newValue
,并将其赋值给隐式参数 value
。getValue
方法返回隐式参数 value
的值。解释:在上述示例中,我们创建了一个类 ImplicitParametersExample
,它包含一个隐式参数 value
,表示某个对象的特定值。在 main
方法中,我们创建了一个类的实例 example
,然后通过调用 setValue
方法隐式地传递参数给隐式参数 value
。接着,我们调用 getValue
方法来获取隐式参数 value
的值,并将其打印出来。
在Java中,关键字 this 用于指示隐式参数,而不是作为隐式参数本身。隐式参数通常是指对象或类上下文中的成员变量或方法。
在你提供的示例代码中,value 是一个隐式参数,它是类 ImplicitParametersExample 的成员变量。通过使用 this 关键字,我们可以访问隐式参数 value 并将其赋值为 newValue。所以,this.value = newValue; 是在使用隐式参数 value 来更新其值的操作。
总结:显式参数是在方法调用时明确传递的参数,而隐式参数是不需要显式提供,通过对象或类来访问的参数(通常是成员变量或方法)。
Java的静态方法是定义在类中的一种特殊类型的方法。这些方法与类本身相关,而不是与类的实例相关。可以通过类名直接调用静态方法,而无需创建类的实例。
access_modifier static return_type method_name(parameter_list) {
// 方法体
}
其中:
access_modifier
表示访问修饰符,可以是 public
、private
、protected
或默认的访问修饰符。static
关键字表示该方法是静态方法。return_type
表示方法返回的数据类型,可以是基本类型或引用类型,如果方法不返回任何值,则使用 void
。method_name
是方法的名称,按照命名规范进行命名。parameter_list
是方法的参数列表,包含参数的类型和名称。ClassName.methodName(arguments)
。this
关键字,因为 this
指向当前对象,而静态方法与对象无关。总结:静态方法是类级别的方法,可以通过类名直接调用,适用于提供通用的功能实现,但由于无法直接访问实例成员,使用时需注意上述事项。
Studentsss.staticMethod();
要调用返回char数组的方法printstu(),你需要首先创建Studentsss类的实例,然后使用该实例调用方法。例如:
Studentsss student = new Studentsss();
char[] result = student.printstu();
请注意,由于printstu()方法返回null,所以result变量将包含null值。你可以根据需要修改printstu()方法的实现,以返回所需的结果。
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中,有四种访问修饰符:
public:公共的访问修饰符,可以被任何类访问。如果一个类、方法或者变量使用了public修饰符,那么它们可以被任何其他类访问。
protected:受保护的访问修饰符,可以被同一包内的其他类访问,以及该类的子类访问(不管是否在同一包内)。protected修饰符用于实现继承以及提供对相关类的一定程度的访问控制。
default(默认):如果没有指定访问修饰符,即没有使用public、protected或private修饰符,那么该成员(类、方法或者变量)被默认为default访问修饰符。default修饰符允许同一包中的其他类访问。
private:私有的访问修饰符,只能在同一类内访问,其他类无法访问私有成员。private修饰符主要用于实现封装,限制外部对类的访问,隐藏类内部的实现细节。
这些访问修饰符可应用于类、类的成员变量和方法,用于控制对类及其成员的访问级别,并确保良好的封装性和访问性。使用适当的访问修饰符可以提高代码的可维护性和安全性。
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);
}
}
好处:
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);
}
}
好处:
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);
}
}
好处:
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();
}
}
好处:
这些示例展示了不同访问修饰符的具体用法以及它们带来的好处。通过合理选择适当的访问修饰符,可以控制代码的可见性、封装性和可维护性,实现良好的代码组织和管理。
封装性:通过将成员变量和方法设置为private,可以隐藏类的内部实现细节,防止其他类直接访问和修改这些成员,从而确保数据的安全性和一致性。
访问控制:访问修饰符允许我们控制不同类之间的访问权限。public修饰符可以使得类的成员可被其他类访问,protected修饰符可以在继承关系中提供受限制的访问,default修饰符允许同一包中的其他类访问,并且private修饰符仅允许同一类内的访问。
模块化设计:访问修饰符有助于将代码划分为模块,每个模块可以有不同的访问级别。这种模块化设计使得代码更易于理解、维护和重用。
安全性和可靠性:通过限制对某些类成员的访问,可以减少错误和意外修改的可能性。只有有限的访问权限可以帮助我们保护重要的数据和方法,以确保代码的正确性和可靠性。
总之,访问修饰符的规定使得我们能够更好地控制代码的访问级别和使用范围,从而增强代码的封装性、安全性和可维护性。通过合理地选择适当的访问修饰符,我们可以组织和管理代码,并提供良好的编程实践。
尽管访问修饰符在代码中有很多好处,但它们也可能带来一些潜在的坏处。以下是一些可能的问题:
过度暴露:使用public修饰符可能导致过度暴露类、方法或变量。如果不加限制地公开所有成员,其他类可能会直接访问和修改这些成员,从而破坏了封装性和数据的一致性。
过于限制:在某些情况下,过度使用private或protected修饰符可能会过于限制其他类对相关成员的访问。这可能导致其他类无法正常使用或扩展该类,从而降低了代码的可重用性和灵活性。
耦合性增加:当一个类使用了过多的protected成员时,它与其他继承它的子类之间可能产生紧密的耦合关系。这种紧密的耦合关系可能导致对基类的修改影响到子类的实现,从而增加了维护和扩展的难度。
可见性混乱:过多使用不同的访问修饰符可能导致代码的可见性变得混乱。特别是在大型项目中,过多的public、protected、default和private修饰符可能使得类之间的关系变得复杂,使代码难以理解和维护。
安全性风险:如果不正确地选择访问修饰符,可能会引入安全性风险。例如,将某些敏感信息设置为public或default访问修饰符,可能导致其他类或恶意用户直接访问和修改这些信息。
需要权衡和合理选择适当的访问修饰符,以确保代码具有适当的封装性、可维护性和安全性。遵循良好的设计原则和最佳实践,可以避免潜在的问题并提高代码质量。
static
关键字时,它可以被用于方法、变量和内部类。下面我将一步步地讲解 static
关键字的不同用法。调用方式:
对象名调用
类名调用(推荐)
静态变量是被声明为 static
的成员变量。它们属于类而不是实例化对象,并且在整个类的所有实例之间共享相同的值。静态变量可以通过使用类名称直接访问,而不需要创建类的实例。
public class MyClass {
static int myStaticVariable = 10;
// ...
}
在上面的例子中,myStaticVariable
是一个静态变量,可以使用 MyClass.myStaticVariable
来访问它。
1. 作用域:
2. 访问方式:
ClassName.staticVariable
。objectName.instanceVariable
。3. 生命周期:
4. 内存占用:
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
是一个实例变量,需要通过创建类的实例来访问。
调用方式:
对象名调用
类名调用(推荐)
静态方法是用 static
关键字修饰的方法。与静态变量类似,静态方法也属于类而不是实例化对象。它们可以通过类名直接调用,无需实例化对象。
public class MyClass {
public static void myStaticMethod() {
// 静态方法的实现
}
// ...
}
在上面的例子中,myStaticMethod()
是一个静态方法,可以通过 MyClass.myStaticMethod()
进行调用。
静态方法是属于类的,而不是类的实例。因此,可以通过类名直接调用静态方法,而无需创建类的实例。
静态方法不能访问类的非静态成员,如实例变量和非静态方法。它们只能访问静态成员,包括静态变量和其他静态方法。
静态方法中不能使用关键字"this",因为"this"代表当前对象的引用,而静态方法没有特定的对象实例。
静态方法在整个程序运行期间都存在,因此适合用于定义一些工具方法或公共方法,不依赖于对象的状态或实例化。
静态方法可以被子类继承和隐藏,但不能被子类重写。如果在子类中定义了与父类同名的静态方法,那么父类中的静态方法会被隐藏。
下面是一些关于类和没有类的代码示例:
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
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;
}
}
请注意,以上示例仅用于说明静态方法的使用方法,并非完整的可运行代码。具体的代码实现可能需要更多的上下文和逻辑。
访问方式:
调用对象:
内存分配:
继承和重写:
访问权限:
需要注意的是,静态方法适用于不依赖对象实例的操作,一般用于定义工具方法或公共方法;而实例方法适用于需要操作对象实例的行为。选择使用静态方法还是实例方法要根据具体的业务需求和设计目的来确定。
静态代码块是在类加载过程中执行的一段代码块,用于对静态成员进行初始化操作或执行一些其他静态的预处理工作。静态代码块在类第一次被加载的时候执行,并且只会执行一次。
静态代码块的定义格式如下:
static {
// 静态代码块的代码逻辑
}
静态代码块使用关键字static
来修饰,后跟一对花括号{}
包裹起来的代码块。在静态代码块内部可以编写任意的 Java 代码,用于完成相关的初始化或预处理操作。
静态代码块的特点如下:
静态代码块常见的应用包括:
以下是一个静态代码块的示例:
public class MyClass {
static {
System.out.println("静态代码块执行");
// 一些初始化操作或预处理工作
}
public static void main(String[] args) {
System.out.println("主方法执行");
// 主方法中的其他代码
}
}
输出结果:
静态代码块执行
主方法执行
在上述示例中,静态代码块在类第一次被加载时执行,输出"静态代码块执行"。然后,调用了主方法,输出"主方法执行"。注意,静态代码块只会执行一次,不会因为创建对象实例而再次执行。
静态内部类是定义在另一个类内部并被声明为 static
的类。它与外部类无关,并且可以直接通过外部类名访问。
public class OuterClass {
static class StaticInnerClass {
// 静态内部类的定义
}
// ...
}
在上面的例子中,StaticInnerClass
是一个静态内部类,可以使用 OuterClass.StaticInnerClass
来访问它。
static
关键字用于创建静态成员,这些成员属于类而不是实例化对象。Java静态变量是随着类的加载而加载的,它们在类被加载进内存时就会被初始化,并且在整个程序运行过程中只会有一份拷贝。相比之下,对象变量则需要在创建对象时才会被分配内存空间并进行初始化。因此,静态变量优先于对象的出现,可以通过类名直接访问,无需实例化对象。
在Java中,包(Package)是一种用于组织和管理类和接口的机制。它提供了一种命名空间的概念,可以将相关的类和接口组织在一起,以便更好地组织和管理代码。
包的定义:
包是一个由点分隔的标识符序列,用于唯一标识一个类或接口所属的组织或模块。包名通常使用小写字母,按照约定采用逆域名命名规则,例如:com.example.mypackage
。
包的格式:
在源代码文件的开头,使用 package
声明来指定该文件中的类或接口所属的包。声明应该位于所有 import
语句之前,并且只能有一个包声明。例如:
package com.example.mypackage;
书写注意事项:
简写形式:
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.ArrayList
和java.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包毫无关系。每一个包都是独立的类集合。
Scanner类是Java中的一个工具类,用于从用户输入或文件中读取数据。它提供了一种简单的方式来解析基本类型和字符串。
要使用Scanner类,首先需要创建一个Scanner对象,并将输入源(如System.in或文件)作为参数传递给构造函数。然后,可以使用Scanner对象的方法来读取输入。
以下是Scanner类的一些常用方法:
next(): 读取并返回输入中的下一个单词(以空格分隔)。
nextInt(): 读取并返回输入中的下一个整数。
nextDouble(): 读取并返回输入中的下一个双精度浮点数。
nextLine(): 读取并返回输入中的下一行。
1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。
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];