public class Dog {
String name;
int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public void bark() {
System.out.println(name + " is barking.");
}
public void fetch() {
System.out.println(name + " is fetching.");
}
public void sleep() {
System.out.println(name + " is sleeping.");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog("Buddy", 3);
System.out.println("My dog's name is " + myDog.name + " and it is " + myDog.age + " years old.");
myDog.bark();
myDog.fetch();
myDog.sleep();
}
}
public class Example {
// 成员变量
private int memberVariable;
public void exampleMethod() {
// 局部变量
int localVariable = 10;
System.out.println(localVariable);
}
}
public class Car {
// 成员变量
private String brand;
private int speed;
// 构造方法
public Car(String brand) {
this.brand = brand;
this.speed = 0;
}
// 加速方法
public void accelerate(int increment) {
speed += increment;
}
// 刹车方法
public void brake(int decrement) {
speed -= decrement;
}
// 获取速度方法
public int getSpeed() {
return speed;
}
}
Car
类,其中包括了brand
和speed
两个成员变量,以及accelerate
、brake
和getSpeed
三个方法。accelerate
方法用于加速汽车的速度,brake
方法用于减速汽车的速度,getSpeed
方法用于获取汽车的当前速度。这些方法代表了汽车对象的行为或功能。当我们创建Car
对象时,我们可以调用这些方法来操作汽车的速度。java
中可以像C++
类中调用函数来改变类中属性的值:class student{
int age;
void add_age(){
age+=2;
}
}
public class test {
public static void main(String[] args){
student s1 = new student();
s1.age=12;
s1.add_age();
System.out.print(s1.age);
}
}
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
public class VariableArgumentsExample {
public void printNumbers(int... numbers) {
for (int number : numbers) {
System.out.print(number + " ");
}
System.out.println();
}
public static void main(String[] args) {
VariableArgumentsExample example = new VariableArgumentsExample();
example.printNumbers(1, 2, 3); // 可以传入任意数量的参数
example.printNumbers(4, 5, 6, 7, 8, 9, 10);
}
}
java
中,如果是基本数据类型,则将变量保存的值传递出去,如果是引用数据类型,则传递地址。//未传参
int a = 3;
int b = a;
b = 4;
System.out.print(a);
//传参
int a = 3;
add(a);//
System.out.print(a);
public void add(int m){
m++;
}
class student{
int age;
}
public class test {
public static void main(String[] args){
student a = new student();
a.age = 1;
test.am(a);
System.out.print(a.age);
}
public static void am(student p){
p.age++;
}
}
class student{
int age;
}
public class test {
public static void main(String[] args){
student a = new student();
a.age = 1;
test.am(a.age);
System.out.print(a.age);
}
public static void am(int p){
p++;
}
}
main
方法中调用的。而main
方法是静态的,这意味着它可以在没有对象实例的情况下被调用。因此,如果想在 main
方法中调用一个非静态方法,需要首先创建该类的一个对象,然后使用该对象来调用方法。main
方法中直接被调用了。public class Test {
public static void main(String[] args) {
// 调用静态方法,无需创建对象
staticMethod();
// 创建对象
Test test = new Test();
// 使用对象调用非静态方法
test.nonStaticMethod();
}
public static void staticMethod() {
System.out.println("This is a static method.");
}
public void nonStaticMethod() {
System.out.println("This is a non-static method.");
}
}
staticMethod
是静态的,所以它可以在 main
方法中直接被调用。nonStaticMethod
是非静态的,所以我们需要创建一个 Test
类的对象,然后使用这个对象来调用它。package
和 import
是用来组织和访问类的重要工具。Package(包):
package com.example.myapp;
就声明了一个名为 com.example.myapp
的包。Import(导入):
import
关键字用于在当前源文件中导入其他Java包中的类或接口。import
,我们可以使用其他包中的类,而无需每次都写出完整的类名。import java.util.List;
允许我们在代码中直接使用 List
,而不是 java.util.List
。*
来导入一个包中的所有类,例如 import java.util.*;
。java.lang
包下的,或者是当前包下的,那么可以省略此步骤。java.lang
包下的类,那么如果需要使用java.lang
包下的子包下的类,那么还是需要import
。import static
是一种特殊的导入语句,它允许我们直接访问其他类中的静态成员,而无需每次都写出类名。这是一个简单的例子来说明 package
和 import
的使用:
// 声明包
package com.example.myapp;
// 导入ArrayList类
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
// 由于我们导入了ArrayList,所以可以直接使用
ArrayList<String> list = new ArrayList<>();
list.add("Hello");
System.out.println(list.get(0));
}
}
com.example.myapp
的包,并导入了 java.util.ArrayList
类。这使得我们可以在 main
方法中直接使用 ArrayList
。public class Student {
// 将 age 属性设为私有,这样它就不能被外部类直接访问
private int age;
// 提供一个公共的 getter 方法来获取 age 的值
public int getAge() {
return age;
}
// 提供一个公共的 setter 方法来设置 age 的值
// 这里可以添加一些验证逻辑,例如检查年龄是否为负数
public void setAge(int age) {
if (age >= 0) {
this.age = age;
} else {
System.out.println("Age cannot be negative.");
}
}
}
age
属性被封装在 Student
类中。外部类不能直接访问 age
,而必须通过 getAge
和 setAge
方法来获取和设置 age
的值。这样,Student
类就可以控制谁可以访问 age
,以及何时可以访问。此外,Student
类还可以在 setAge
方法中添加验证逻辑,以确保 age
不会被设置为无效值。public
、protected
、private
和 默认(无修饰符)。public
,那么它可以在任何地方被访问。这是最宽松的访问级别。protected
,那么它只能在以下地方被访问:
private
,那么它只能在声明它的类中被访问。这是最严格的访问级别。package com.example;
public class Test {
public int publicVar;
protected int protectedVar;
private int privateVar;
int defaultVar; // 没有使用访问修饰符
public void publicMethod() {}
protected void protectedMethod() {}
private void privateMethod() {}
void defaultMethod() {} // 没有使用访问修饰符
}
在这个例子中,publicVar
和 publicMethod
可以在任何地方被访问,protectedVar
和 protectedMethod
只能在同一个包中的其他类或 Test
的子类中被访问,privateVar
和 privateMethod
只能在 Test
类中被访问,defaultVar
和 defaultMethod
只能在同一个包中的其他类被访问。
// 定义一个类,其中有一个私有变量
public class MyClass {
private int myValue;
// 提供一个公共方法来修改私有变量的值
public void setMyValue(int value) {
myValue = value;
}
// 提供一个公共方法来获取私有变量的值
public int getMyValue() {
return myValue;
}
}
// 定义另一个类,它使用公共方法来修改和打印私有变量的值
public class Test {
public static void main(String[] args) {
MyClass obj = new MyClass();
// 使用公共方法来修改私有变量的值
obj.setMyValue(10);
// 使用公共方法来获取并打印私有变量的值
System.out.println(obj.getMyValue());
}
}
MyClass
类有一个私有变量 myValue
,以及两个公共方法 setMyValue
和 getMyValue
。Test
类创建了一个 MyClass
的对象,并使用这些公共方法来修改和打印 myValue
的值。这就是封装的一个例子:myValue
的内部状态被隐藏起来,只能通过 MyClass
提供的公共方法来访问和修改。new
关键字创建类的新对象时,会自动调用构造器来初始化该对象。void
都没有。public class Student {
private String name;
private int age;
// 无参数构造器
public Student() {
this.name = "";
this.age = 0;
}
// 带参数构造器
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
Student
类有两个构造器:一个是无参数构造器,另一个是带参数构造器。当创建 Student
对象时,可以选择调用哪一个构造器,例如:Student s1 = new Student(); // 调用无参数构造器
Student s2 = new Student("Alice", 20); // 调用带参数构造器
class MyClass {
public:
void doSomething() {
// do something
}
};
int main() {
// 创建匿名对象并调用成员函数
MyClass().doSomething();
// 将匿名对象作为函数实参
someFunction(MClass());
return 0;
}
Javabean
:JavaBean
是一种符合特定约定的Java
类,用于在Java
应用程序中封装数据和行为。一个JavaBean
类通常包含:getter
和setter
方法,JavaBean
通常用于在Java
应用程序中实现数据封装和业务逻辑处理。它们可以被其他Java
类访问和操作,从而实现了类之间的松耦合和模块化设计。JavaBean
还可以通过反射机制进行动态访问和操作,使得它们在Java
的框架和工具中得到广泛应用。JavaBean
类时,可以按照以下方式定义:public class Person {
private String name;
private int age;
public Person() {
// 无参构造方法
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person
类包含了私有的name
和age
属性,以及公共的getter和setter方法。这些方法用于获取和设置Person
对象的属性值。这样,其他类就可以通过调用这些方法来访问和修改Person
对象的属性。Person
类的示例代码如下:public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("Alice");
person.setAge(25);
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
}
}
Person
对象,并通过调用其setter方法设置了姓名和年龄,然后通过调用getter方法获取了这些属性的值并进行打印输出。UML
类图:UML
(Unified Modeling Language)类图是一种用于描述类结构和类之间关系的图形化建模工具。它是一种标准化的图形语言,用于可视化和表达软件系统的设计和结构。在UML
类图中,类被表示为矩形框,其中包含类的名称、属性和方法。类之间的关系通常通过箭头表示,包括继承、关联、聚合、组合等。UML
类图是软件工程师和开发团队之间交流和沟通的重要工具,可以帮助他们理解和设计复杂的软件系统。this
关键字:public class Person {
private String name;
public void setName(String name) {
this.name = name; // 使用this关键字来引用当前对象的name属性
}
}
this.name
指的是当前对象的name属性,而name则是方法的参数。public class Person {
private String name;
private int age;
public Person() {
this("John Doe", 30); // 调用另一个构造方法
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
idea
中,我们可以用insert+alt
进行快捷操作:public class SubClass extends SuperClass {
// 子类的成员变量和方法
}
SubClass
是子类,SuperClass
是父类。子类继承了父类的属性和方法。通过继承,子类可以重用父类的代码,并且可以添加新的属性和方法。java
中,如果没有显式声明其父类,则默认继承于Java.lang.object
getClass()
方法来获取一个对象的类,然后使用getSuperclass()
方法来获取它的父类。下面是一个示例:public class SuperClass {
// 父类的内容
}
public class SubClass extends SuperClass {
public static void main(String[] args) {
SubClass sub = new SubClass();
Class<?> subClass = sub.getClass();
Class<?> superClass = subClass.getSuperclass();
System.out.println("SubClass的父类是: " + superClass.getName());
}
}
SubClass
对象,并使用getClass()
方法获取了它的类。然后我们使用getSuperclass()
方法获取了它的父类,并打印出了父类的名称。public class Animal {
public void eat() {
System.out.println("The animal is eating");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("The dog is eating");
}
}
@Override
是一个注解,用于告诉编译器该方法是重写父类中的方法。在Java中,使用@Override
注解可以帮助程序员避免一些常见的错误,比如拼写错误或者不小心改变了方法签名。如果使用了@Override
注解,但实际上并没有重写父类中的方法,编译器会报错。这样可以帮助开发人员及时发现问题,并修复代码。super
关键字:super
关键字用于引用父类的成员变量、方法或构造方法。它可以在子类中调用父类的构造方法、访问父类的成员变量或调用父类的方法。public class Animal {
String color = "white";
public void sleep() {
System.out.println("The animal is sleeping");
}
}
public class Dog extends Animal {
String breed = "Labrador";
public void display() {
System.out.println("Color: " + super.color); // 使用super关键字访问父类的成员变量
super.sleep(); // 使用super关键字调用父类的方法
}
}
display()
方法使用了super
关键字来访问父类Animal中的color
变量和sleep()
方法。这样就可以在子类中访问或调用父类的成员变量和方法。super
与构造器的规则://父类
public class man {
private int age;
private int name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getName() {
return name;
}
public void setName(int name) {
this.name = name;
}
public man(int age, int name) {
this.age = age;
this.name = name;
}
}
//子类
public class user extends man {
}
user
类中没有显式定义任何构造器,而man
类中定义了一个带有参数的构造器。这会导致编译错误,因为当子类没有显式定义构造器时,它会默认调用父类的无参构造器。但是在这个情况下,man
类中并没有无参构造器,只有带参数的构造器。因此,编译器会报错,提示user
类无法调用父类的构造器。user
类中显式定义一个构造器,并在其中调用父类的构造器,或者在man
类中添加一个无参构造器。例如:public class man {
private int age;
private int name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getName() {
return name;
}
public void setName(int name) {
this.name = name;
}
public man(int age, int name) {
this.age = age;
this.name = name;
}
public man() {
// 无参构造器
}
}
public class user extends man {
public user(int age, int name) {
super(age, name);
}
}
user
类显式定义了一个构造器,并在其中调用了父类man
的带参数的构造器。或者,也可以在man
类中添加一个无参构造器,这样编译器就不会报错了。BAAB
。ABAAB
。new
关键字使用时开辟的空间。class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Woof");
}
}
class Cat extends Animal {
public void makeSound() {
System.out.println("Meow");
}
}
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // 输出 "Woof"
myCat.makeSound(); // 输出 "Meow"
Upcasting
):class Animal {
public void makeSound() {
System.out.println("Animal makes sound");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Dog barks");
}
public void fetch() {
System.out.println("Dog is fetching");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 向上转型
animal.makeSound(); // 调用的是 Dog 类的 makeSound 方法
// animal.fetch(); // 编译错误,无法调用子类特有的方法
}
}
makeSound
方法时实际上调用的是 Dog 类的 makeSound
方法,这就是多态性的体现。Downcasting
):instanceof
运算符来检查对象的类型,以确保安全地进行转型。public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 向上转型
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 向下转型
dog.fetch(); // 可以调用子类特有的方法
}
}
}
instanceof
运算符检查 animal 的实际类型,如果是 Dog 类型,就进行向下转型并调用子类特有的方法 fetch。instanceof
:a instanceof b:判断对象a是不是类b的实例
animal instanceof Dog:
并不是判断animal
是不是Dog
的实例,而是判断Dog
是不是Dog
的实例,因为有Animal animal = new Dog();
,实际上是Dog
向上转型。a instanceof b
是true,那么a instanceof super.b
一定也是true;Object
类toString()
、equals()
、hashCode()
等,这些方法在其他类中都可以直接使用。clone()
:用于创建并返回一个对象的拷贝,通常需要实现Cloneable
接口。equals()
:用于判断两个对象是否相等。hashCode()
:返回对象的哈希码值。toString()
:返回对象的字符串表示。getClass()
:返回对象的类。notify()、notifyAll()、wait()
:用于线程间的通信。equals()
:equals()
方法是Object类中的一个方法,用于比较两个对象是否相等。但是无法比较基本类型,在Object类中,equals()
方法的默认实现是使用==
运算符来比较两个对象的引用是否相等,即判断两个对象是否指向同一个内存地址。因此,当我们比较array,自定义类型时:equals()
方法,那么这个方法将会比较对象的引用,而不是它们的内容。这意味着,即使两个数组或两个自定义类的对象包含完全相同的元素,equals()
方法也会返回false
,除非这两个引用指向的是同一个对象。// 比较数组
int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
System.out.println(array1.equals(array2)); // 输出:false
// 比较自定义对象
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person person1 = new Person("John", 25);
Person person2 = new Person("John", 25);
System.out.println(person1.equals(person2)); // 输出:false
array1
和array2
包含相同的元素,person1
和person2
有相同的name
和age
,但是equals()
方法都返回了false
。这是因为equals()
方法在这种情况下比较的是对象的引用,而不是它们的内容。Arrays.equals()
方法。如果你想要比较两个自定义类的对象的内容,你需要重写equals()
方法。equals()
,让它达到我们想要的结果,注意,在java
中,String,File,Date,包装等类型已经重写了equals()
:// 比较字符串
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1.equals(str2)); // 输出:true
// 比较自定义对象
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
}
Person person1 = new Person("John", 25);
Person person2 = new Person("John", 25);
System.out.println(person1.equals(person2)); // 输出:true
tostring()
:toString()
方法是一个由Object
类继承而来的方法,用于返回对象的字符串表示。当我们需要将一个对象转换为字符串时,通常会调用toString()
方法。这个方法通常用于调试和日志记录,以便能够方便地查看对象的内容。toString()
方法,那么它将使用Object
类中的默认实现,返回一个由类名和对象的哈希码组成的字符串。例如,对于一个自定义类Person
,如果没有重写toString()
方法,那么调用toString()
方法将返回类似于Person@1f7030a
这样的字符串。tostring()
:toString
方法时,你可以根据你的需求来定义返回的字符串格式。例如,假设我们有一个Person
类,包含姓名和年龄属性,我们可以重写toString
方法来返回这些属性的字符串表示形式。public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写toString方法
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) {
Person person = new Person("Alice", 25);
System.out.println(person); // 输出:Person{name='Alice', age=25}
}
}
Person
类的toString
方法,将name
和age
属性的值以字符串的形式返回。当我们调用System.out.println(person)
时,会打印出Person{name='Alice', age=25}
。这样的重写使得打印对象时更容易理解对象的内容。static
关键字:public class Example {
public static int count = 0;
public Example() {
count++;
}
public static void main(String[] args) {
Example e1 = new Example();
System.out.println(Example.count); // 输出1
Example e2 = new Example();
System.out.println(Example.count); // 输出2
}
}
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
System.out.println(MathUtil.add(2, 3)); // 输出5
}
}
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private Singleton() {}//先私有构造器
private static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class CodeBlockExample {
public static void main(String[] args) {
int a = 10;
{
int b = 20;
System.out.println("a + b = " + (a + b));
}
// 这里无法访问变量b,因为b的作用域仅限于局部代码块内
// System.out.println("a + b = " + (a + b)); // 编译报错
}
}
public class CodeBlockExample {
static {
System.out.println("这是静态代码块,会在类加载时执行");
}
public static void main(String[] args) {
// 静态代码块会在main方法之前执行
}
}
public class CodeBlockExample {
{
System.out.println("这是构造代码块,会在构造方法执行前执行");
}
public CodeBlockExample() {
System.out.println("这是构造方法");
}
public static void main(String[] args) {
CodeBlockExample example = new CodeBlockExample();
// 构造代码块会在构造方法执行前执行
}
}
public class Test {
public static void main(String[] args) {
final int i = 10; // 声明一个final变量i
// i = 20; // 错误: 无法为最终变量i分配值
final MyClass myClass = new MyClass();
// myClass = new MyClass(); // 错误: 无法为最终变量myClass分配值
System.out.println(++myClass.j); // 输出: 1
}
}
class MyClass {
public int j = 0;
}
abstract class Animal {
// 抽象方法
abstract void makeSound();
// 非抽象方法
public void eat() {
System.out.println("The animal eats");
}
}
class Dog extends Animal {
// 提供抽象方法的实现
void makeSound() {
System.out.println("The dog barks");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(); // 创建Dog对象
dog.makeSound(); // 调用抽象方法的实现
dog.eat(); // 调用非抽象方法
}
}
Animal
是一个抽象类,它有一个抽象方法makeSound()
和一个非抽象方法eat()
。Dog
类继承了Animal
类,并提供了makeSound()
方法的实现。在main
方法中,我们创建了一个Dog
对象,并调用了makeSound()
和eat()
方法。这就是Java中抽象的基本用法。interface Animal {
void makeSound(); // 接口方法(抽象方法)
}
class Dog implements Animal {
// 提供接口方法的实现
public void makeSound() {
System.out.println("The dog barks");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(); // 创建Dog对象
dog.makeSound(); // 调用接口方法的实现
}
}
Animal
是一个接口,它有一个方法makeSound()
。Dog
类实现了Animal
接口,并提供了makeSound()
方法的实现。在main
方法中,我们创建了一个Dog
对象,并调用了makeSound()
方法。这就是Java中接口的基本用法。USB usb1 = new printer();
default
。public class Outer {
public class Inner {
}
}
public class Outer {
public void test() {
class Inner {
}
}
}
public class Outer {
public List list = new ArrayList() {
{
add("test");
}
};
}
public class Outer {
public static class Inner {
}
}
public class Outer {
private int outerVariable = 1;
public class Inner {
public void innerShow() {
// 访问外部类的成员变量
System.out.println("outerVariable: " + outerVariable);
}
}
}
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.innerShow();
//如果是静态的成员内部类,或者也可以这样
Outer.Inner inner = new.Outer.Inner();
在内部类调用内部类的:省略+调用对象或者this.+调用对象
在内部类调用外部类的:外部类名字.this.+调用对象
public class OuterClass {
public void someMethod() {
class LocalInnerClass {
public void printMessage() {
System.out.println("Hello from the local inner class!");
}
}
LocalInnerClass localInnerClass = new LocalInnerClass();
localInnerClass.printMessage();
}
}
public class user {
public Comparable getInstance(){
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
MyComparable m = new MyComparable();
return m;
}
}
getInstance
方法中,定义了一个局部内部类MyComparable
,这个类实现了Comparable
接口。我们通过这个内部类得到一个返回值为实现该接口的对象。public class user {
public Comparable getInstance(){
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
return new MyComparable();
}
}
Object obj = new Object() {
// 在这里添加你需要的方法或字段
public void myMethod() {
System.out.println("Hello from myMethod");
}
};
// 由于obj的静态类型是Object,我们需要进行类型转换才能调用myMethod
((MyObject)obj).myMethod();
new Object()
是匿名对象,但是注意我们需要进行类型转换才能调用重写的代码,向上面那样的方法肯定是不行的,因为我们不知道MyObject
是什么,它是匿名的,所以我们应该:new Object() {
// 在这里添加你需要的方法或字段
public void myMethod() {
System.out.println("Hello from myMethod");
}
}.myMethod();
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day
是一个枚举类,它定义了一周的七天。你可以像使用其他Java类一样使用枚举类。例如,你可以在switch语句中使用枚举,或者在方法中使用枚举作为参数或返回类型。values()
方法返回枚举类的所有值的数组,valueOf(String name)
方法返回给定名称的枚举常量。public class Main {
public static void main(String[] args) {
Day day = Day.MONDAY;
switch (day) {
case MONDAY:
System.out.println("It's Monday.");
break;
// 其他case省略
default:
System.out.println("Invalid day.");
}
}
}
Day
类型的变量day
,并在switch语句中使用它。public enum EnumName {
CONSTANT1, CONSTANT2, CONSTANT3, ...;
}
EnumName
是枚举的名称,CONSTANT1
、CONSTANT2
、CONSTANT3
等是枚举的常量。这些常量在定义时都会自动初始化为EnumName
类型的对象。常量名称通常大写:枚举常量通常使用全大写字母,这是Java编程的一种惯例。
枚举可以有构造函数、字段和方法:你可以在枚举中定义构造函数、字段和方法,就像在普通的Java类中一样。但是,枚举的构造函数默认是私有的,你不能从枚举外部调用它。
枚举常量是单例:每个枚举常量在程序运行期间只有一个实例,所以你可以安全地使用==
来比较两个枚举常量。
枚举可以实现接口:枚举可以实现一个或多个接口,但不能继承其他类,因为枚举已经隐式地继承了java.lang.Enum
类。
枚举可以用在switch语句中:你可以在switch语句中使用枚举常量,这是枚举的一个常见用途。
public enum Day {
MONDAY("Monday"), TUESDAY("Tuesday"), WEDNESDAY("Wednesday"),
THURSDAY("Thursday"), FRIDAY("Friday"), SATURDAY("Saturday"), SUNDAY("Sunday");
private String dayName;
Day(String dayName) {
this.dayName = dayName;
}
public String getDayName() {
return this.dayName;
}
}
Day
枚举有一个私有字段dayName
,一个构造函数和一个公有方法getDayName()
。每个枚举常量在定义时都会调用构造函数来初始化dayName
字段。注解的主要用途包括:
@Override
、@Deprecated
、@SuppressWarnings
等。你也可以定义自己的注解,这被称为自定义注解。public @interface MyAnnotation {
String value() default "";
}
MyAnnotation
的注解,它有一个名为value
的元素。@MyAnnotation(value = "Hello")
public class MyClass {
// ...
}
MyClass
类上使用了MyAnnotation
注解,并设置了value
元素的值为"Hello"
。@Test
注解来标记测试方法。以下是一个简单的示例:import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
int result = calculator.add(3, 5);
assertEquals(8, result);
}
}
CalculatorTest
的测试类,并使用@Test
注解来标记testAdd
方法。在testAdd
方法中,我们创建了一个Calculator
对象,并调用其add
方法来进行加法运算。然后使用assertEquals
方法来验证计算结果是否符合预期值。@Test
注解进行简单的单元测试,通过断言语句来验证程序的输出是否符合预期。这样可以确保Calculator
类中的add
方法能够正确地执行加法运算。注意,此时可以不在main方法中进行运行。String str = 10 + "";