

上期回顾: 【Java笔记】第6章:数组
个人主页:C_GUIQU
归属专栏:Java
前言
各位小伙伴大家好!上期小编给大家讲解了Java中的数组,接下来讲讲Java中的重点:面向对象。
1. 编程思想
Java 是一种面向对象的编程语言,它基于一系列的核心面向对象编程(OOP)原则。面向对象编程思想主要围绕以下四个基本概念:
- 封装(Encapsulation):
封装是隐藏对象的内部状态和实现细节,仅通过公共接口对外暴露功能的过程。在 Java 中,通过定义类(class)来实现封装。类定义了一组属性(成员变量)和方法(成员函数),这些方法操作属性并对外提供功能。通过访问修饰符(如public、private、protected和default)可以控制属性的访问级别,以保护对象的状态不被不恰当的直接访问。 - 继承(Inheritance):
继承是一种使一个类(子类)能够继承另一个类(父类)的属性和方法的关系。子类可以扩展父类的功能,也可以覆盖(override)父类的方法以提供新的实现。继承促进了代码的复用和扩展。在 Java 中,使用extends关键字来实现继承。 - 多态(Polymorphism):
多态是指允许不同类的对象对同一消息做出响应,即同一操作作用于不同的对象时可以有不同的解释和行为。在 Java 中,多态通常通过接口(interface)和继承来实现。通过声明接口和抽象类,可以定义一组方法,不同的类可以实现这些方法并提供不同的实现。在运行时,可以根据对象的实际类型来调用相应的方法。 - 抽象(Abstraction):
抽象是将复杂系统的复杂性抽象出来的过程,只保留最基本的功能和特性。在 Java 中,抽象可以通过抽象类(abstract class)和接口(interface)来实现。抽象类可以包含具体实现和抽象方法(没有具体实现的方法),而接口只包含抽象方法和静态常量。抽象类和接口都不能直接实例化,它们通常用于定义其他类的蓝图。
除了这四个基本概念,Java 还支持其他面向对象的特性,如:
- 类加载器(Class Loader):Java 使用类加载器来动态加载类文件到 JVM 中。
- 反射(Reflection):Java 反射 API 允许程序在运行时检查或修改其行为。
- 动态绑定(Dynamic Binding):Java方法调用是动态绑定的,这意味着方法的调用是在运行时根据对象的实际类型来确定的。
面向对象编程思想鼓励开发者将问题域中的实体建模为对象,并通过对象之间的交互来解决问题。这种思想有助于创建模块化、可维护和可扩展的代码。
2. 对象
在Java中,对象是面向对象编程(OOP)的核心概念。对象是一个具有状态(属性)和行为(方法)的实体。在Java中,对象是类的实例。类是一个模板,它定义了对象的属性和行为。当你创建一个对象时,你是在根据类的定义创建一个具体的实例。
对象的创建:
在Java中,使用 new 关键字加上类的构造函数来创建对象。例如,如果你有一个名为 Person 的类,你可以这样创建一个 Person 对象:
Person person = new Person();
这行代码做了几件事情:
Person():调用Person类的构造函数,这个构造函数可能是默认的(没有参数),也可能是你定义的其他形式的构造函数。new:在堆内存中为新的Person对象分配空间,并初始化对象的基本状态。person:声明一个Person类型的引用变量,它存储了新创建对象的内存地址。
对象的状态和行为:
- 状态(属性):对象的状态是由它的属性(成员变量)定义的。例如,
Person类可能有name和age这样的属性。 - 行为(方法):对象的行为是由它的方法(成员函数)定义的。例如,
Person类可能有speak()和walk()这样的方法。
对象的使用:
一旦创建了对象,你就可以通过引用变量来访问它的属性和方法。例如:
person.name = "Alice"; // 设置对象的name属性
person.age = 30; // 设置对象的age属性
person.speak(); // 调用对象的speak方法
对象的生命周期:
在Java中,对象的生命周期包括创建、使用和垃圾回收。当对象不再被引用时,它就成为了垃圾回收的目标。Java的垃圾回收器会自动回收这些不再使用的对象所占用的内存。
对象的重要特性:
- 封装:对象封装了数据(属性)和操作数据的方法,对外只暴露必要的接口。
- 继承:对象可以继承其他对象的属性和方法,实现代码的复用。
- 多态:对象可以以不同的形式响应相同的消息,依赖于对象的实际类型。
理解Java中的对象是理解和运用Java面向对象编程的基础。通过对象,Java程序可以模拟现实世界中的实体和行为,从而构建复杂的应用程序。
3. 类
在Java中,类是面向对象编程的基本构建块,它定义了一组具有相同属性和方法的对象。一个类通常由以下几个部分组成:
- 类名:
类名应该反映类所表示的对象或概念,并且遵循大写字母开头的驼峰命名法。例如,Person、Car或BankAccount。 - 属性(成员变量):
属性是类中定义的数据,用于表示对象的状态。它们可以是基本数据类型(如int、double、boolean等),也可以是引用数据类型(如其他类、接口、数组等)。属性通常被声明为私有的,以实现封装。private String name; private int age; - 构造函数:
构造函数是一种特殊的方法,用于在创建对象时初始化对象的属性。Java类可以有多个构造函数,它们可以重载(即具有不同的参数列表)。public Person(String name, int age) { this.name = name; this.age = age; } - 方法(成员函数):
方法表示类的行为,它们是类中定义的函数,用于操作对象的属性或执行某些操作。方法可以是实例方法(非静态),也可以是类方法(静态)。public void speak() { System.out.println("Hello, my name is " + name); } - 访问修饰符:
访问修饰符用于控制类成员(属性和方法)的访问级别。Java提供了四种访问修饰符:public、private、protected和默认(没有修饰符)。 - 方法重载:
方法重载是在同一个类中定义多个同名方法,但它们的参数列表必须不同(参数数量、类型或参数顺序不同)。这使得类可以提供多种方式来执行相似的操作。 - 继承:
Java类可以通过extends关键字继承另一个类。子类继承父类的属性和方法,并可以添加新的属性和方法或覆盖(override)父类的方法。public class Student extends Person { // Student类继承了Person类 } - 接口实现:
Java类可以实现一个或多个接口,通过implements关键字。接口定义了一组方法,类必须实现这些方法。public class Employee implements Serializable, Cloneable { // Employee类实现了Serializable和Cloneable接口 } - 内部类:
Java允许在一个类的内部定义另一个类,这样的类称为内部类。内部类可以访问外部类的成员变量和方法。public class OuterClass { private class InnerClass { // InnerClass是OuterClass的内部类 } } - 注解:
注解(Annotations)是用于为代码添加元数据的机制。它们可以用于提供代码分析工具、编译器或运行时环境的指令。
一个完整的Java类可能包含上述所有部分,但也可以只包含其中的一部分,具体取决于类的目的和设计。类是Java面向对象编程的基础,它们提供了一种组织和封装代码的强大方式。
4. 方法重载
方法重载(Overloading)是Java面向对象编程中的一个核心概念,它允许在同一个类中存在多个同名的方法,但这些方法的参数列表必须不同。方法重载是一种静态多态(编译时多态),因为编译器可以根据方法的参数类型和数量来决定调用哪个方法。
方法重载的条件:
- 同一类中:重载的方法必须在同一个类中定义。
- 相同方法名:重载的方法必须具有相同的名字。
- 不同参数列表:重载的方法必须有不同的参数列表。参数列表的不同可以体现在参数的数量、类型或者参数的顺序上,但返回类型不是重载的判定条件。
方法重载的示例:
public class Calculator {
// 重载方法:add(int, int)
public int add(int a, int b) {
return a + b;
}
// 重载方法:add(double, double)
public double add(double a, double b) {
return a + b;
}
// 重载方法:add(int, int, int)
public int add(int a, int b, int c) {
return a + b + c;
}
// 重载方法:add(double, int)
public double add(double a, int b) {
return a + b;
}
}
在上面的示例中,Calculator 类有四个名为 add 的方法,但它们的参数列表不同。因此,这些方法被视为重载方法。当调用 add 方法时,编译器会根据提供的参数类型和数量来确定调用哪个方法。
例如:
Calculator calc = new Calculator();
int result1 = calc.add(10, 20); // 调用 add(int, int)
double result2 = calc.add(10.5, 20.5); // 调用 add(double, double)
int result3 = calc.add(10, 20, 30); // 调用 add(int, int, int)
double result4 = calc.add(10.5, 20); // 调用 add(double, int)
方法重载可以提高代码的可读性和易用性,因为它允许开发者使用相同的方法名来执行相似的操作,而不必为每个操作记住不同的方法名。
5. 构造方法
在Java中,构造方法(Constructor)是一种特殊的方法,用于在创建对象时初始化对象的状态。构造方法的名字必须与类名相同,并且没有返回类型,连 void 也没有。构造方法的主要目的是为对象的属性赋初值,确保对象在使用前处于一种有效状态。
构造方法的定义语法如下:
[访问修饰符] 类名([参数列表]) {
// 构造方法体
}
构造方法可以重载,这意味着一个类可以有多个构造方法,它们的参数列表必须不同。当你创建一个对象时,Java虚拟机(JVM)会调用相应的构造方法来初始化对象。
构造方法的示例:
public class Person {
private String name;
private int age;
// 默认构造方法,没有参数
public Person() {
name = "Unknown";
age = 0;
}
// 带有两个参数的构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
在上面的示例中,Person 类有两个构造方法:一个默认构造方法(没有参数),它将 name 设置为 “Unknown” 并将 age 设置为 0;另一个带有两个参数的构造方法,它使用提供的参数来初始化 name 和 age 属性。
创建 Person 对象时,可以选择使用哪个构造方法:
Person person1 = new Person(); // 使用默认构造方法
Person person2 = new Person("Alice", 30); // 使用带参数的构造方法
如果在一个类中没有显式定义任何构造方法,Java编译器会自动提供一个默认的无参数构造方法,它什么也不做。但是,如果定义了至少一个构造方法,编译器就不会自动提供默认构造方法。因此,如果你想要一个无参数的构造方法,并且已经定义了其他构造方法,那么你必须显式地定义一个无参数的构造方法。
构造方法对于确保对象的一致性和完整性非常重要。它们通常用于执行初始化任务,如分配资源、验证输入参数、设置默认值等。
6. this
在Java中,this 关键字是一个引用,它指向当前对象(即正在执行方法的对象)。使用 this 可以在类的构造方法、实例方法和实例初始化块中引用当前对象的属性和方法。
this 的主要用途有:
- 引用当前对象的属性:
当一个类的实例变量与构造方法或方法的参数名称相同时,可以使用this来区分它们。例如:public class Person { private String name; public Person(String name) { this.name = name; // 使用 this 来引用当前对象的 name 属性 } } - 调用当前对象的构造方法:
在构造方法中,可以使用this()来调用同一个类的另一个构造方法。这称为构造方法链。例如:public class Person { private String name; private int age; public Person(String name) { this.name = name; } public Person(String name, int age) { this(name); // 调用另一个构造方法 Person(String name) this.age = age; } } - 在内部类中引用外部类对象:
在内部类中,可以使用OuterClass.this来引用外部类对象。例如:public class OuterClass { private int x; class InnerClass { public void doSomething() { OuterClass.this.x = 10; // 引用外部类对象的 x 属性 } } } - 返回当前对象的引用:
在方法中,可以使用return this来返回当前对象的引用,这在链式方法调用中很有用。例如:public class StringBuilder { public StringBuilder append(String str) { // 添加字符串到当前 StringBuilder 对象 return this; // 返回当前对象的引用 } } StringBuilder sb = new StringBuilder().append("Hello").append(" World");
this 不能在静态方法中使用,因为静态方法属于类而不属于任何对象,所以没有当前对象的引用。
正确使用 this 关键字可以增强代码的清晰度和可读性,尤其是在处理具有多个构造方法和复杂内部结构的类时。
7. 引用
在Java中,引用是一个变量,它存储了一个对象的内存地址。Java中的所有对象都是通过引用来访问的。这些引用指向堆内存中的对象,而堆内存是Java虚拟机(JVM)中用于存储对象实例和数组的区域。
引用的概念是理解Java内存模型的关键。Java内存模型包括以下几个主要部分:
- 栈(Stack):每个线程都有一个私有的栈,用于存储局部变量和部分结果。局部变量包括基本数据类型(如
int、double、boolean等)的值和对象的引用。 - 堆(Heap):所有对象和数组的实例都存储在堆中。堆是所有线程共享的内存区域。当使用
new关键字创建一个对象时,JVM会在堆上为该对象分配内存,并返回一个指向该内存地址的引用。 - 方法区(Method Area):存储了类的结构信息,包括字段、方法、接口等。方法区是所有线程共享的内存区域。
- 常量池(Constant Pool):存储了类和接口的常量以及字面量。
引用的示例:
MyClass myObject = new MyClass();
在这个例子中,myObject 是一个引用变量,它存储了 new MyClass() 创建的 MyClass 对象的内存地址。
Java中的引用有几种不同的类型:
5. 强引用(Strong Reference):这是最常见的引用类型。一个对象如果被强引用所引用,那么它就不会被垃圾回收器回收。
6. 软引用(Soft Reference):软引用用于存储那些有用但非必需的对象。当内存不足时,垃圾回收器可能会回收软引用所引用的对象。
7. 弱引用(Weak Reference):弱引用不会阻止对象被垃圾回收器回收。弱引用常用于实现缓存,当对象不再被强引用时,它们可以被垃圾回收器回收。
8. 虚引用(Phantom Reference):虚引用是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。虚引用主要用于跟踪对象被垃圾回收器回收的活动。
理解Java中的引用对于编写高效和正确的Java程序非常重要,特别是在处理内存管理和性能优化时。
结语
至此,Java的面向对象讲解完毕。
感谢您的观看!互三必回!持续更新中~!


2077

被折叠的 条评论
为什么被折叠?



