1、类1)类(class)是构造对象的模板;2)类可以理解为制作材料的模具,对象可以理解为是通过模具制作出来的材料;3)由类构造对象的过程称为创建类的实例(instance);4)*.class 字节码文件只是存在硬盘上的一种文件,需要通过 ClassLoader 加载器把 *.class 文件内容加载到内存中;
5)使用 javac 命令编译源文件时:1、如果存在相同的部分,可以使用通配符一次编译多个源文件,如:javacEmployee*.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类的实例对象,并把引用赋值给变量nowDateDate nowDate = newDate();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.MF1)jar 文件 META-INF 目录中有清单文件 MANIFEST.MF;2)打包成可执行的 jar 文件时,可以在清单文件中指定程序的主类,如:Main-Class
: xx.xx.AppMainClass(这里不需要.class扩展名)3)清单文件必须以换行符结束,不然无法被正确的读取;4)在 windows 系统有包装器工具,可以将 jar 文件转换成 windows 系统的可执行文件,即 .exe 扩展名的文件,工具诸如:Launch4J / IzPack;
11、其他1)写一个当月日历表:publicstaticvoidmain(String[] args) { String[] weeks = {"星期一", "星期二", "星期三",
"星期四", "星期五", "星期六", "星期日"}; for (int i=0; i
-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
if ((weekWithFirstDayOfMonth-1) > i) { System.out.print(space); } elseif (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(); } } }
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。