类与对象的基本概念

类与对象的基本概念

在Java编程语言中,对象是两个非常重要的概念。本节将详细介绍这两个概念,以及如何在Java中定义和使用它们。

1. 什么是类?

是一个模板或蓝图,用于创建对象。类定义了对象的属性(字段)和行为(方法)。通过类,我们可以创建出多个具有相同特征和行为的对象。

1.1 类的定义

在Java中,使用class关键字来定义一个类。一个简单的类定义示例如下:

1
2
3
4
5
6
7
8
9
10
public class Dog {
// 字段(属性)
String name;
int age;

// 方法(行为)
void bark() {
System.out.println(name + " is barking!");
}
}

在这个示例中,我们定义了一个名为 Dog 的类,该类具有两个字段:name(狗的名字)和 age(狗的年龄),以及一个 bark 方法,表示狗叫。

2. 什么是对象?

对象是类的实例。可以认为对象是通过类创建的具体事物。每个对象都拥有类中定义的属性和行为。

2.1 对象的创建

可以使用 new 关键字来创建对象,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
// 创建Dog类的对象
Dog myDog = new Dog();

// 访问对象的字段
myDog.name = "Buddy";
myDog.age = 3;

// 调用对象的方法
myDog.bark(); // 输出: Buddy is barking!
}
}

在上述代码中,我们创建了一个 Dog 类型的对象 myDog,并通过对象访问了其字段和方法。

3. 类的构造器

构造器是一个特殊的方法,用于初始化新创建的对象。构造器的名称与类名相同,并且没有返回类型。

3.1 使用构造器

我们可以为 Dog 类定义一个构造器,来初始化对象的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Dog {
String name;
int age;

// 构造器
Dog(String name, int age) {
this.name = name;
this.age = age;
}

void bark() {
System.out.println(name + " is barking!");
}
}

public class Main {
public static void main(String[] args) {
// 使用构造器创建对象
Dog myDog = new Dog("Buddy", 3);
myDog.bark(); // 输出: Buddy is barking!
}
}

在这个例子中,我们使用构造器初始化 nameage 属性。

4. 总结

  • 是对象的模板,定义了对象的属性和行为。
  • 对象是类的具体实例,具有类中定义的属性和方法。
  • 可以使用 new 关键字构造对象,并可通过构造器初始化对象的属性。

理解类与对象的基本概念是学习Java的基础,通过不断地练习和实践,您将能够更熟练地运用这些知识。

27 Java 设计模式进阶教程

27 Java 设计模式进阶教程

在这一节中,我们将重点学习三种常用的设计模式:装饰者模式适配器模式策略模式。我们会通过详细的解释和示例代码来帮助你理解这些模式的使用场景及实现。

装饰者模式

概述

装饰者模式(Decorator Pattern)是一种结构型设计模式,允许你在不改变对象自身的情况下,动态地给一个对象添加一些额外的职责。装饰者提供了比继承更灵活的替代方案。

适用场景

  • 需要在运行时动态地扩展对象的功能。
  • 需要对多个类使用相同的装饰功能。

实现步骤

  1. 定义一个组件接口,它是所有具体组件和装饰者的共同接口。
  2. 创建一个具体组件,实现组件接口。
  3. 创建一个装饰者抽象类,持有一个组件的引用,并实现组件接口。
  4. 创建一个或多个具体装饰者,扩展装饰者类。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// 组件接口
interface Coffee {
String getDescription();
double cost();
}

// 具体组件
class SimpleCoffee implements Coffee {
@Override
public String getDescription() {
return "Simple Coffee";
}

@Override
public double cost() {
return 1.00;
}
}

// 装饰者抽象类
abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;

public CoffeeDecorator(Coffee coffee) {
this.decoratedCoffee = coffee;
}

@Override
public String getDescription() {
return decoratedCoffee.getDescription();
}

@Override
public double cost() {
return decoratedCoffee.cost();
}
}

// 具体装饰者
class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee coffee) {
super(coffee);
}

@Override
public String getDescription() {
return decoratedCoffee.getDescription() + ", Milk";
}

@Override
public double cost() {
return decoratedCoffee.cost() + 0.50;
}
}

class SugarDecorator extends CoffeeDecorator {
public SugarDecorator(Coffee coffee) {
super(coffee);
}

@Override
public String getDescription() {
return decoratedCoffee.getDescription() + ", Sugar";
}

@Override
public double cost() {
return decoratedCoffee.cost() + 0.20;
}
}

// 测试代码
public class DecoratorTest {
public static void main(String[] args) {
Coffee coffee = new SimpleCoffee();
System.out.println(coffee.getDescription() + " $" + coffee.cost());

coffee = new MilkDecorator(coffee);
System.out.println(coffee.getDescription() + " $" + coffee.cost());

coffee = new SugarDecorator(coffee);
System.out.println(coffee.getDescription() + " $" + coffee.cost());
}
}

输出结果

1
2
3
Simple Coffee $1.0
Simple Coffee, Milk $1.5
Simple Coffee, Milk, Sugar $1.7

适配器模式

概述

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

适用场景

  • 需要将一个已有的类与新的类结合使用。
  • 需要对接口进行一些适配,使其兼容不同的类。

实现步骤

  1. 创建一个目标接口,定义客户所期待的接口。
  2. 创建一个适配器类,实现目标接口,并持有一个源类的实例。
  3. 在适配器类中,调用源类的方法来实现目标接口。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 目标接口
interface Target {
void request();
}

// 源类
class Adaptee {
public void specificRequest() {
System.out.println("Calling specific request from Adaptee.");
}
}

// 适配器类
class Adapter implements Target {
private Adaptee adaptee;

public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}

@Override
public void request() {
adaptee.specificRequest();
}
}

// 测试代码
public class AdapterTest {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target adapter = new Adapter(adaptee);
adapter.request(); // Outputs: Calling specific request from Adaptee.
}
}

策略模式

概述

策略模式(Strategy Pattern)是一种行为设计模式,定义了一系列算法,将每一个算法封装起来,并使它们可互换。策略模式使得算法独立于使用它的客户端而变化。

适用场景

  • 需要在运行时选择算法的场景。
  • 有多个类只是在行为上有不同的实现。

实现步骤

  1. 定义一个策略接口,声明算法的接口。
  2. 创建实现该接口的具体策略类
  3. 创建一个上下文类,用于使用策略对象。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 策略接口
interface Strategy {
int execute(int a, int b);
}

// 具体策略类
class AddStrategy implements Strategy {
@Override
public int execute(int a, int b) {
return a + b;
}
}

class SubtractStrategy implements Strategy {
@Override
public int execute(int a, int b) {
return a - b;
}
}

// 上下文类
class Context {
private Strategy strategy;

public Context(Strategy strategy) {
this.strategy = strategy;
}

public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}

// 测试代码
public class StrategyTest {
public static void main(String[] args) {
Context context = new Context(new AddStrategy());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

context = new Context(new SubtractStrategy());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
}
}

输出结果

1
2
10 + 5 = 15
10 - 5 = 5

总结

通过以上的示例和解释,我们了解了装饰者模式适配器模式策略模式的基本概念、适用场景及其实现方法。这些设计模式在实际开发中非常有用,能够提高代码的灵活性和可维护性。理解这些模式并熟练运用将显著提升你的编

类的定义与实例化

类的定义与实例化

在Java中,是对象的蓝图或模板,通常用于封装数据和方法。下面我们将详细介绍如何定义类以及如何实例化这些类。

1. 类的定义

在Java中,类的定义使用关键字 class。类包括属性(字段)和方法(行为)。

1.1 定义一个简单的类

1
2
3
4
5
6
7
8
9
10
public class Dog {
// 属性(字段)
String name;
int age;

// 方法
void bark() {
System.out.println(name + " says: Woof!");
}
}

代码说明:

  • public class Dog 定义了一个名为 Dog 的类。
  • String name;int age; 是属性,用于存储对象的信息。
  • void bark() 是一个方法,定义了这个类的行为。

2. 类的实例化

类的实例化就是创建一个对象。通过 new 关键字,我们可以创建一个类的实例。

2.1 实例化一个对象

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
// 实例化 Dog 类
Dog myDog = new Dog();

// 设置属性值
myDog.name = "Buddy";
myDog.age = 3;

// 调用方法
myDog.bark(); // 输出:Buddy says: Woof!
}
}

代码说明:

  • Dog myDog = new Dog(); 创建了一个 Dog 类的实例,myDog 是这个实例的引用。
  • 我们为 myDognameage 属性赋值。
  • 通过 myDog.bark(); 调用 bark 方法,输出“Buddy says: Woof!”。

3. 带参数的构造函数

在Java中,构造函数用于初始化对象的状态。构造函数与类同名且没有返回类型。

3.1 定义带参数的构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Dog {
// 属性
String name;
int age;

// 带参数的构造函数
public Dog(String name, int age) {
this.name = name;
this.age = age;
}

// 方法
void bark() {
System.out.println(name + " says: Woof!");
}
}

代码说明:

  • public Dog(String name, int age) 是一个构造函数,接受两个参数并将其赋值给属性。
  • this.namethis.age 指的是当前对象的属性。

3.2 使用带参数的构造函数实例化对象

1
2
3
4
5
6
7
8
9
public class Main {
public static void main(String[] args) {
// 使用带参数的构造函数创建实例
Dog myDog = new Dog("Buddy", 3);

// 调用方法
myDog.bark(); // 输出:Buddy says: Woof!
}
}

4. 小结

在本节中,我们学习了如何定义一个类,如何实例化对象,以及如何使用构造函数来创建带有初始化数据的实例。通过理解这些基本概念,你可以开始构建自己的Java应用程序并使用面向对象的方法进行编程。