类
类的声明
class People{
......
}
People为类名,要遵循标识符规定且根据编程风格,类名为拉丁字母时则首字母应大写,比如ChineseMade
类体
class Ladder{
double above;
double bottom;
double height;
double getArea(){
return (above+bottom)*height/2;
}#类体的内容
}
{......}即为类体
成员变量
class Ladder{
#double above;
double bottom;
double height;#成员变量的声明
double getArea(){
return (above+bottom)*height/2;
}
}
成员变量的默认值
如:boolean对应false; byte,short,int,long对应0; char对应'\0'(空字符); float,double对应0.0; 对于引用型变量对应null
编程风格
- 一行只声明一个变量。
- 遵循标识符规定。
方法
方法头
int speak(){ //无参数的方法头
return 23;
}
int add(int x,int y){ //有参数的方法头
return x+y;
方法体
int add(int x,int y){
int z=5; //声明局部变量
z=x+y+z;
return z;
}
区分成员变量和局部变量
当局部变量的名字和成员变量的名字相同时,则成员变量在这个方法内暂时失效。 如想使用暂时失效的那个成员变量,则必须使用关键字this 比如:
class Tom{
int x=10,y;
void f(){
int x=5;
y=x+this.x; //y得到的值为15
}
}
局部变量没有默认值
需要注意的问题
mindmap
类体的内容
变量的声明
方法的定义
声明成员变量时可赋予初值,但赋值语句只能出现在方法体中, 如:
class A{
int a;
float b;
a=12; //非法
b=12.56f; //非法
}
类的UML图
对于:
class Ladder{
double above;
double bottom;
double height;
double getArea(){
return (above+bottom)*height/2;
}
}
UML图: 第一层名字层 第二层变量层 第三层方法层
| Ladder |
|---|
| above:float bottom:float height:float |
| getArea():double |
构造方法与对象的创建
构造方法
构造方法没有类型
class Point{
int x,y;
Point(){ //是构造方法
x=1;
y=1;
}
void Point(int a,int b){ //不是构造方法
x=a;
y=b;
}
}
创建对象
对象的声明
格式: 类的名字 对象名字 例如:
Ladder ladder;
为声明的对象分配变量
ladder= new Ladder();
使用对象
使用访问符"." 例如:
Ladder ladder= new Ladder();
ladder.above= 10.798;
ladder.bottom=156.65;
ladder.height=18.12;
area =ladder.getArea();
System.out.println("梯形的面积:"+area);
对象的引用和实体
对于同一个类的两个对象object1和object2,允许进行如下的赋值操作:
object1=object2;
类与程序的基本结构
mindmap
Java应用程序
源文件
主类
类
源文件
主类
类
实操:
1. 打开记事本三次,分别编辑、保存以下三个Java源文件
注意:保存时文件名需要加入".java",保存类型改为‘所有文件’,编码改为‘UTF-8’
2.在命令行窗口中进入上述目录,并编译
win+r,再输入cmd,打开命令行窗口 以上述为例, Example4_5.java保存的位置在 D:\Java\chapter4 中,
由于输出中有中文,所以命令行需编译:
javac -encoding UTF-8 文件名.java若无,则编译:javac 文件名.java
整个编译过程如下图所示:(划黄线部分为输入部分)
参数的传值
参数属于局部变量
传值机制
形参:方法的参数
实参:向其传值的变量或常量
改变实参的值不会影响形参的值
基本数据类型参数的传值
class Rect{
double width;
double height;
void set(double x,double y){
width=x;
height=y;
}
double getArea(){
double area=width*height;
return area;
}
}
public class Example4_5{
public static void main(String args[]){
Rect ractangle =new Rect();
double m=109.87;
double n=25.18;
ractangle.set(m,n); //将m,n的值传递给x,y
double area =ractangle.getArea();
System.out.println("矩形的面积:"+area);
}
}
引用类型参数的传值
一个类声明的两个对象如果具有相同的引用,两者就具有相同的变量
可变参数
形式:
public void g(double a,int ... x)//"..."表示若干个参数,这些参数类型必须相同,x是可变参数的参数代表
例如:
public int getSum(int... x){
int sum=0;
for(int i=0;i<x.length;i++){
sum=sum+x[i];
}
return sum;
}
其中循环语句可更改为:
for(int param:x){
sum=sum+param;
}
对象的组合
组合与复用
通过组合对象来复用方法的特点:
1.该方法也被称为“黑盒复用”,因为当前对象只能委托所包含的对象调用其方法,但对方法的细节一无所知。
2.当前对象随时可以更换所包含的对象,属于弱耦合关系。
3.所包含的对象的引用发生变化并不影响当前对象的引用,因为变化前的实体不被释放,仍然被当前对象所引用。
如图:
类的关联关系和依赖关系的UML图
关联关系
A类的成员变量是用B类声明的对象,即A类的对象关联于B类的对象或A类的对象组合了B类的对象。
如图:
依赖关系
A类中某个方法的参数是用B类声明的对象或某个方法返回的数据类型是B类对象,即A依赖于B。
如图:
实例成员与类成员
实例变量和类变量的声明
mindmap
成员变量
实例变量
成员变量不用static修饰
类变量
类变量用static修饰
⚠️不能用static修饰局部变量
实例变量和类变量的区别
1.不同对象的实例变量互不相同
2.所有对象共享类变量
3.通过类名直接访问类变量
实例方法和类方法的定义
同理,类方法需加static关键词修饰
实例方法和类方法的区别
1.对象调用实例方法
2.类名调用类方法
3.设计类方法的原则 对于类方法,不必创建对象就可以用类名直接调用。创建对象导致类中的实例变量被分配内存空间。
方法重载
方法重载的语法规则
方法重载:在一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同
即满足以下条件之一:
1.参数的个数不同
2.参数个数相同但类型不同
避免重载出现歧义
重载方法之间必须保证相互的参数不同
this关键字
可以出现在实例方法和构造方法中,但不可以出现在类方法中
在构造方法中使用this
代表使用该构造方法所创建的对象
在实例方法中使用this
实例变量: this.成员变量
类变量: 类名.成员变量
比如:
class A{
int x;
static int y;
void f(){
this.x = 100;
A.y = 200;
}
}
方法同理
包
使用包名可以有效地区分名字相同的类
包语句
一般格式:
package 包名;
注意:
1.package语句作为Java源文件中的第一个语句,为该源文件中声明的类指定包名。
2.包名可以是一个合法的标识符,也可以是若干个标识符加“.”分隔而成,如:package sun.com.cn;
有包名的类的存储目录
如果一个类有包名,就不能在任意位置存放。
例如:
package tom.jja
则存储文件的目录中必须包含结构“…\tom\jja”
编译: 比如
C:\1000>javac tom\jja\源文件 //必须到“\tom\jja”的上一层目录中去运行源文件
运行有包名的主类
必须到“\tom\jja”的上一层目录中去运行主类
如:
C:\1000>javac tom.jja.主类名
主类必须使用全名,即“包名.主类名”
例子:
编译
法一:
法二:
其中“-encoding UTF-8”用于指定源文件编码格式的选项,若输出中没有出现中文,可忽略。
编译通过后,出现
运行
在运行程序时必须回到tom\jja的上一层目录中来执行
如果需要连续返回多层,可以多次执行 cd ..,或者直接指定目标路径(比如从 D:\Java\tom\jja 回到 D:\Java,可以执行 cd D:\Java)
如:
import语句
引入类库中的类
使用import语句可以引入包中的类和接口
如果要引入一个包中的所有类,则可以用通配符“*”来代替:
import java.util.*;
而import java.util.Date;只是引入包中的Date类
例如:
引入自定义包中的类
比如:import tom.jja.*;
有包名的源文件
包名路径左对齐
无包名的源文件
包名路径和源文件左对齐
访问权限
私有变量和私有方法
用关键词private修饰,不能被其他类所访问
公有变量和公有方法
用关键词public修饰,能被其他类所访问
友好变量和友好方法
不用关键词public,private,protected修饰
-
访问范围:
- 仅能在当前类内部被访问。
- 仅能在同一包中的其他类中被访问(无论是否是子类)。
- 不同包中的类(包括子类)都无法访问。
受保护的成员变量和方法
用关键词protected修饰
-
访问范围:
- 能在当前类内部被访问。
- 能在同一包中的其他类中被访问(与友好成员相同)。
- 不同包中的子类可以访问(通过子类的实例或子类内部访问父类的
protected成员)。 - 不同包中的非子类无法访问。
public类和友好类
1. public 类
-
定义:使用
public修饰符的类,例如public class MyClass { ... }。 -
访问范围:
- 可以被任何包中的任何类访问(前提是该类所在的包被正确导入)。
-
特殊规则:
- 一个 Java 源文件(
.java文件)中最多只能有一个public类,且该类的类名必须与源文件的文件名完全一致(包括大小写)。例如,public class Test必须放在Test.java文件中。
- 一个 Java 源文件(
2. 友好类(默认访问权限的类)
-
定义:没有使用任何访问修饰符的类,例如
class MyClass { ... }。 -
访问范围:
- 仅能被同一包中的其他类访问。
- 不同包中的类无法访问(即使导入包也不行)。
-
特殊规则:
- 一个 Java 源文件中可以有多个友好类,且类名无需与文件名一致。
基本类型的类封装
1. 对应关系
8 个基本类型→8 个包装类,重点记最常用的:
int→Integer(唯一特殊,不是首字母大写)char→Character(也是特殊)- 其他:
double→Double、boolean→Boolean等(首字母大写)
2. 最常用的功能
- 字符串转基本类型:比如
Integer.parseInt("123")把字符串转成 int。 - 基本类型转字符串:
Integer.toString(123)或直接123 + ""。
3. 自动装箱 / 拆箱
- 装箱:基本类型自动变包装类,比如
Integer a = 10;。 - 拆箱:包装类自动变基本类型,比如
int b = a;。
坑:包装类可以为null,拆箱时如果是null会报错(NullPointerException)。
4. 缓存机制
Integer、Byte等会缓存 -128~127 之间的值:
- 比如
Integer a=100; Integer b=100;,a==b结果是true(用缓存的同一个对象)。 - 但
a=200; b=200;,a==b是false(超出范围,新建对象)。
var局部变量
-
只能用于局部变量
public void test() { var num = 10; // 正确:局部变量 var str = "hello"; // 正确 } // 错误用法(编译不通过): var name; // 必须声明时初始化(否则无法推断类型) class MyClass { var age; // 不能用于成员变量 } -
自动推断类型
变量的类型由初始化值决定,一旦确定就不可变(强类型特性不变)。 必须声明时初始化。
- 简化代码,不影响性能
对象数组
Student [] stu;
stu = new Student[10];
使用前需要stu[0]= new Student();
jar文件
文档性质的jar文件
即代码的说明书打包文件 例子:
位置:D:\Java\ch4\sohu\com
位置:D:\Java\ch4\sun\hello\moon
1. 编写清单文件
比如:qingdan.mf
位置:D:\Java\ch4
注意:保存时编码选择ANSI,保存类型选择所有文件
2. jar命令
生成:
3.使用jar文件中的类
- 源文件:
位置:
D:\Java\ch4\tom\jiafei
- 编译:
- 运行:
可运行的jar文件
可运行的JAR文件(Runnable JAR)是一种特殊的JAR包,它包含了可直接执行的Java程序,不需要额外解压或手动指定主类就能运行,是Java程序分发和部署的常用形式。
核心特点:
- 包含程序所有依赖
里面不仅有编译后的.class文件,还可能包含程序运行所需的其他资源(如配置文件、图片等),甚至可以打包第三方依赖库。
- 指定了主类
必须在JAR包的META-INF/MANIFEST.MF清单文件中,通过Main-Class属性指定程序的入口类(即包含main方法的类),例如:
Manifest-Version: 1.0
Main-Class: com.example.MyMain // 主类全限定名(包名+类名)
如何运行?
直接用java -jar命令即可,无需手动指定主类:
java -jar 文件名.jar
如何创建?
- 手动打包(命令行)
- 先编译Java文件得到
.class文件; - 编写清单文件(如
manifest.mf),指定Main-Class; - 用
jar命令打包:cmd jar cfm 可运行.jar manifest.mf 所有.class文件及资源
- IDE自动生成 IDE(如IDEA、Eclipse)提供可视化操作,直接选择“导出可运行JAR”,自动处理主类和依赖打包,更简单。
关键作用:
- 方便分发:一个文件包含所有内容,用户拿到后直接运行,无需配置环境或手动找类。
- 标准化部署:确保程序在不同环境中以相同方式运行,减少配置错误。 总结:可运行JAR是Java程序的“绿色执行包”,通过内置主类信息,实现一键运行,是Java程序分发的标准方式。
文档生成器
指的是 javadoc 工具,它是 JDK 自带的命令行工具,用于从 Java 源代码的注释(特殊格式的注释)中自动生成HTML 格式的 API 文档。
核心作用:
- 从代码注释自动生成结构化文档(类似 Java 官方 API 文档的风格)。
- 保持文档与代码同步:修改代码注释后,重新生成文档即可更新,避免 “文档与代码脱节”。
基础用法(命令行):
- 在代码中写规范注释使用
/** ... */格式的注释(文档注释),并通过标签(如@param、@return)说明细节:
/**
* 计算两个整数的和
* @param a 第一个整数
* @param b 第二个整数
* @return 两个整数的和
*/
public static int add(int a, int b) {
return a + b;
}
2. 运行 javadoc 命令生成文档
基本语法javadoc [选项] 源文件.java
例如,为 MyClass.java 生成文档,并输出到 docs 文件夹:
javadoc -d docs MyClass.java