java安装
以下是在 Windows 操作系统上安装 Java 的步骤:
-
下载 JDK(Java Development Kit)安装程序:访问 Oracle 官方网站(https://www.oracle.com/java/technologies/javase-jdk11-downloads.html),找到适合您操作系统的版本,点击下载。
-
运行安装程序:双击下载的 JDK 安装程序,然后按照提示进行安装。
-
下载好后会有俩个文件夹,jdk:开发环境:包括JRE+类库+开发工具包(编译器和调试工具) : jre:运行环境:包括jvm和解释器,完整的java运行环境 下载目录:D:\java\jdk.8.0
-
打开环境变量之系统变量,新建 JAVA_HOME 值 D:\java\jdk.8.0
-
打开环境变量之系统变量,编辑path 然后 新建一个 %JAVA_HOME%\bin ,此时已经配置好环境变量
-
完成配置后,重新打开一个新的命令提示符窗口,再次输入以下命令验证 Java 和 javac 是否正常工作:
java -version javac -version
如果成功安装和配置,您将分别看到 Java 和 javac 版本信息的输出。
这样,您就成功安装了 Java 开发环境(JDK)。现在可以在计算机上编写和运行 Java 程序了。
idea安装
以下是在 Windows 操作系统上安装 IntelliJ IDEA 的步骤:
-
下载 IntelliJ IDEA:访问 JetBrains 官方网站(https://www.jetbrains.com/idea/download/),找到适合您操作系统的版本,选择 Community(社区版免费)或 Ultimate(旗舰版付费),然后点击下载。
-
运行安装程序:双击下载的安装程序,然后按照提示进行安装。
-
选择安装选项:在安装过程中,您可以选择是否创建桌面快捷方式以及其他一些自定义选项。根据个人偏好进行选择。
-
安装完成后,启动 IntelliJ IDEA。
-
配置 JDK 路径:在首次运行 IntelliJ IDEA 时,会提示您配置 JDK 路径。如果已经安装了 JDK,请选择对应的路径。如果未安装 JDK,请点击“Download JDK”按钮,跳转至 JDK 下载页面,根据步骤安装 JDK,并在配置界面选择安装路径。
-
设置插件和主题:在首次启动 IntelliJ IDEA 时,您可以选择安装一些常用的插件和选择喜欢的主题。根据个人需求进行选择,并等待插件和主题安装完成。
-
完成设置后,您将看到 IntelliJ IDEA 的欢迎界面。从这里,您可以创建新项目、打开现有项目、浏览文档等。
这样,您就成功安装了 IntelliJ IDEA。现在可以使用它进行 Java 开发和其他项目的编写和管理了。
dos命令
查看本机IP
ipconfig
ping 别人机器
ping 192.168.0.1
c盘跳到D盘
D:
跳到指定目录
cd 123
返回上一级目录
cd..
创建目录123
mkdir 123 or md 123
删除目录123
rmdir 123 or rd 123
创建文件
echo 内容>文件名.txt
删除文件
del 文件名.txt
清屏
cls
java命名规则
Java 的命名规则如下:
-
包名(Package Name):使用小写字母,多个单词之间用点号分隔,例如:com.example.mypackage。
-
类名(Class Name):使用大写字母开头的驼峰命名法,例如:MyClass,StudentInfo。
-
方法名(Method Name):使用小写字母开头的驼峰命名法,例如:getAge,setScore。
-
变量名(Variable Name):使用小写字母开头的驼峰命名法,例如:name,age。
-
常量名(Constant Name):全部使用大写字母,单词之间用下划线分隔,例如:MAX_VALUE,PI。
-
接口名(Interface Name):使用大写字母开头的驼峰命名法,例如:Drawable,Runnable。
-
枚举类型名(Enum Type Name):使用大写字母开头的驼峰命名法,例如:Color,Size。
-
局部变量名和参数名(Local Variables and Parameters):使用小写字母开头的驼峰命名法,例如:count,index。
注意事项:
- 标识符应该具有描述性,能够清晰表达其用途和含义。
- 避免使用单个字符作为变量名,除非它们代表明确的含义,例如循环索引。
- 使用英文单词命名,避免使用拼音或其他非英文字符。
- 不要使用 Java 的保留关键字作为标识符。
以上是 Java 命名规则的一般约定和最佳实践,遵循这些规范可以使代码更易读、易懂,并增强代码的可维护性。
java数据类型
Java 中的数据类型可分为两类:基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。
-
基本数据类型:
- 整型(Integer Types):byte、short、int、long。
- 浮点型(Floating-Point Types):float、double。
- 字符型(Character Type):char。
- 布尔型(Boolean Type):boolean。
-
引用数据类型:
- 类(Class):用于创建对象的模板,例如 String、Integer 等。
- 接口(Interface):用于定义方法规范,例如 Comparable、Runnable 等。
- 数组(Array):用于存储同一类型的多个元素。
基本数据类型具有固定的大小和默认值,直接存储在内存中的栈空间中,其值是按值传递的。而引用数据类型存储在堆空间中,包含对象的地址或引用,并且可以指向 null。而方法参数传递时,引用数据类型是按引用传递的。
这些数据类型提供了不同的功能和表达能力,让程序员可以有效地处理各种数据和操作。
变量初始值
在Java中,变量的初始化值取决于其类型。基本类型的变量(如int、double、boolean等)在声明时会自动初始化为默认值,而引用类型的变量(如String、数组、对象等)会初始化为null。
以下是Java中各种类型变量的默认初始化值:
- 整数类型(byte、short、int、long):默认初始化为0。
- 小数类型(float、double):默认初始化为0.0。
- 字符类型(char):默认初始化为’\u0000’(空字符)。
- 布尔类型(boolean):默认初始化为false。
- 引用类型(String、数组、对象等):默认初始化为null。
示例代码:
public class Main {
static int myInt;
static double myDouble;
static char myChar;
static boolean myBoolean;
static String myString;
public static void main(String[] args) {
System.out.println("整数类型的默认初始化值:" + myInt);
System.out.println("小数类型的默认初始化值:" + myDouble);
System.out.println("字符类型的默认初始化值:" + myChar);
System.out.println("布尔类型的默认初始化值:" + myBoolean);
System.out.println("引用类型的默认初始化值:" + myString);
}
}
输出结果:
整数类型的默认初始化值:0
小数类型的默认初始化值:0.0
字符类型的默认初始化值:
布尔类型的默认初始化值:false
引用类型的默认初始化值:null
在上述示例中,我们声明了几个静态变量,并在main
方法中输出它们的值。由于这些变量没有被显式赋值,在输出时将显示它们的默认初始化值。
需要注意的是,局部变量(即在方法或代码块内部声明的变量)没有默认初始化值,必须在使用前进行显式赋值。否则,编译器会报错。
所占字节大小
Java 中各个数据类型所占的字节数如下:
-
基本数据类型:
- byte: 1 字节
- short: 2 字节
- int: 4 字节
- long: 8 字节
- float: 4 字节
- double: 8 字节
- char: 2 字节
- boolean: 1 字节
-
引用数据类型:不固定大小,根据对象本身的大小而变化。
这些数据类型所占的字节数是由 Java 虚拟机规范定义的,并且可能会因底层计算机架构的不同而有所变化。知道了各个数据类型所占的字节数,可以帮助程序员在设计和实现代码时更好地管理内存和提高程序效率。
数据类型转化
在Java中,可以使用类型转换来将一个数据类型转换为另一个数据类型。类型转换分为两种:隐式类型转换(自动类型转换)和显式类型转换(强制类型转换)。
-
隐式类型转换(自动类型转换):
隐式类型转换是指将一个数据类型的值赋给另一个数据类型变量时,Java会自动进行类型转换,而无需显式地进行转换操作。隐式类型转换遵循一定的规则,如下所示:- byte、short、char 可以自动类型转换为 int。
- int 可以自动类型转换为 long、float 或 double。
- long 可以自动类型转换为 float 或 double。
- float 可以自动类型转换为 double。
-
显式类型转换(强制类型转换):
显式类型转换是指通过强制转换运算符()将一个数据类型强制转换为另一个数据类型。但是需要注意的是,强制类型转换可能导致数据丢失或溢出,因此在进行强制类型转换时,需谨慎操作。
语法:目标类型变量 = (目标类型) 原始值;示例:
double d = 3.14; int i = (int) d; // 强制类型转换,将double类型转换为int类型
需要注意的是,在进行类型转换时,要确保目标类型能够容纳原始值,否则可能会导致数据溢出或损失精度。因此,在进行类型转换时,建议进行适当的边界检查和数据验证,以确保转换的正确性和安全性。
java运算符
Java中有多种类型的运算符,用于执行各种操作。下面列举了一些常见的Java运算符:
-
算术运算符:
- 加法:+
- 减法:-
- 乘法:*
- 除法:/
- 取模(取余数):%
- 自增:++
- 自减:–
-
关系运算符:
- 相等:==
- 不相等:!=
- 大于:>
- 小于:<
- 大于等于:>=
- 小于等于:<=
-
逻辑运算符:
- 逻辑与:&&
- 逻辑或:||
- 逻辑非:!
-
赋值运算符:
- 简单赋值:=
- 加法赋值:+=
- 减法赋值:-=
- 乘法赋值:*=
- 除法赋值:/=
- 模赋值:%=
-
位运算符:
- 按位与:&
- 按位或:|
- 按位异或:^
- 按位取反:~
- 左移:<<
- 右移:>>
- 无符号右移:>>>
-
条件运算符:
- 三元运算符:(?😃
-
成员访问运算符:
- 点运算符:.
-
类型运算符:
- instanceof
这只是Java运算符中的一部分,每个运算符都有其特定的用法和行为。通过使用这些运算符,可以对数据进行操作、比较、赋值等。在编写代码时,需要根据具体的需求选择合适的运算符,并了解它们的规则和优先级。
java数组
Java中的数组是一种用于存储多个相同类型数据的数据结构。数组在内存中是一个连续的数据块,可以通过索引访问和操作数组中的元素。以下是关于Java数组的基本信息:
-
声明数组:要声明一个数组,需要指定数组的类型和名称,并使用方括号
[]
表示数组。例如,int[] numbers;
声明了一个名为numbers
的整型数组。 -
创建数组:使用
new
关键字加上数组类型和大小来创建数组。例如,numbers = new int[5];
创建了一个包含5个整数的数组。 -
初始化数组:可以在创建数组时初始化数组的元素,或者在声明数组时直接赋值。例如,
int[] numbers = {1, 2, 3, 4, 5};
创建并初始化一个包含5个整数的数组。 -
访问数组元素:可以使用索引来访问数组中的元素。数组的索引从0开始,到数组长度减1。例如,
int x = numbers[2];
将数组numbers
中索引为2的元素赋给变量x
。 -
数组长度:可以使用数组的
length
属性获得数组的长度,即数组中元素的个数。例如,int length = numbers.length;
获取数组numbers
的长度。 -
多维数组:Java支持多维数组,即数组中的元素也可以是数组。多维数组的声明和使用方式类似于一维数组,只是需要用多组方括号表示维度。例如,
int[][] matrix = new int[3][3];
创建了一个3x3的二维整型数组。 -
数组操作:可以对数组进行各种操作,如遍历数组、修改元素值、查找特定元素、排序数组等。通过循环和条件语句,可以对数组进行灵活的处理。
示例代码:
int[] numbers = new int[5];
numbers[0] = 10; // 设置第一个元素的值为10
int x = numbers[2]; // 获取第三个元素的值
int length = numbers.length; // 获取数组长度
int[][] matrix = {
{
1, 2, 3},
{
4, 5, 6},
{
7, 8, 9}
};
System.out.println(matrix[1][2]); // 输出:6
Java数组提供了一种方便和高效地存储和操作多个数据的方式。可以根据具体的需求和场景,合理使用数组来组织和处理数据。
java语句
声明语句
变量声明语句:用于声明变量,指定变量类型和名称,并可以附加初始值(可选)。
java
// 声明整型变量a
int a;
// 声明字符串变量message,并赋初始值"Hello, World!"
String message = "Hello, World!";
// 声明常量PI,并赋初始值3.14
final double PI = 3.14;
方法声明语句:用于声明方法,包括方法名、返回类型、参数列表及方法体等内容。
java
// 声明一个无返回值、无参数的方法printMessage
public void printMessage() {
System.out.println("Hello, World!");
}
// 声明一个有返回值的方法addNumbers,接收两个整型参数a和b,并返回它们的和
public int addNumbers(int a, int b) {
return a + b;
}
类声明语句:用于声明类,包括类名、访问修饰符、实现的接口和类体等内容。
java
// 声明一个公共类MyClass
public class MyClass {
// 类的成员变量和方法
}
// 声明一个抽象类AbstractClass
public abstract class AbstractClass {
// 抽象类的成员变量和方法
}
接口声明语句:用于声明接口,包括接口名、访问修饰符、继承的接口、常量和抽象方法等内容。
java
// 声明一个接口MyInterface
public interface MyInterface {
// 接口中的成员变量和方法
}
输入输出
输出语句:用于将信息打印到控制台。
java
System.out.println("Hello, World!");
输入语句:用于从用户处获得输入。
java
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
控制语句
多分支条件语句(if-else if-else语句):根据不同的条件执行对应的代码块。
java
if (condition1) {
// 执行语句块1
} else if (condition2) {
// 执行语句块2
} else {
// 执行语句块3
}
switch
是一种用于多重条件判断的控制流语句。它可以根据不同的条件值执行不同的代码块。
switch
语句的基本语法如下:
java
switch (expression) {
case value1:
// 当expression等于value1时执行的代码块
break;
case value2:
// 当expression等于value2时执行的代码块
break;
// 可以有更多的case
default:
// 当expression与所有case不匹配时执行的代码块
}
expression
是要进行匹配的表达式或变量。case
后面跟着一个常量值或字面值,表示一个待匹配的条件。如果expression
与某个case
的值相等,则执行该case
下的代码块。如果没有匹配的case
,则会执行default
下的代码块(可选)。- 每个
case
分支都需要以break
语句结束,否则程序将顺序执行后续的case
分支代码。break
语句用于跳出switch
语句块,避免执行不相关的代码。 default
是可选的,用于处理expression
与所有case
都不匹配的情况。
以下是一个使用switch
语句的示例代码:
java
public class Main {
public static void main(String[] args) {
int day = 5;
String dayName;
switch (day) {
case 1:
dayName = "Monday";
break;
case 2:
dayName = "Tuesday";
break;
case 3:
dayName = "Wednesday";
break;
case 4:
dayName = "Thursday";
break;
case 5:
dayName = "Friday";
break;
case 6:
dayName = "Saturday";
break;
case 7:
dayName = "Sunday";
break;
default:
dayName = "Invalid day";
break;
}
System.out.println("Today is " + dayName);
}
}
输出结果:
Today is Friday
在上述示例中,我们使用switch
语句根据day
的值来确定当前是星期几。根据day
的值,相应的case
将被匹配并执行相关代码块,最后输出结果。如果day
的值与所有的case
都不匹配,那么将执行default
下的代码块。
需要注意的是,expression
只能是整数类型(如int
、byte
、short
)或可以转换为整数类型的枚举、字符或字符串。而且,Java 7之前,switch
语句只支持整数和枚举类型,Java 7引入了对字符串的支持。
三目运算符
Java 中的三目运算符是一种简单的条件表达式,可以使用一个条件来决定两个不同的值中的一个。它的语法如下:
condition ? value1 : value2
其中 condition
是一个布尔表达式,如果为真,则返回 value1
,否则返回 value2
。
以下是一个示例,展示如何使用三目运算符来判断一个数字是否为偶数:
int num = 10;
String message = num % 2 == 0 ? "偶数" : "奇数";
System.out.println(message);
在上面的示例中,num % 2 == 0
是布尔表达式,用于判断 num
是否为偶数。如果是偶数,则 message
被赋值为字符串 "偶数"
,否则为 "奇数"
。最终输出的结果是 "偶数"
。
需要注意的一点是,在使用三目运算符时,应该保证 value1
和 value2
的类型相同,或者可以进行自动类型转换。如果两个值类型不兼容,则需要显式地进行类型转换。例如,可以使用 (type) value
的形式强制将 value
转换为指定的类型,其中 type
是目标类型。
循环语句
while循环:在条件为真时重复执行代码块。
java
while (condition) {
// 执行代码块
}
do-while循环:先执行一次代码块,然后在条件为真时重复执行。
java
do {
// 执行代码块
} while (condition);
for循环:按照指定的初始条件、循环条件和步进方式重复执行代码块。
java
for (initialization; condition; update) {
// 执行代码块
}
for-each循环:遍历数组或集合中的元素。
java
for (elementType element : arrayOrCollection) {
// 执行代码块
}
同步语句
synchronized语句:用于实现线程同步。
java
synchronized (object) {
// 执行同步代码块
}
异常处理
try-catch语句:捕获并处理异常。
java
try {
// 可能会抛出异常的代码
} catch (ExceptionType e) {
// 处理异常的代码
}
finally语句:无论是否发生异常,都会执行的代码块。
java
try {
// 可能会抛出异常的代码
} finally {
// 无论是否发生异常都会执行的代码
}
JVM
栈stack
只要new过得东西全部存堆(heap)里面
stack没有变量指向heap,那么它就是garbage,gc清理垃圾garbage
重点
引用数据类型在值传递的时候传递的是内存地址值
基本数据类在值传递的时候―传递的是值本身
方法
在编程中,方法(Method)是一段可重用的代码块,用于执行特定的操作或完成特定的任务。方法封装了一系列的语句,并能够接收输入参数、执行逻辑处理,最终可能返回一个值。
方法通常具有以下特点:
- 方法名称:方法有一个名称,用于唯一标识和调用该方法。
- 参数列表:方法可以接收零个或多个输入参数,这些参数是方法在执行时需要的数据。
- 返回类型:方法可能会返回一个值,其返回类型指定了返回值的数据类型。如果方法不返回任何值,可以将返回类型设置为
void
。 - 方法体:方法体包含了方法的实际逻辑代码,即一系列的语句,定义了方法的行为和功能。
通过定义方法,可以将代码分割成小块,提高代码的可读性、可维护性和可复用性。在程序中,通过调用方法来执行其中封装的代码,避免了重复编写相同的代码。
方法的定义示例:
public int addNumbers(int a, int b) {
int sum = a + b;
return sum;
}
在上面的示例中,addNumbers
是一个方法名称,它接收两个整型参数a
和b
,计算它们的和并将结果返回。方法体中包含了计算和返回结果的代码。
方法的调用示例:
int result = addNumbers(2, 3);
System.out.println(result); // 输出:5
在上面的示例中,通过方法调用addNumbers(2, 3)
可以执行方法体中的代码,并将返回值赋给变量result
。然后通过System.out.println
语句输出结果。
通过定义和使用方法,可以使程序更加模块化、可扩展和简洁,提高代码的重用性和可维护性。
方法的种类
方法可以根据其功能和用途进行不同的分类。以下是常见的方法分类:
-
无参数方法(Parameterless Methods):这些方法不接收任何参数。它们通常执行特定的操作或返回固定的值。
public void greet() { System.out.println("Hello!"); }
-
有参数方法(Methods with Parameters):这些方法接收一个或多个参数,用于提供方法执行所需的输入数据。
public int addNumbers(int a, int b) { return a + b; }
-
无返回值方法(void Methods):这些方法不返回任何值。它们通常用于执行某种操作或处理数据,但不产生结果。
public void displayMessage(String message) { System.out.println(message); }
-
有返回值方法(Methods with Return Values):这些方法在执行完任务后返回一个值。返回类型指定了返回值的数据类型。
public int calculateSum(int[] numbers) { int sum = 0; for (int num : numbers) { sum += num; } return sum; }
-
静态方法(Static Methods):这些方法属于类而不是对象,可以直接通过类名调用,无需创建对象实例。静态方法常用于实用函数和工具方法。
public static int calculateFactorial(int n) { if (n <= 1) return 1; else return n * calculateFactorial(n - 1); }
-
实例方法(Instance Methods):这些方法属于类的实例,需要通过对象引用调用。实例方法可以访问对象的状态和其他实例方法。
public void setName(String name) { this.name = name; }
-
构造方法(Constructor):这种特殊类型的方法用于创建和初始化对象。构造方法具有与类相同的名称,并且没有返回类型。
public MyClass(String name, int age) { this.name = name; this.age = age; }
-
方法重载(Method Overloading):在同一个类中,可以声明多个同名但参数列表不同的方法,称为方法重载。方法重载通过不同的参数类型和数量来区分方法。
public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; }
这些是常见的方法分类,根据不同的需求和场景,选择适合的方法类型来实现所需的功能。
递归
在Java中,递归是一种方法调用自身的编程技巧。通过递归,可以解决问题的重复性,并将一个复杂的问题拆分为更小的子问题来解决。
下面是一个使用递归计算阶乘的示例:
public class RecursionExample {
public static int factorial(int n) {
// 基线条件:当 n 等于 0 或 1 时,阶乘结果为 1
if (n == 0 || n == 1) {
return 1;
} else {
// 递归调用:n! = n * (n-1)!
return n * factorial(n - 1);
}
}
public static void main(String[] args) {
int number = 5;
int result = factorial(number);
System.out.println("Factorial of " + number + " is: " + result);
}
}
在上面的示例中,factorial
方法使用递归来计算给定数字 n
的阶乘。当 n
等于 0 或 1 时,递归终止,返回结果 1。否则,递归调用 factorial(n - 1)
来计算 (n-1)!
,然后将结果与 n
相乘,得到 n!
的结果。
注意在使用递归时,需要确保存在递归的终止条件(基线条件),以避免无限递归。此外,递归可能会占用较多的内存和计算资源,因此需要谨慎使用。
除了阶乘,递归还可以应用于其他许多问题,例如斐波那契数列、树的遍历、回溯等。
java可变参数
在Java中,可变参数(Variable Arguments)是一种特殊的方法参数,允许方法接受可变数量的参数。可变参数可以让我们更加灵活地传递参数,而无需事先指定参数的数量。以下是关于Java可变参数的基本信息:
-
声明可变参数:要声明可变参数,需要在方法的参数列表中使用省略号
...
来表示。例如,public void methodName(String... args)
声明了一个名为methodName
的方法,接受任意数量的字符串参数。 -
使用可变参数:在方法内部,可变参数被当作数组使用。可以通过索引访问可变参数中的元素,或者使用增强型的for循环遍历可变参数。例如,在上述的
methodName
方法内部,可以使用args[0]
来访问第一个参数。 -
调用可变参数方法:在调用带有可变参数的方法时,可以直接传递多个参数,也可以传递一个数组。编译器会根据需要自动将参数封装为数组。例如,
methodName("param1", "param2", "param3");
或methodName(array);
都是有效的调用方式。 -
可变参数的限制:可变参数必须是方法参数列表的最后一个参数。如果方法有多个参数,可变参数只能出现一次,并且必须是最后一个参数。例如,
public void methodName(String name, int age, String... hobbies)
是合法的,但public void methodName(String... args, int value)
是不合法的。
示例代码:
public void printNames(String... names) {
for (String name : names) {
System.out.println(name);
}
}
public void showNumbers(int... numbers) {
for (int num : numbers) {
System.out.println(num);
}
}
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.printNames("Alice", "Bob", "Charlie");
int[] nums = {
1, 2, 3, 4, 5};
obj.showNumbers(nums);
}
上述示例代码中的printNames
方法和showNumbers
方法都使用了可变参数。printNames
方法接受任意数量的字符串参数,并在方法内部循环打印每个参数。showNumbers
方法接受任意数量的整数参数,并在方法内部循环打印每个数字。
使用可变参数可以使方法更加灵活,能够适应不同数量的参数传递,从而简化方法的调用和使用。
java对象
在Java中,对象(Object)是指类的实例化结果,它是类的具体实体。对象是具有状态和行为的实体,它可以拥有属性(成员变量)和方法(成员函数),用于表示真实世界中的事物或概念。
以下是关于Java对象的基本信息:
-
类的定义:在Java中,通过定义类来创建对象。类是一种模板或蓝图,描述了对象的属性和行为。类定义了对象的结构,包括成员变量、方法和构造函数等。
-
对象的创建:可以使用
new
关键字创建对象,使用类的构造函数来初始化对象。例如,ClassName obj = new ClassName();
创建了一个名为obj
的对象。 -
对象的访问:通过对象名称和点操作符
.
,可以访问对象的成员变量和方法。例如,obj.variableName
用于访问对象的成员变量,obj.methodName()
用于调用对象的方法。 -
对象的状态:对象的状态由其成员变量的值决定。可以在创建对象后,通过设置对象的成员变量来改变对象的状态。
-
对象的行为:对象的行为由其方法来描述。方法是定义在类中的函数,用于执行特定的操作。通过调用对象的方法,可以触发对象执行相应的行为。
-
对象的内存分配:Java中的对象都存储在堆(Heap)中。在创建对象时,Java会为对象分配堆内存,并将对象的引用地址存储在栈(Stack)中。
-
对象之间的交互:在程序中,不同的对象可以相互交互和通信。对象可以通过方法调用、参数传递和返回值等方式进行交互。
示例代码:
public class Person {
String name;
int age;
public void sayHello() {
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
public static void main(String[] args) {
Person person1 = new Person();
person1.name = "Alice";
person1.age = 25;
person1.sayHello();
Person person2 = new Person();
person2.name = "Bob";
person2.age = 30;
person2.sayHello();
}
}
上述示例代码定义了一个名为Person
的类,表示人物对象。Person
类有两个成员变量name
和age
,以及一个方法sayHello
用于打印问候语。在main
方法中,创建了两个Person
对象,并设置对象的成员变量。通过调用对象的sayHello
方法,打印了两个人物对象的问候语。
通过创建对象,我们可以方便地实例化类并使用其属性和方法。Java的面向对象编程允许我们以一种结构化和模块化的方式组织代码,并模拟现实世界中的事物和概念。
实体类
实体类(Entity Class)是在面向对象编程中使用的一种特定类,用于表示真实世界中的实体或概念。它通常用于模型化业务领域的对象,包含了对象的属性和相关操作。
以下是关于实体类的一些基本信息:
-
属性:实体类包含表示实体的属性(也称为成员变量、字段)。这些属性描述了实体的状态和特征。属性可以是基本数据类型(如整数、字符串等),也可以是其他自定义类型或对象。
-
封装:实体类常常使用封装(Encapsulation)的原则来保护其属性。通过将属性设置为私有(private),并提供公有(public)的访问方法(也称为getter和setter),来控制对属性的访问和修改。
-
构造方法:实体类通常包含构造方法,用于创建实体对象并初始化其属性。构造方法可以带有参数,用于接收外部传入的值,并赋予属性初始值。
-
方法:实体类可以包含其他方法,用于执行与实体相关的操作。这些方法可以读取或修改属性的值,执行业务逻辑,以及与其他实体对象进行交互。
-
关联关系:实体类之间可以存在关联关系,表示实体之间的连接或依赖。关联关系可以是一对一、一对多或多对多等形式。关联关系的建立通常通过在实体类中使用其他实体类的对象或集合来实现。
-
序列化:在某些情况下,实体类需要支持序列化(Serialization),以在网络传输或存储中使用。为了实现序列化,实体类需要实现
Serializable
接口,并标记为可序列化。
示例代码:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
public void sayHello() {
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
}
上述示例代码定义了一个名为Person
的实体类,表示人物对象。Person
类具有name
和age
两个私有属性,提供了相应的getter和setter方法用于访问和修改属性值。它还包含了带参数的构造方法用于创建对象,并提供了一个sayHello
方法用于打印问候语。
实体类在面向对象编程中起到了重要的作用,它们可以优雅地封装数据和操作,使得程序结构清晰、可维护和可扩展。在实际开发中,根据业务需求,会创建各种不同的实体类来表示不同的实体或概念。
继承
在Java中,继承(Inheritance)是一种面向对象编程的重要概念,允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以获得父类的特征,同时还可以添加自己的特定功能。
以下是关于Java继承的一些基本信息:
-
继承关系:使用关键字
extends
来建立继承关系。子类继承父类的语法为:class 子类名 extends 父类名
。子类可以继承父类的非私有成员变量和方法。 -
子类和父类:子类是派生类,它可以从一个父类继承属性和方法。子类可以拥有自己的属性和方法,也可以重写(Override)父类的方法以实现自己的逻辑。
-
继承层次:Java允许多层次的继承,即一个类可以作为另一个类的子类,而另一个类又可以作为另一个类的子类,依此类推,形成继承的层次结构。
-
访问修饰符:继承关系中,子类可以访问父类的非私有成员变量和方法。如果父类的成员变量或方法被声明为私有(private),则子类无法直接访问,但可以通过父类提供的公共(public)方法来间接访问。
-
方法重写:子类可以重写父类的方法,即在子类中实现与父类方法名、参数列表和返回类型相同的方法。通过方法重写,子类可以改变父类方法的行为,以适应自己的需求。子类方法需要使用
@Override
注解来标识,以确保正确地重写父类方法。 -
super关键字:子类可以使用
super
关键字来引用父类的成员变量和方法。super
关键字可以用于调用父类构造方法、访问父类的成员变量、访问父类的方法等。
示例代码:
// 父类
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out