易途科技Java学习笔记.docx
《易途科技Java学习笔记.docx》由会员分享,可在线阅读,更多相关《易途科技Java学习笔记.docx(45页珍藏版)》请在冰豆网上搜索。
易途科技Java学习笔记
Day01Day02
Java到底有哪些优势
1.跨平台(平台=OS)可移植性
在不同的操作系统之上可以不用做任何代码的修改
直接使用
a)字节码文件:
字节码文件不包括任何内存布局信息与操作系统和硬件毫无关系(Java的内存分布是在运行的时候才动态分配的)
b)JVM:
真正解释字节码文件内容并且和操作系统交互的部分Sun(Oracle)已经给每一款操作系统都写好了现成的JVM
JVM组成部分:
类加载器ClassLoader
字节码校验器
解释执行器(翻译)逐行的解释执行代码
2.安全健壮
3.面向对象
面向过程:
程序:
函数+变量(算法+数据结构)
面向对象:
如:
SmallTalk
程序:
对象和对象相互之间的“通讯”
对象:
属性和方法
类:
创建对象的模板具有相同特征的一类事物的高度抽象集合概念
对象是类的实例化,类是对象的抽象化。
引用
4.动态更新
5.简单!
没有指针和相关的内存操作
new内存操作
gc内存回收清理Java中的回收机制:
零引用回收
问题:
();
().gc();
调用gc的下一行是否回收不一定
6.免费开源
搭建Java开发平台
(JavaSDKjava开发工具包)SDK(软件开发工具包)
JDK安装
JDK猛虎
JDK野马
JDK海豚
JDKJREJVM
JDKJava开发工具包
JREJava运行环境
JVMJava虚拟机
JDK=JRE+常用工具
JRE=JVM+核心类库
JVM=三部分
2.设置环境变量
我的电脑-属性-高级-环境变量
为了使开发过程变得更加简单快捷(问题:
搭载Java开发平台最少设置几个环境变量零个。
为了方便,不是必要。
)
环境变量名字
给谁用
做什么用
PATH
操作系统
更快的找到程序
CLASSPATH
JVM(类加载器)
找到字节码文件
JAVA_HOME
其他Java程序
找到JDK
a)PATH就是为了在任何一个目录下都可以直接访问bin目录下的工具(命令)
b)C:
\ProgramFiles\Java\默认值:
.(当前目录)
c)JAVA_HOME设置到JDK安装目录下
JAVA_HOME:
JDK安装目录下
CLASSPATH:
.
PATH:
%JAVA_HOME%\bin
*环境变量名字最好全部大写
*在CMD设置环境变量时=左右两边不要加空格
*在CMD中定义任意程序环境变量:
如:
setPATH=E:
\TTPlayer
同时定义两个环境变量中间加分号,或者
SetPATH=%PATH%;E:
\TTPlayer
分号后面不能加空格
运行过程:
编译期:
Java源文件.java编译为字节码文件.class
运行期:
JVM--OS硬件
编写代码HelloWorld
如何编译java程序
javac源文件的名字.java
如何运行java程序
java类名(没有扩展名)
代码:
publicclassHelloWorld
{
publicstaticvoidmain(String[]args)
{
"Hello!
!
");
}
}
public修饰符modifier
static修饰符静态(不用通过对象调用)
void方法返回值(表示这个方法不需要返回值)
main标识符
标识符Identifier
1.必须是英文_$中文开头
2.不能使用有特殊意义的名字(关键字)
类名(接口名):
每个单词首字母大写
属性名和方法名:
首字母小写,之后每个单词首字母大写
包名:
全部小写
Themostcommonrelationshipsbetweenclassesare
•Dependence(“uses–a”)
•Aggregation(“has–a”)
•Inheritance(“is–a”)
类成员:
类可以拥有三种成员:
·字段:
它们是类及其对象相关联的数据变量,保存着类或者对象的状态。
·方法:
它们包含类的可执行代码并定义了对象的行为
·嵌套类(nestedclass)与嵌套接口(nestedinterface):
它们是在其他的类或接口声明的内部声明的类与接口。
类修饰符:
·注解(annotation)
·public:
任何人都可以声明对这种类的对象的引用,或者访问这种类的公共成员。
·abstract:
抽象类,被认为是不完整的,所以我们不能创建抽象类的实例。
通常这是因为抽象类包含abstract方法,这些方法必须在子类中实现。
·final:
final类不允许拥有子类。
类不能既是final的又是abstract的。
·严格浮点(strictfloatingpoint):
声明为strictfp的类要求类中的所有浮点运算都是精确运算
Java当中的包(对应操作系统当中的目录)
1.区分不同的命名空间
2.对多个.class文件进行分类的归类
编译语句:
javac-d.
-d自动创建源文件当中指定的包结构
.在当前目录下创建目录结构
运行语句:
java包名.类名
通过包名和类名来唯一确认一个类
打包语句:
package
导包语句:
import
例:
打包,源文件放在桌面,为了能够运行,定义主方法main
package;
publicclassStudent
{
publicstaticvoidmain(String[]args)
{
"Hello!
");
}
}
编译:
打开CMD,输入“cd桌面”转到当前目录,编译语句:
javac–d.
运行:
java(通过包名+类名唯一确定一个类)
例:
导包,先写一个打包文件:
package;
publicclassStudent
{
publicstaticvoidSayHello()
{
"Hello!
");
}
}
编译:
javac–d.
然后写导包文件:
importclassHello
{
publicstaticvoidmain(String[]args)
{
();
}
}
编译:
javac
运行:
javaHello
生成帮助文档的常用工具javadoc语句:
javadoc-ddoc源文件的名字.java
Java注释:
单行注释/
多行注释/**/
文档注释/***/
生成jar包
jar包就是java当中可执行的压缩归档文件
1.可执行
2.压缩
3.归档一个java程序可能涉及到很多个.class把它们都归纳在一起变成一个文件
生成jar包语句:
jarcvf名字.jar要放进压缩文件里的文件
c创建新的归档文件
v标准输出设备显示详细列表信息
f指定归档文件的名字
生成可执行Jar包具体步骤:
1写.java文件
如,写一个无限弹出计算器的代码
publicclassTest
{
publicstaticvoidmain(String[]args)throwsException
{
while(true)
().exec("calc");
}
}
2编译.java生成.class
javac
3将class文件打到jar包当中
jarcvf
4修改jar当中的清单文件,在第三行加入
Main-Class:
Test
注意:
Test前面有空格
(终止程序的方法:
在CMD中输入tskilljavaw)
变量
编程语言当中肯定要定义很多很多的变量来存储数据
变量分类:
1.定义在类体当中的变量
成员变量实例变量
publicclassHelloWorld
{
inti=100;
义在方法体中的变量
局部变量
在自己所在的方法体当中可以使用出方法体消亡
局部变量使用之前一定要初始化
*局部变量和成员变量是可以重名的!
在局部变量所在的方法体中直接出现变量名将代表局部变量
publicclassTestStudent
{
publicstaticvoidmain(String[]args)
{
Studentstu=newStudent();
(25);
}
}
classStudent
{
intage;
Stringname;
publicvoidsetAge(intage)这句没有意义,打印age的默认值0
}
}
数据类型
1.基本数据类型primitivetypes
8种
boolean
char
byte
short
int
long
float
double
Floating-pointnumberswithoutanFsuffix(suchasarealwaysconsideredtobeoftypedouble.
Ifyouwanttoroundafloating-pointnumbertothenearestinteger(whichisthemoreusefuloperationinmostcases),usethemethod:
doublex=;
intnx=(int)(x);
Nowthevariablenxhasthevalue10.
布尔型true/false
字符型
3.整数型(符号位数值位)
byte8位-128~127
short16-215~215-1
int32*
long64即-2(n-1)~2(n-1)-1
4.浮点型(符号位幂指位数值位)
float32位
double64位*
2.引用数据类型(自定义类型对象类型)
无数种
byteshort(char)intlongfloatdouble
自动提升(就近提升)
强制类型转换
这种类型提升的规则,对于方法参数匹配同样适用
publicclassTest
{
publicstaticvoidmain(String[]args)
{
booleanflag=true;
charc1='中';
charc2=97;
charc3='\u0000';
charc4='\t';
byteb1=1;
byteb2=2;
byteb3=(byte)(b1+b2);
公历闰年的简单计算方法:
(符合以下条件之一的年份即为闰年)
1.能被4整除而不能被100整除。
(如2004年就是闰年,1900年不是)
2.能被400整除。
(如2000年是闰年)
题目:
判断年份是不是闰年,有三次输入机会
*/
import
;
Wheneveryouuseaclassthatisnotdefinedinthebasicpackage,youneedtouseanimportdirective.
注意:
Comparable属于
Comparator属于(使用前import)
publicclassTestNine
{
publicstaticvoidmain(String[]args)
{
outer:
for(inti=1;i<=9;i++)
{
inner:
for(intj=1;j<=9;j++)
{"×"+i+"="+(i*j)+"\t");
if(j==i)
{
continueouter;
;
publicclassTestMay162{
publicstaticvoidmain(String[]args){
数组
2.源数组开始复制的下标
3.目标数组
4.目标数组第几个开始放新的值
5.一共放多少个
*/
}
}
publicclassTestObjectArray
{
publicstaticvoidmain(String[]args)
{
已经知道:
有一对熊猫团团圆圆,三个月之后生下一对小熊猫之后每个月生下一对熊猫,小熊猫满三个月之后,每个月生一对儿小熊猫
问:
第23个月熊猫总共多少只
分析:
每个月小熊猫的对数关系为1123581321...
publicclassPanda{
publicstaticvoidmain(String[]args){
int[]iset=newint[23];
iset[0]=1;
iset[1]=1;
for(inti=2;i<;i++){
iset[i]=iset[i-2]+iset[i-1];
}
}
}
2.已经知道:
100个房间,每个房间里有一盏灯(不亮)现在有一百个人排成一队
第一个人拉所有能把1整除的房间里的灯
第二个人拉所有能把2整除的房间里的灯
。
。
。
。
。
。
。
。
。
。
第100个人拉所有能把100整除的房间里的灯
问:
最后哪些灯是亮的(考虑实现效率!
)
publicclassTestLight{
publicstaticvoidmain(String[]args){
Light[]room=newLight[100];
for(inti=0;i<100;i++){
room[i]=newLight();
}
for(inthuman=1;human<=100;human++){
for(intnumber=1;number<=100;number++){
if(number%human==0)
room[number-1].pull();
}
}
for(inti=0;i<100;i++){
if(room[i].isOn)
"第"+(i+1)+"个房间的灯是亮的");
}
}
}
classLight{
booleanisOn;
验证哥德巴赫猜想:
任何一个大于6的偶数能够拆分成两个质数相加的和
/*分析模拟拆分的过程
10:
28X
37right
46X
55right
*/
import.*;
publicclassGoldbachConjecture{
publicstaticvoidmain(String[]args){
Scannersc=newScanner;
"为了验证哥德巴赫猜想请输入一个大于6的偶数:
");
intnumber=();
while(number<=6||number%2!
=0){
"你输入的数据不合法,请重新输入:
");
number=();
}
for(inti=2;i<=number/2;i++){
if(check(i)&&check(number-i)){
"你输入的数字是两个质数"+i+"和"+(number-i)+"的和");
}
}
}
publicstaticbooleancheck(intnum){
for(inti=2;i<=num/2;i++){
if(num%i==0){
returnfalse;
}
}
returntrue;
}
}
4.验证数学黑洞问题:
任意一个4位数,只要不是4位都相同的,那么取它最大排列组合减去最小排列组合,得到的数再取最大排列组合减去最小排列组合,依次类推,不超过7次则肯定会得到数字6174
import.*;
publicclassTestBlackHole{
publicstaticvoidmain(String[]args){
Scannersc=newScanner;
"为了验证数学黑洞,请输入一个四位数字,且四位不相同:
");
Stringnumber=();
while(!
("6174")){
intmax=getMax(number);
"的最大排列组合是:
"+max);
intmin=getMin(number);
"最小排列组合是:
"+min);
number=max-min+"";
"二者想减得到的新数字为:
"+number);
}
}
publicstaticintgetMax(Stringstr){
char[]nums=();
(nums);
StringBuilderbuilder=newStringBuilder(newString(nums));
();
intok=());
returnok;
}
publicstaticintgetMin(Stringstr){
char[]nums=();
(nums);
Strings=newString(nums);
intok=(s);
returnok;
}
}
关于二维数组:
Java当中的二维数组其实就是数组(引用类型)的数组,下面一段代码定义了一个存放不同个数元素的数组的数组
int[][]iset=newint[7][];
iset[0]=newint[3];
iset[1]=newint[3];
iset[2]=newint[4];
iset[3]=newint[3];
iset[4]=newint[3];
iset[5]=newint[2];
iset[6]=newint[2];
图示:
Day05
面向对象三大基本特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
publicclassTestEncap{
publicstaticvoidmain(String[]args){
Humanhm=newHuman();
(30);
}
}
classHuman{
privateintage;
privateStringname;
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
型不同2.个数不同3.顺序不同)
下面这段代码编译时出错,要清楚如何编译、多态、方法重载、方法覆盖!
*/
publicclassTestOverload{
publicstaticvoidmain(String[]args){
Abb=newB();
(10);
态多态(父类类型子类对象)
2.静态多态编译时多态(Java当中的方法重载Overload)
publicclassTestSuper{
publicstaticvoidmain(String[]args){
Bbaby=newB();
();
}
}
classA{
inti=100;
publicvoiddisplay(){
"A类的display方法");
}
}
classBextendsA{
inti=1000;
publicvoiddisplay(){
打印当前对象的i属性谁调用display谁就是当前对象
打印当前对象的父类对象的i属性
();
}
}
图示:
构造器(constructor)
/*
构造器:
在构造对象的时候需要调用.构造器没有返回类型名字要和类名完全一样
Java当中每个类都有构造器
构造器通常用来初始化实例变量(属性)
构造器可以重载,但不能被继承,更不能被覆盖!
构造器的第一句肯定是super();或this();无参的构造器默认第一句super();
*/
publicclassTestConstructor{
publicstaticvoidmain(String[]args){
JavaTeacherjt=newJavaTeacher();
}
}
classTeacher{
intage;
Stringname;
publicTeacher(){
"Teacher的无参构造方法被调用了");
}
publicTeacher(intage,Stringname){
"Teacher的有参构造方法被调用了");
ava当中也没有析构函数,析构函数是描述一个对象所占用的内存如何被释放,而Java当中内存的分配和回收完全是交于GC来自动管理,Java当中的Object类有finalize().但是finalize()和析构函数不是同样的概念,这个方法只是gc回收之前被调用的一个普通方法.
publicclassTestObject{
publicstaticvoidmain(String[]args){
while(true)
{
Teachertea=newTeacher(23,"ABC");
性名访问
修饰方法:
这个方法不用通过对象就可以访问,通过类名.方法名()就可以直接调用
但是静态方法当中不能直接访问非静态的属性,不能直接调用非静态的方法
修饰代码块:
静态初始化块(初始化静态属性的)
publicclassTestStatic