this
、super
、final
、null
等,它们在面向对象编程中扮演着重要的角色。public class Person {
// 属性
String name;
int age;
// 方法
void introduce() {
System.out.println("Hello, my name is " + name + " and I'm " + age + " years old.");
}
}
public class Main {
public static void main(String[] args) {
// 创建一个Person对象(对象是类的实例)
Person person = new Person();
person.name = "Alice";
person.age = 25;
person.introduce(); // 输出: Hello, my name is Alice and I'm 25 years old.
}
}
封装主要体现在类的属性和方法被隐藏在类的内部,外部只能通过对象的方法来访问这些属性。例如:
public class Person {
private String name; // 私有属性,只能在类内部访问
private int age; // 私有属性,只能在类内部访问
public void setName(String name) { // 公有方法,外部可以通过对象来访问和修改name属性
this.name = name;
}
public void setAge(int age) { // 公有方法,外部可以通过对象来访问和修改age属性
this.age = age;
}
}
继承允许创建一个新类,继承另一个类的属性和方法。子类可以添加新的属性或覆盖父类的方法。例如:
public class Animal {
String name;
public void eat() {
System.out.println(name + " is eating.");
}
}
public class Dog extends Animal { // Dog类继承了Animal类
public void bark() { // Dog类有自己的方法bark()
System.out.println("Woof!");
}
}
多态允许一个接口或超类的引用指向任何实现了该接口或继承了该超类的子类的对象。例如:
interface Animal {
void makeSound(); // 接口方法,可以被实现类自定义实现方式
}
class Dog implements Animal { // Dog类实现了Animal接口,并提供了makeSound()的实现方式
public void makeSound() { // Dog类自定义了makeSound()的实现方式为“Woof!”
System.out.println("Woof!"); // 输出: Woof!
}
}
class Animal {
public void makeSound() {
System.out.println("Generic animal sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow!");
}
}
public class Main {
public static void main(String[] args) {
Animal animal; // 声明一个Animal类型的引用变量
animal = new Animal(); // 创建一个Animal对象并赋值给animal引用变量
//这两行等同于Animal animal = new Animal();
animal.makeSound(); // 输出: Generic animal sound
animal = new Dog(); // 创建一个Dog对象并赋值给animal引用变量,因为animal是父类引用,可以指向子类对象
animal.makeSound(); // 输出: Woof!
animal = new Cat(); // 创建一个Cat对象并赋值给animal引用变量,同样animal是父类引用,可以指向子类对象
animal.makeSound(); // 输出: Meow!
}
}
抽象是通过定义抽象类或抽象方法来隐藏某些细节的过程。例如:
abstract class Vehicle { // 抽象类,不能直接实例化
abstract void startEngine(); // 抽象方法,子类必须提供实现
}
class Car extends Vehicle { // Car类继承了抽象类Vehicle
public void startEngine() { // Car类提供了startEngine()的具体实现
System.out.println("Car's engine started."); // 输出: Car's engine started.
}
}
接口是一种完全抽象的类,它定义了一组方法,但不需要实现这些方法。任何类可以实现一个或多个接口,并且必须提供接口中定义的所有方法的实现。例如:
interface Speakable { // 定义了一个接口Speakable
void speak(); // 接口中的方法,必须由实现类提供具体实现
}
class Dog implements Speakable { // Dog类实现了Speakable接口,并提供了speak()的实现方式
public void speak() { // Dog类提供了speak()的具体实现,输出“Woof!”
System.out.println("Woof!"); // 输出: Woof!
}
}
重载是在同一个类中,方法名相同但参数列表不同的方法例如。
class Calculator {
int add(int a, int b) { // 普通方法add(),接收两个int参数
return a + b;
}
double add(double a, double b) { // 重载方法add(),接收两个double参数
return a + b;
}
}
重写是在子类中定义一个与父类中同名同参数的方法,以覆盖父类中的实现。例如:
(子类重写父类的方法:)
class AdvancedCalculator extends Calculator {
@Override // 使用@Override注解表明这是一个重写的方法
int add(int a, int b) { // 重写父类的add()方法,返回值类型和参数类型都与父类一致
return a * b; // 输出结果:20(4 * 5 = 20)
}
}
静态变量也称为类变量,因为它们属于类本身,而不是类的任何特定实例。这意味着无论创建了多少个类的实例,都只有一个静态变量的副本。所有实例共享同一个静态变量。
public class MyClass {
// 静态变量
public static int staticVariable;
public static void main(String[] args) {
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
obj1.staticVariable = 10; // 设置 obj1 的 staticVariable 值为 10
obj2.staticVariable = 20; // 设置 obj2 的 staticVariable 值为 20
System.out.println("obj1's staticVariable: " + obj1.staticVariable); // 输出 10,因为 obj1 和 obj2 共享同一个 staticVariable
System.out.println("obj2's staticVariable: " + obj2.staticVariable); // 输出 20
}
}
静态方法也称为类方法,因为它们属于类本身,而不是类的任何特定实例。这意味着您可以在没有创建类的实例的情况下调用静态方法。
public class MyClass {
// 静态方法
public static void staticMethod() {
System.out.println("This is a static method.");
}
public static void main(String[] args) {
// 调用静态方法,不需要创建类的实例
MyClass.staticMethod(); // 输出 "This is a static method."
}
}
总结:静态变量和静态方法都属于类,而不是类的实例。这意味着无论创建了多少个类的实例,都只有一个静态变量和一个静态方法的副本。通过使用静态变量和静态方法,可以方便地在不创建对象的情况下与类交互。
抽象类(Abstract Class)和接口(Interface)都是面向对象编程中的重要概念,它们都可以用来实现多态,但它们之间存在一些重要的区别。
1)public:
用于声明一个成员(变量、方法、类等)为公共的,可以在任何地方被访问。
public class MyClass {
public int myVariable; // 公共变量
public void myMethod() { // 公共方法
// 代码
}
}
2)private:
用于声明一个成员为私有的,只能在当前类中被访问。
class MyClass {
private int myVariable; // 私有变量
private void myMethod() { // 私有方法
// 代码
}
}
3)protected:
用于声明一个成员为保护的,可以在当前包内的其他类或不同包中的子类中被访问。
protected class MyClass {
protected int myVariable; // 保护变量
protected void myMethod() { // 保护方法
// 代码
}
}
4)default
(没有标识符):用于声明一个成员为默认的,只能在当前包中的类中被访问。
class MyClass {
int myVariable; // 默认变量
void myMethod() { // 默认方法
// 代码
}
}
5)void:
用于声明一个方法不返回任何值。
void myMethod() { // 不返回任何值的方法
// 代码
}
6)class
:用于声明一个类。类是对象的模板,定义了对象的属性和方法。
class MyClass { // 类声明
// 成员变量和方法定义等
}
7)interface:
用于声明一个接口,定义了一组方法的规范,实现该接口的类必须实现这些方法。接口可以被继承或实现。
public interface MyInterface {
void myMethod(); // 定义一个没有实现的方法
}
public class MyClass implements MyInterface {
public void myMethod() {
System.out.println("MyClass implements MyInterface");
}
}
8)abstract
:用于声明一个抽象类或抽象方法。抽象类不能被实例化,而抽象方法必须在实现该接口的类中被实现。
abstract class MyAbstractClass { // 抽象类声明
// 抽象方法或非抽象方法定义等
}
abstract void myAbstractMethod(); // 抽象方法声明
9)final
:用于声明一个常量、方法或类为最终的,不能被修改或继承。
final int MY_CONSTANT = 10; // 最终常量
final void myFinalMethod() { // 最终方法,不能被子类覆盖
// 代码
}
final class MyFinalClass { // 最终类,不能被继承
// 成员变量和方法定义等
}
10)boolean
:用于声明一个布尔变量,只能取值为 true
或 false
。
boolean isTrue = true; // 布尔变量声明和初始化
11)if
、else
、switch
、case
、default
:用于控制程序流程的语句。
if (condition) { // 如果条件为真,执行语句块
// 代码
} else { // 如果条件为假,执行语句块
// 代码
}
switch (variable) { // 根据变量的值执行相应的代码块
case value1:
// 代码块1
break;
case value2:
// 代码块2
break;
default: // 如果变量值不匹配任何case,执行默认代码块
// 代码块3
break;
}
12)while
、do-while
、for
、break
、continue
:用于循环控制的语句。
while (condition) { // 当条件为真时,重复执行语句块
// 代码
}
do { // 重复执行语句块,直到条件为假
// 代码
} while (condition);
for (initialization; condition; update) { // 初始化,当条件为真时重复执行语句块,然后更新
// 代码
}
break; // 跳出当前循环或switch语句
continue; // 跳过当前循环的剩余部分,进入下一次循环
13)try
、catch
、throw
、finally
:用于异常处理的语句。
try { // 尝试执行代码块,如果抛出异常,则执行相应的catch块或finally块
// 代码
} catch (ExceptionType1 e) { // 捕获特定类型的异常并处理它
// 处理代码
} catch (ExceptionType2 e) { // 可以有多个catch块来处理不同类型的异常
// 处理代码
} finally { // 无论是否发生异常,都会执行finally块中的代码
// 代码
}
14)new
:用于创建对象实例的运算符。
MyClass obj = new MyClass(); // 创建MyClass类的对象实例,并将其引用赋值给obj变量
15)this
:在类的方法或构造器中,this
关键字用于引用当前对象实例。
public class MyClass {
int myVariable;
public void myMethod() {
this.myVariable = 10; // 使用this来引用当前对象的myVariable属性
}
}
16)super
:在类的方法或构造器中,super
关键字用于引用当前对象的父类实例。
public class MySubClass extends MySuperClass {
public void myMethod() {
super.myVariable = 10; // 使用super来引用父类实例的myVariable属性
}
}
17)static
:用于声明静态变量、静态方法或静态块。静态变量和静态方法属于类而不是实例,所有实例共享同一个静态变量,调用静态方法不需要创建对象实例。
public class MyClass {
static int staticVariable; // 静态变量
static void staticMethod() { // 静态方法
// 代码
}
}
18)const
(仅适用于接口中的字段):用于在接口中声明常量。常量的值不能被修改。
interface MyInterface {
const int MY_CONSTANT = 10; // 常量声明
}
19)final
:还可以用于修饰变量,使其成为常量,并且不能被修改。常用于定义配置参数或魔法数字。
final int MY_CONSTANT = 10; // 常量声明和初始化
20)null
:用于表示一个空引用,即没有引用任何对象。
Object obj = null; // 将引用设置为null
21)return
:用于从方法中返回值。
int add(int a, int b) {
return a + b; // 返回两个整数的和
}
22)throw
:用于抛出一个异常。
throw new Exception("异常信息"); // 抛出一个新的异常
23)try-with-resources
:用于自动关闭实现了AutoCloseable
接口的资源。
try (Resource resource) { // 使用try-with-resources语句自动关闭资源
// 使用资源的代码
} catch (Exception e) { // 处理异常的代码
}
24)synchronized
:用于标记一段代码,一次只允许一个线程访问该代码。
public void synchronized myMethod() { // 同步方法,一次只允许一个线程访问该方法
// 代码
}
public void myOtherMethod() {
synchronized(this) { // 同步块,使用对象作为锁
// 代码
}
}
25)volatile
:用于标记一个变量,确保该变量的修改对所有线程都是可见的。
public class MyClass {
volatile boolean flag = false; // 标记为volatile的变量
}
26)assert
:用于在开发和测试阶段进行断言检查。如果条件为假,则抛出AssertionError
异常。
assert condition : "断言失败"; // 如果condition为假,则抛出AssertionError异常
27)enum
:用于声明一个枚举类型,包含固定数量的常量值。
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
public void synchronized myMethod() { // 同步方法,一次只允许一个线程访问该方法
// 代码
}
public void myOtherMethod() {
synchronized(this) { // 同步块,使用对象作为锁
// 代码
}
}