当前位置:文档之家› 2019年Java学习笔记精彩版

2019年Java学习笔记精彩版

2019年Java学习笔记精彩版
2019年Java学习笔记精彩版

Day01 Day02

Java到底有哪些优势?

1.跨平台(平台=OS)可移植性

在不同的操作系统之上可以不用做任何代码的修改

直接使用

a)字节码文件:字节码文件不包括任何内存布

局信息与操作系统和硬件毫无关系(Java的

内存分布是在运行的时候才动态分配的)

b)JVM:真正解释字节码文件内容并且和操作系

统交互的部分Sun(Oracle)已经给每一款操作

系统都写好了现成的JVM

JVM组成部分:

类加载器ClassLoader

字节码校验器

解释执行器(翻译)逐行的解释执行代码

2.安全健壮

3.面向对象

面向过程:

程序:函数+变量(算法+数据结构)

面向对象:

如:SmallTalk

程序:对象和对象相互之间的“通讯”

对象:属性和方法

类:创建对象的模板具有相同特征的一类

事物的高度抽象集合概念

对象是类的实例化,类是对象的抽象

化。

引用

4.动态更新

5.简单!

没有指针和相关的内存操作

new 内存操作

gc 内存回收清理Java中的回收机制:

零引用回收

问题:();

().gc();

调用gc的下一行是否回收?不一定6.免费开源

搭建Java开发平台

(JavaSDK java开发工具包) SDK(软件开发工具包)

JDK安装

JDK 猛虎

JDK 野马

JDK 海豚

JDK JRE JVM

JDK Java开发工具包

JRE Java运行环境

JVM Java虚拟机

JDK = JRE + 常用工具

JRE = JVM + 核心类库

JVM = 三部分

2.设置环境变量

我的电脑-属性-高级-环境变量

为了使开发过程变得更加简单快捷(问题:搭载Java开发平台最少设置几个环境变量?零个。为了方便,不是必要。)

a)PATH 就是为了在任何一个目录下都可以

直接访问bin目录下的工具(命令)

C:\Program Files\Java\jdk1.6.0_06\bin

b)CLASSPATH 默认值: . (当前目录)

c)JAVA_HOME 设置到JDK安装目录下

JAVA_HOME:JDK安装目录下

CLASSPATH:.

PATH:%JAVA_HOME%\bin

*环境变量名字最好全部大写

*在CMD设置环境变量时=左右两边不要加空格

*在CMD中定义任意程序环境变量:

如:set PATH=E:\TTPlayer

同时定义两个环境变量中间加分号,或者

Set PATH=%PATH%;E:\TTPlayer

分号后面不能加空格

运行过程:

编译期:Java源文件.java编译为字节码文件.class

运行期:JVM --OS硬件

编写代码HelloWorld

如何编译java程序

javac 源文件的名字.java

如何运行java程序

java 类名(没有扩展名)

代码:

public 修饰符modifier

static 修饰符静态(不用通过对象调用)

void 方法返回值(表示这个方法不需要返回值)main 标识符

标识符Identifier

1.必须是英文_ $ 中文开头

2.不能使用有特殊意义的名字(关键字)

类名(接口名):每个单词首字母大写

属性名和方法名:首字母小写,之后每个单词首字母大写

包名:全部小写

The most common relationships between classes are ? Dependence (“uses–a”)

? Aggregation (“has–a”)

? Inheritance (“is–a”)

类成员:

类可以拥有三种成员:

·字段:它们是类及其对象相关联的数据变量,保存着类或者对象的状态。

·方法:它们包含类的可执行代码并定义了对象的行为

·嵌套类(nested class)与嵌套接口(nested interface):它们是在其他的类或接口声明的内部声明的类与接口。

类修饰符:

·注解(annotation)

·public:任何人都可以声明对这种类的对象的引用,或者访问这种类的公共成员。

·abstract:抽象类,被认为是不完整的,所以我们不能创建抽象类的实例。通常这是因为抽象类包含abstract方法,这些方法必须在子类中实现。·final:final类不允许拥有子类。类不能既是final 的又是abstract的。

·严格浮点(strict floating point):声明为strictfp的类要求类中的所有浮点运算都是精确运算

Java当中的包(对应操作系统当中的目录)

1.区分不同的命名空间

2.对多个.class文件进行分类的归类

编译语句:javac -d .

-d 自动创建源文件当中指定的包结构

.在当前目录下创建目录结构

运行语句: java 包名.类名

通过包名和类名来唯一确认一个类

打包语句:package

导包语句:import

例:打包,源文件放在桌面,为了能够运行,定义主

编译:打开CMD,输入“cd 桌面”转到当前目录,编译语句:javac –d .

运行:java (通过包名

+类名唯一确定一个类)例:导包,先写一个打包文件:

编译:javac –d .

编译:javac

运行:java Hello

生成帮助文档的常用工具javadoc 语句:

javadoc -d doc 源文件的名字.java

Java注释:

单行注释/

多行注释/* */

文档注释/** */

生成jar包

jar包就是java当中可执行的压缩归档文件

1.可执行

2.压缩

3.归档一个java程序可能涉及到很多个.class 把

它们都归纳在一起变成一个文件

生成jar包语句:

jar cvf 名字.jar 要放进压缩文件里的文件

c 创建新的归档文件

v 标准输出设备显示详细列表信息

f 指定归档文件的名字

生成可执行Jar包具体步骤:

1 写.java文件

2 编译.java生成.class

javac

3 将class文件打到jar包当中

jar cvf

4 修改jar当中的清单文件,在第三行加入

Main-Class: Test

注意:Test前面有空格

(终止程序的方法:在CMD中输入tskill javaw)

变量

编程语言当中肯定要定义很多很多的变量来存储数据变量分类:

1.定义在类体当中的变量

义在方法体中的变量

局部变量

在自己所在的方法体当中可以使用出方法体消亡

局部变量使用之前一定要初始化

*局部变量和成员变量是可以重名的!在局部变量

数据类型

1.基本数据类型primitive types

8种

boolean

char

byte

short

int

long

float

double

Floating-point numbers without an F suffix (such as are always considered to be of type double.

If you want to round a floating-point number to the nearest integer (which is the more useful operation in most cases), use the method:

double x = ;

int nx = (int) (x);

Now the variable nx has the value 10.

布尔型true / false

字符型

3.整数型(符号位数值位)

byte 8位-128 ~ 127

short 16 - 215 ~ 215 -1

int 32 *

long 64 即-2 (n-1) ~ 2(n-1)-1

4.浮点型(符号位幂指位数值位)

float 32位

double 64位*

2.引用数据类型(自定义类型对象类型)

byte short (char) int long float double

自动提升(就近提升)

强制类型转换

这种类型提升的规则,对于方法参数匹配同样适用

public class Test

{

public static void main(String[] args)

{

boolean flag = true;

char c1 = '中';

char c2 = 97;

char c3 = '\u0000';

char c4 = '\t';

byte b1 = 1;

byte b2 = 2;

byte b3 = (byte)(b1+b2);1L0.1F

公历闰年的简单计算方法:(符合以下条件之一的年份即为闰年)

1.能被4整除而不能被100整除。(如2004年就是闰年,1900年不是)

2.能被400整除。(如2000年是闰年)

题目:判断年份是不是闰年,有三次输入机会

*/

import

Whenever you use a class that is not defined in the basic package, you need to use an import directive. 注意:Comparable属于

Comparator属于(使用前import)

public class TestNine

{

public static void main(String[] args)

{

outer:for(int i=1;i<=9;i++)

{

inner:for(int j=1;j<=9;j++)

{

"×"+i+"="+(i*j)+"\t");

if(j==i)

{

continue outer;

;

public class TestMay162{

public static void main(String[] args){

数组

2.源数组开始复制的下标

3.目标数组

4.目标数组第几个开始放新的值

5.一共放多少个

*/

}

}

public class TestObjectArray

{

public static void main(String[] args)

{

已经知道:有一对熊猫团团圆圆,三个月之后生下一对小熊猫之后每个月生下一对熊猫,小熊猫满三个月之后,每个月生一对儿小熊猫

问:第23个月熊猫总共多少只?

分析:每个月小熊猫的对数关系为1 1 2 3 5 8 13 21 ... public class Panda{

public static void main(String[] args){

int[] iset=new int[23];

iset[0]=1;

iset[1]=1;

for(int i=2;i<;i++){

iset[i]=iset[i-2]+iset[i-1];

}

}

亮) 现在有一百个人排成一队 第一个人拉所有能把1整除的房间里的灯 第二个人拉所有能把2整除的房间里的灯 。。。。。。。。。。 第100个人拉所有能把100整除的房间里的灯 问:最后哪些灯是亮的(考虑实现效率!) public class TestLight{ public static void main(String[] args){ Light[] room=new Light[100]; for(int i=0;i<100;i++){ room[i]=new Light(); } for(int human=1;human<=100;human++){ for(int

number=1;number<=100;number++){ if(number%human==0) room[number-1].pull(); } } for(int i=0;i<100;i++){ if(room[i].isOn) "第"+(i+1)+"个房间的灯是亮的"); } } }

class Light{ boolean isOn;

验证哥德巴赫猜想:任何一个大于6的偶数能够拆分成两个质数相加的和 while(number<=6||number%2!=0){

"你输入的数据不合法,请重新输入:");

number=();

}

for(int i=2;i<=number/2;i++){ if(check(i)&&check(number-i)){ "你输入的数字是两个质数"+i+"和"+(number-i)+"的和"); } } } public static boolean check(int num){ for(int i=2;i<=num/2;i++){ if(num%i==0){ return false; } } return true; } }

4. 验证数学黑洞问题:

任意一个4位数,只要不是4位都相同的,那么取它最大排列组合减去最小排列组合,得到的数再取最大排列组合减去最小排列组合,依次类推,不超过7次则肯定会得到数字6174 import .*;

public class TestBlackHole{ public static void main(String[] args){ Scanner sc=new Scanner; "为了验证数学黑洞,请输入一个四位数字,且四位不相同:"); String number=(); while(!("6174")){ int max=getMax(number); "的最大排列组合是:"+max); int min=getMin(number); "最小排列组合是:"+min); number=max-min+""; "二者想减得到的新数字为:"+number); } } public static int getMax(String str){ char[] nums=(); (nums); StringBuilder builder=new StringBuilder(new

String(nums));

();

int ok=());

return ok;

}

public static int getMin(String str){

char[] nums=();

(nums);

String s=new String(nums);

int ok=(s);

return ok;

}

}

关于二维数组:Java当中的二维数组其实就是数组(引用类型)的数组,下面一段代码定义了一个存放不同个数元素的数组的数组

int[][] iset = new int[7][];

iset[0] = new int[3];

iset [1] = new int[3];

iset [2] = new int[4];

iset [3] = new int[3];

iset [4] = new int[3];

iset [5] = new int[2];

iset [6] = new int[2];

图示:

Day05

面向对象三大基本特征

封装(encapsulation)

继承(inheritance)

多态(polymorphism)

public class TestEncap{

public static void main(String[] args){

Human hm = new Human();

(30);

}

}

class Human{

private int age;

private String name;

public int getAge(){

return age;

}

public void setAge(int age){

型不同2.个数不同3.顺序不同)

下面这段代码编译时出错,要清楚如何编译、多态、方法重载、方法覆盖!

*/

public class TestOverload{

public static void main(String[] args){

A bb = new B();

(10);

态多态(父类类型子类对象)

2.静态多态编译时多态(Java当中的方法重载Overload )

public class TestSuper{

public static void main(String[] args){

B baby = new B();

();

}

}

class A{

int i = 100;

public void display(){

"A类的display方法");

}

}

class B extends A{

int i = 1000;

public void display(){

打印当前对象的i属性谁调用display谁就是当前对象

打印当前对象的父类对象的i属性();

}

}

图示:

构造器(constructor)

/*

构造器:在构造对象的时候需要调用.构造器没有返回类型名字要和类名完全一样

Java当中每个类都有构造器

构造器通常用来初始化实例变量(属性)

构造器可以重载,但不能被继承,更不能被覆盖!

构造器的第一句肯定是super();或this(); 无参的构造器默认第一句super();

*/

public class TestConstructor{

public static void main(String[] args){

JavaTeacher jt = new JavaTeacher();

}

}

class Teacher{

int age;

String name;

public Teacher(){

"Teacher的无参构造方法被调用了");

}

public Teacher(int age,String name){

"Teacher的有参构造方法被调用了"); 占用的内存如何被释放,而Java当中内存的分配和回收完全是交于GC来自动管理,Java当中的Object类有finalize().但是finalize()和析构函数不是同样的概念,这个方法只是gc回收之前被调用的一个普通方法.

public class TestObject{

public static void main(String[] args){

while(true)

{

Teacher tea = new Teacher(23,"ABC");

性名访问

修饰方法:

这个方法不用通过对象就可以访问,通过类名.方法名()就可以直接调用

但是静态方法当中不能直接访问非静态的属性,不能直接调用非静态的方法

修饰代码块:

静态初始化块(初始化静态属性的)

public class TestStatic1{

public static void main(String[] args){

People peo=new People();

People peo1=new People();

=20;

="Earth";

非静态i是对象的一部分,对象peo对应的i不随peo1的i改变

静态属性home唯一,新对象peo1进行了重新赋值,home的值改变,即People类下所有新new对象home值都改变

不依靠对象存在可以直接通过类名.属性名访问

}

}

class People{

static String home = "地球";

int i=19;

}

运行结果:

19

Earth

Earth

public class TestStatic2{

public static void main(String[] args){

(); 法名() 可以直接调用 性 名访问

Human h1=new Human("you"); ();

}

}

class Human{ static String home="earth"; String name; public Human(String name){ =name; } public static void destroy(){ home="devil"; } public void protect(){ home="heaven"; } }

总结一下对象的创建过程,假设有个名为Dog 的类: 1. 当首次创建类型为Dog 的对象时(构造器可以看成

静态方法),或者Dog 类的静态方法/静态字段首次被访问时,Java 解释器必须查找类路径,以定位文件.

2. 然后载入(创建一个Class 对象),有关静态初始化的

所有动作都会执行.因此,静态初始化只在Class 对象首次加载的时候进行一次.

3. 当用new Dog()创建对象的时候,首先将在堆上为

Dog 对象分配足够的存储空间.

4. 这块存储空间会被清零

,这就自动地将Dog 对象中

的所有基本数据类型都设置成了缺省值,而引用则被设置成了null.

5. 执行所有出现于字段定义处的初始化动作.

6. 执行构造器.

以看到有四种容器:Map、List、Set和Queue。图中常用容器用黑色粗线框表示,点线框表示接口,实线框表示普通类,带有空心箭头的点线表示一个特定的类实现了一个接口,实心箭头表示某个类可以生成箭头所指向类的对象。

下面这个图是集合类库更加完备的图。

ArrayList

import .*;

;

public class TestArrayListEquals{

public static void main(String[] args){

Student stu1 = new Student("张三");

Student stu2 = new Student("李四");

Student stu3 = new Student("李四");

ArrayList al = new ArrayList();

(stu1);

(stu2);

(stu3);

(stu3);

;

public class LotteryTicket{

public static void main(String[] args){

ArrayList box = new ArrayList(23);

;

public class TestLinkedList{

public static void main(String[] args){

LinkedList al = new LinkedList();

(new String("abc"));

(new Teacher());

(1);

for(int i = 0;i<();i++){

}

for(Object obj : al){

}

}

}

class Teacher{

}

;

public class TestSpeed{

public static void main(String[] args){

LinkedList al = new LinkedList();

for(int i = 0;i<=1000000;i++){

(i);

}

long time1 = ();

for(int i = 0;i<=1000000;i++){

Object obj = (i);

}

long time2 = ();

- time1);

}

}

Vector

;

public class TestVector{

public static void main(String[] args){

Vector al = new Vector();

(new String("abc"));

(new Teacher());

(1);

for(int i = 0;i<();i++){

}

for(Object obj : al){

}

}

}

class Teacher{

}

public class TestHashCode{

public static void main(String[] args){

Object obj1 = new Object();

Object obj2 = new Object();

String str1 = new String("abc");

String str2 = new String("abc");

;

public class TestHashSet{

public static void main(String[] args){ HashSet hs = new HashSet();

;

public class Exec{

public static void main(String[] args){

A aa = new A();

A bb = aa;

A cc = bb;

HashSet hs = new HashSet();

(aa);

if(aa == bb){

(bb);

}

if(aa == cc){

(cc);

}

;

public class TestHashSet{

public static void main(String[] args){ HashSet hs = new HashSet();

(new Student(15,"Tom")); ;

public class TestHashSet2nd{

public static void main(String[] args){

HashSet hs = new HashSet();

Teacher tea1 = new Teacher("Robin",30);

Teacher tea2 = new Teacher("Robin",30);

(tea1);

(tea2);

/*

首先第一个元素放进去的时候会调用hashCode(),而不会用equals()进行判断

第二个元素放进来的时候调用这个对象的hashCode(),与集合当中每个已经存在的元素的hashCode()进行比较,(注意,其实只会调用当前要添加元素的hashCode(),已添加元素的hashCode()不会再调用)

1.如果相等:

判断hashCode()相等的那两个对象equals()是否为true

A:equals()也相等只能存一个

B:equals()不相等存入两个

2.如果不等:存入两个

*/

;

public class TestTreeSet{

public static void main(String[] args){

TreeSet ts = new TreeSet();

;

public class Test{

public static void main(String[] args){

public class TestOne{

public static void main(String[] args){

/*

1 按照车牌号降序排列

2 按照座位个数升序排列

*3 随机顺序进行排列

*/

TreeSet ts = new TreeSet(new CarNumberComparator());

(new Car("鲁A12345",24));

(new Car("鲁A88888",30));

(new Car("鲁A11111",23));

for(Object obj:ts){

Car car=(Car)obj;

"\t"+;

}

"==== 华丽的分割线====");

TreeSet ts2 = new TreeSet(new CarSeatComparator());

(new Car("鲁A12345",24));

(new Car("鲁A88888",30));

(new Car("鲁A11111",23));

for(Object obj:ts2){

Car car=(Car)obj; "\t"+;

return false;

/*

做人要负责任做程序员更要负责任

定义一个不是void方法那么必须保证这个方法在任何情况下都得有return 语句

*/

}

}

public class Exec{

public static void main(String[] args){

show(1);

show(1,2);

show(1,2,3,4,6,5,8,7);

}

public static void show(int ... iset){

;

public class TestHashMap{

public static void main(String[] args){

HashMap hm = new HashMap();

;

public class TestHashMap2{

public static void main(String[] args){

HashMap hm = new HashMap();

/*

键是原来的键(先入为主) 而值是后来的值(后来先到)

*/

(new Teacher("马老师"),new Student("张飞"));

(new Teacher("我"),new Student("班长"));

(new Teacher("Robin"),new Student("张飞"));

(new Teacher("马老师"),new Student("班长"));

Teacher("马老师")));

;

public class PhoneBook{

static TreeMap data = new TreeMap();

{

(new NoteInfo("Tom","0531-110") ,new NoteDetail("10000",""));

(new NoteInfo("Jerry","0531-119") ,new NoteDetail("12345",""));

(new NoteInfo("Tom","0531-120") ,new NoteDetail("669688",""));

}

");

return;

}

int count = 1;

ArrayList al = new ArrayList();

"编号\t姓名\t电话");

for(Object obj:keys){

"\t"+obj);

(obj);

count++;

}

String str = getUserInput("请问您想查看哪个联系人的详细信息(放弃请按0)");

int line = (str);

if(line == 0) return;

Object userChoose = (line-1);opy not right..");

}

public static String getUserInput(String tips){

return ();

}

public static void displayMenu(){

"———————");

"|中国|");

"|移动|");

"||");

"| 1.查看|");

"||");

"| 2.添加|");

"||");

"| 3.修改|");

"| |"); "| 4.删除 |"); "| |

"); "| 5.版权 |"); "| |"); "| 6.退出 |"); "| |"); "———————"); }

public static void insert(){ "请输入您要添加的联系人的姓名:"); String name = ();

"请输入您要添加的联系人的电话:");

String number = ();

"请输入您要添加的联系人的QQ :"); String qq = (); "请输入您要添加的联系人的Email :"); String email = (); NoteInfo key = new NoteInfo(name,number); NoteDetail value = new NoteDetail(qq,email); (key,value); } public static void delete(){ Set keys = (); int count = 1; ArrayList al = new ArrayList(); "编号\t 姓名\t 电话"); for(Object obj:keys){ "\t"+obj); (obj); count++; } String str = getUserInput("请问您想删除第几个用户

(放弃请按0)"); int number = (str); if(number == 0) return; Object key = (number - 1); (key); 对路径 相对于当前文件存放的路径来寻找目标文件 2.绝对路径 从根目录开始定位目标文件 关于路径分隔符 win:\ Unix:/

public class TestCalendar{

public static void main(String[] args)throws Exception{

File doc = new File("");

long time = ();//获得最后一次修改时间

Calendar cal = ();//得到日历对象(time);//指定了日历所代表的时间以long 毫秒数

int year = (1);//

int month = (2)+1;//

int day = (5);//

int hour = (10);

int minute = (12);

int second = (13);

"年"+month+"月"+day+"日"+hour+":"+minute+":"+second);

/*

Date modify = new Date(time);//以time指定的毫秒数来创建日期对象

int year = ()+1900;

int month = ()+1;

int day = ();

int hours = ();

"/"+month+"/"+day);

*/

}

}

相关主题
文本预览
相关文档 最新文档