网站首页 > 精选教程 正文
1、类
1)类(class)是构造对象的模板;
2)类可以理解为制作材料的模具,对象可以理解为是通过模具制作出来的材料;
3)由类构造对象的过程称为创建类的实例(instance);
4)*.class 字节码文件只是存在硬盘上的一种文件,需要通过 ClassLoader 加载器把 *.class 文件内容加载到内存中;
5)使用 javac 命令编译源文件时:
1、如果存在相同的部分,可以使用通配符一次编译多个源文件,
如:javac Employee*.java;
2、如果 A 类中依赖了 B 类,那在编译 A 类源文件时会自动查找依赖的 B 类字节文件,
如果没找到则会查找 B 类源码文件并编译;
5)UML类图
> Unified Modeling Language,统一建模语言;
> 推荐画图工具draw.io,支持网页版、客户端,非常好用;
2、对象与对象变量
1)首先要区分清楚变量和对象变量的概念,变量包含对象变量和基础类型变量,如:
// 要认识到变量 nowDate 不是一个对象,
// 在没有初始化之前不能使用该变量上的任何方法,因为这些方法是对象的;
Date nowDate,是定义一个Date类型对象变量;
int a = 0,是定一个基础类型变量,并赋值0;
2)对象可以理解为是通过模具制作出来的材料,而类就是这个制作材料的模具,new 操作符会构造一个新对象出来,在内存中划分空间;
// 这里是创建一个Date类的实例对象,并把引用赋值给变量nowDate
Date nowDate = new Date();
3)对象变量 nowDate 中存放的是 new 出来的对象的引用,即变量的值是一个引用;
4)new Date(),new 操作符构造一个对象时返回的是该对象的引用,可以不把引用赋值给变量而直接使用;
5)变量初始化赋值;
3、隐式参数和显式参数
1)user.setName(String name),user 被称为隐式参数,setName 方法括号中的 String name 是显式参数;
4、基于类的访问权限
1)一个类中的方法可以访问,调用该方法的对象的私有字段;
如:channel1.handle(channel2);
解释:
handle() 方法是属于ClueChannelDTO类对象的,
当对象 channel1 调用它的 handle() 方法时,在handle()方法内部是可以直接
访问 channel1 对象的私有字段的;
2)一个方法可以访问所属类的所有对象的私有字段;
如:在 channel1 对象的 handle() 方法中可以直接
访问同一个类的 channel2 对象中的私有字段;
5、final修饰实例成员字段
1)final 修饰的字段必须在构造对象时初始化,即实例化对象后这个字段就已经有值了,且之后不可再改变;
> 手动写一个无参构造函数,不给final 修饰的字段赋值,也会编译报错;
> final 修饰的字段,lombok组件的@Data 注解不会为该 final 字段生成 setXxx 方法;
2)final 修饰的类称为不可变类,String 类就是不可变的;
3)final 修饰的类不能被继承,即不会有子类;
4)final 修饰方法,表示该方法不能被子类重写;
6、静态字段和静态方法
静态字段
1)静态字段也叫类字段,属于类而不是属于类的对象;
静态常量
1)使用 static final 两个关键字修饰的字段称为静态常量;
2)已经赋值的 final 变量的值是不可以修改,这是 java 规范,但是 System 类中的 setOut() 方法可以修改 out 变量的值,这是因为 setOut() 方法调用了原生方法,绕过了 java 语言的访问控制机制;
> 我们一般写程序时不建议这样做;
静态方法
1)使用 static 修饰的方法被称为静态方法;
静态工厂方法
1)通过一个静态方法来创建本类的对象,那该静态方法可以称为静态工厂方法;
7、方法参数
1)Java 是按值传递参数给方法的;
2)基本类型是直接把值传递给方法,方法参数会生成一个传递值的副本;
> 在方法内对基本类型的参数做处理并不会影响传入的原变量的值;
3)对象类型是把变量的值(即对象的引用)传递给方法,方法参数会生成一个副本,值是对象的引用,即这个副本也是指向对象的;
8、对象构造
重载
1)一个类中存在多个方法名相同,参数个数不同或参数类型不同的方法,这就叫方法重载;
2)方法名+参数类型叫做方法的签名,方法签名不包含返回类型;
3)方法名和参数类型相同但是返回类型不同的两个方法是不能存在的;
默认值和字段初始化
1)在类构造器中没有显式的为字段赋初始值,就会自动的为字段赋默认值,数值默认0,boolean 类型默认 false,对象类型默认 Null;
无参构造器
1)当类中没有任何构造器时,会有一个默认的构造器;
2)使用无参构造器在构建对象时,会为对象所有字段赋默认值;
显式字段初始化
1)可以在实例字段定义时赋值;
在构造器中通过 this 关键字调用另一个构造器
1)this 表示当前对象;
2)this 也可以用作当前类的构造器;
初始化块(静态与非静态)
1)初始化数据字段的方法有三种:
> 在构造器中初始化字段值;
> 在类中声明字段时初始化;
> 在初始化块中进行自动初始化;
2)在类中可以包含任意多个代码块,构建对象时就会执行这些代码块;
> 首先运行初始化代码块,之后才运行构造器主体部分;
3)静态初始化块;
> 在类第一次加载的时候,会进行静态字段初始化;
> 静态字段初始化方法或静态初始化块,都是按照出现的顺序执行;
4)执行顺序,静态初始化块 > 初始化块 > 构造器;
调用构造器的处理步骤
1)在构造器的第一行调用了另一个构造器,则会先执行另一个构造器;
2)所有数据字段初始化为默认值;
3)按照出现的顺序,执行所有字段初始化方法和初始化块;
4)执行构造器主体代码;
new 一个对象的过程
1)JVM 看到 new 指令,会先去检查在常量池中是否存在指定类的全限定名称,如果存在则进一步检查该类是否被加载、解析、初始化过,即检查是否第一次使用该类;
如果是第一次使用该类,则先进行加载、解析、初始化;
初始化是指对类的 static 变量做初始化;
2)申请内存空间,创建对象;
3)初始化对象中的变量(赋默认值),执行普通代码块或调构造方法初始化;
4)把对象的引用赋值给引用变量;
注意:3)和 4)可能发生指令重排序;
9、public / private / protected / 无修饰符
1)访问权限有四种,public / private / protected / 无修饰符;
2)类定义只能使用 public 修饰或无修饰符:
> 无修饰符时只能在同一个 package 包中被访问到;
3)一个类源文件中只能有一个 public 修饰的 class,其他需是无修饰符;
4)public / private / protected / 无修饰符 可以修饰字段和方法;
10、清单文件 Manifest.MF
1)jar 文件 META-INF 目录中有清单文件 MANIFEST.MF;
2)打包成可执行的 jar 文件时,可以在清单文件中指定程序的主类,如:
Main-Class: xx.xx.AppMainClass(这里不需要.class扩展名)
3)清单文件必须以换行符结束,不然无法被正确的读取;
4)在 windows 系统有包装器工具,可以将 jar 文件转换成 windows 系统的可执行文件,即 .exe 扩展名的文件,工具诸如:Launch4J / IzPack;
11、其他
1)写一个当月日历表:
public static void main(String[] args) {
String[] weeks = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
for (int i=0; i<weeks.length; i++) {
System.out.print(weeks[i] + (i<weeks.length-1 ? " " : ""));
}
System.out.println();
LocalDate now = LocalDate.now();
int daysOfMonth = now.lengthOfMonth();
int today = now.getDayOfMonth();
int weekWithFirstDayOfMonth = now.minusDays(today-1).getDayOfWeek().getValue();
int weekWithLastDayOfMonth = now.minusDays(today-1).plusDays(daysOfMonth-1).getDayOfWeek().getValue();
int totalLen = (weekWithFirstDayOfMonth-1) + daysOfMonth + (weeks.length-weekWithLastDayOfMonth);
String space = " ";
for (int i=0; i<totalLen; i++) {
int mod = Math.floorMod(i+1, weeks.length);
if ((weekWithFirstDayOfMonth-1) > i) {
System.out.print(space);
} else if (i+1 > (weekWithFirstDayOfMonth-1) + daysOfMonth) {
System.out.print(space);
} else {
String day = String.valueOf((i+1)-weekWithFirstDayOfMonth+1);
if ((i+1) == today + (weekWithFirstDayOfMonth-1)) {
day = day + "*";
}
System.out.print(day + space.substring(0, space.length()-day.length()));
}
if (mod != 0) {
System.out.print(" ");
}
if (mod == 0 && i != 0 && i != totalLen-1) { // 换行
System.out.println();
}
}
}
- 上一篇: 详细介绍一下Java中的类加载过程?
- 下一篇: JAVA中相同限定名类加载顺序
猜你喜欢
- 2025-01-01 悲剧!IDEA 突然找不到类了?
- 2025-01-01 还不理解 Error 和 Exception 吗,看这篇就够了
- 2025-01-01 Java中常见的20个错误及解决方案
- 2025-01-01 阿里P7面试官:请你简单说一下类加载机制的实现原理?
- 2025-01-01 java类加载与初始化
- 2025-01-01 Java的加载与执行
- 2025-01-01 JVM详解之:类的加载链接和初始化
- 2025-01-01 关于类加载的一些常见错误
- 2025-01-01 Java类加载器及双亲委派机制:深入理解与示例
- 2025-01-01 JVM实战—1.Java代码的运行原理
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)