重构之 Java 基础部分
Java介绍
Java由sun Microsystems公司与1995年5月推出,java面向对象程序设计语言和java平台的总称。由James Gosling和同事共同研发。
Java分为三个体系:
JavaSE(J2SE)(java2 plalform standard edition,java 平台标准版)
JavaEE(J2EE) (java2 plalform Enterprise Edition java平台企业版)
JavaME(J2ME) (java2 plalform Micro Edition,java平台微型版)
Java特性:
简单、面向对象、分布式、健壮(丢弃指针,杜绝非法访问)、平台无关(一次编译处处运行)、安全、体系结构中立、可移植、解释型、高性能、多线程、动态等特性。
Java工作原理:
Java 虚拟机,JVM。Java程序在java虚拟机上运行,是java程序的运行环境。
Java编写的程序(.java文件)经过编译器编译生成字节码文件,字节码文件不是针对平台的,是针对java虚拟机的,即不同的平台需要安装不同的虚拟机。不同的虚拟机屏蔽了各个不同平台的差异,从而使java程序具有平台无关性。
.java(文件)----编译----> .class(字节码文件) ---执行----JVM(不同操作jvm)
在jvm内部:类装载器-->字节码效验器---->解释器---->操作系统
类装载器:执行程序寻找和装载所需的类(把字节文件装到虚拟机)
字节码效验器:对字节码进行效验,进行测试代码段,规则检查
解释器:将字节码文件翻译成所在平台认识的东西。
JavaSE结构:
JavaSE是java的基础,包括java基础语言、JDBC数据库操作、I/O、网络通讯、多线程等技术。
JDK是java应用程序的开发环境:
Javac:编译器,编译成字节码
Java:执行器,执行字节码
Javadoc:文档生成器,注释文档
Jar:打包工具,相关类打包成文件
Java.lang:系统基础类库;
Java.io : 输入输出类库
Java .ent: 网络相关类库
Java.util: 系统辅助类库
Java.sql: 数据库操作类库
Javax.servlet: jsp、servlet等使用到的类库。
JRE是java程序的运行环境,有jvm等。
Java基础语法
Java程序是一系列对象的集合,这些对象通过调用彼此的方法来协同工作。
对象:对象是类的一个实例(例如class Student,‘小明’就是studnet的一个对象)
类: 类是一个模板,它描述一类东西的行为和状态(属性)。
方法:就是类里面的行为。通过逻辑运算、数据修改等动作都是在方法中完成
实例变量:每个对象都有独特的实例变量,对象的状态由实例变量的值决定。
例如 :把地球分为动物、人类、植物。每一个是一个类。
我就是人类这个类的一个对象。
在人类这个大类中有 行为(呼吸、说话)和属性(耳朵、鼻子)
标识符:
Java所有组成部分都需要名字。类名、变量名以及方法名都成为标识符
所以标识符都应该是由(字母、美元符、下划线)(开头)以及数字组成
关键字不做标识符,有大小写敏感。
Java变量
关于变量其实是相对于类、方法而言的。方法中定义的变量为局部变量,类中定义的无static的为成员变量,有static修饰的为类变量。
局部变量(在方法或语句块中)
类变量(静态变量static)
成员变量(非静态变量)
Java数组:
数组是存储在堆上的对象。可以保存多个同类型变量。
Java枚举:
枚举限制变量只能是预先设定好的值。相当于常量(只能是限定中选择)
enum FreshJuiceSize{ SMALL, MEDIUM , LARGE }
juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
java继承:
一个类可以由其他类派生,如果你要创建一个类,而且已经存在一个类具体有你所需的属性或方法,那么你可以将新创建的类继承该类,获得该类的方法和属性。即重用已存在的类的方法或属性。被继承的类为超类(super class),派生类,子类(sub class)
接口:
对象间相互通信的协议,接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。
Java对象和类
Java作为面向对象语言,支持一下基本特点:
多态、继承、封装、抽象、类、对象、实例、方法、重载。
Java对象:
对象有自己的状态和行为。即属性和方法。一个类可以由多个对象。如员工表中有个员工信息,每一个员工就是这个员工类的对象。
Java类
创建java对象的模板。一个类包含以下特点
局部变量:在方法、构造方法或者语句块中地沟油的变量。随之结束而销毁
成员变量:定义在类中,方法体之外的变量。在创建对象的时候实例化,类中可用
类变量:类变量声明在类中,方法体之外,使用static修饰编译时实例化
成员变量和类变量:
成员变量随着对象的创建而存在,随着对象的回收而释放
类变量随着类的加载而存在,随着类的消失而消失
成员变量只能被对象调用
类变量可以被对象调用,还可以被类名调用
成员变量------实例变量
类变量-------静态变量
成员变量存储在堆内存的对象中,即对象特有数据
类变量数据存放在方法区(共享数据)的静态区
构造方法:
每个类都有构造方法,如不定义,则编译器提供默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法名和类名同名。
创建对象:
对象是根据类创建的,
声明:声明一个对象,包括对象名称和对象类型
实例化:使用关键字new创就一个对象(分配空间)
初始化:使用new创建对象时,调用构造方法初始化对象(赋值到空间)
Java基本数据类型
变量就是申请内存来存储值。当创建变量的时候,需要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间能用用来存储该类型数据。因此通过定义不同类型的变量可以在内存中存储整数,小数或字符。
Java有两大数据类型:
内置数据类型:
java提供了八种基本数据类型。六种数字类型(四种整数型、两种浮点型)一种字符类型,还有一种布尔类型。
byte:八位一字节,[-128,127],默认0 (2的7次方)
short:十六位双字节,[-32768,32767] , 默认0 (2的15次方)
int:三十二位四字节,[-2147483648,2147583647],默认 0 (2的31次方)
long:六十四位八字节,默认 0L (2的63次方)
float:32位4字节,单精度浮点 默认 0.0f
double:64位8字节,双精度浮点 默认0.0d
boolean:数据类型表示一位的信息。默认false
char:单一的16位Unicode字符[0,65535] \u0000 ---\uffff
引用数据类型
变量声明后,类型就不能改变
对象、数组都是引用数据类型
所有引用类型的默认值都是null
一个引用变量可以用来引用任何与之兼容的类型
Java常量
常量在程序运行时是不能被修改的,使用final修饰
自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转换为同一类型,然后进行运算。
byte---short---char---int---long---float---double
转换规则:
不能对double类型进行类型转换
不能把对象类型转换成不相关类型的对象转换
容量大的类型转换成容量小的类型必须强转转换。
转换过程可能导致溢出或精度丢失。
Java变量类型
静态变量属于类,该类不产生对象,通过类名可以调用静态变量。
实例变量属于该类的对象,需要创建该类对象,才能调用实例变量。
实例变量属于某个对象的属性,必须创建实例对象,实例变量才会被分配空间。
静态变量属于类,只要程序加载类的字节码,就会被分配空间,既可以使用。
Java修饰符
访问修饰符
default(默认):同胞可见,不使用任何修饰符。类、接口、变量、方法
private私有,类内可见。不能修饰类。 变量、方法
Protected受保护,同包类和子类,不能修饰类。变量、方法
public 公共 对所有类可见。 类、变量、接口 、方法
非访问修饰符
static:
静态变量,无论一个类实例化多少对象,它的静态办理只有一份拷贝。局部变量不能被声明为静态变量。
静态方法,不能使用类的非静态变量。
final:赋值后不能再被重新赋值,修饰类(不能被继承)、修饰方法(不能重写)
abstract:
抽象类,不能实例化对象,(包括抽象方法,非抽象方法)
抽象方法,是一种没有任何实现的方法,具体实现由子类提供。抽象方法不能被声明为final或static。抽象方法没有方法体
synchronized:
synchronized声明的方法,同一时间只能被一个线程访问。
Transient:序列化的对象包含被transient时,jvm跳过该特定的变量。
Java运算符
算术运算符:+、-、*、/、%、++、--
关系运算符:==、!=、>、<、>=、<=
位运算符:&、|、^、~、<<、>>、>>>(一为一,零为零,同为零,左乘右除)
逻辑运算符:&&、||、!(真为真,假为假,反转)
赋值运算符:=、+=、-=、/=、*=、%=、<<=、>>=、&=、^=、|=
其它运算符:三元运算(a?b:c)
Java循环
while循环
可用于选择退出界面。While 条件{ 体... }
while true{ if (a == ‘over’) {break;}}
do....while循环
do{ 体...}while(条件) 至少执行一次
for循环
双层for或多成for循环可用来列表遍历等。
增强for,即foreache类似于python中的for(int x :list){}
调用自身
void test(n){
test(n-1);
}
选择语句
if 条件语句
if(布尔表达式){ true体 }else{ false体 } 真假选择问题
If(){}else if(){ }else{ }
if(){ if(){ }} 嵌套if语句
switch case
判断一个变量与一系列中某个值是否相等
switch(变量){ case value1 : 体.. break; case value2: 体.. break; }
Java 类
Math类
N.equals(n) 判断对象是否与参数相等(是对象int Integer)
N.valueOf() 返回一个number对象知道的内置数据类型
N.parseInt() 将字符串解析为int类型
Math.ceil() 取地板,小整数
Math.floor() 取天花板,大整数
Math.rund() 四舍五入。
Character类
Character类在对象中包装一个基本类型char的值,用于对单个字符进行操作。
例如,要将一个char类型的参数传递给需要一个Character类型参数的方法时,那么编译器会自动将插入类型参数转换为character对象,这种特征称为装箱,反转之拆箱。
idLetter()是否是一个字母
isDigit()是否是一个数字字符
isWhiltespace()是否是一个空白字符
String类(不可修改)
Java中字符串属于对象,提供String类来创建和操作字符串
str1.concat(str2):连接两个字符串
str1.length() : 字符串长度
charAt(int index): 返回指定字符索引的char值(单个字符)
compareTo(object 0):把这个字符串和另一个对象比较
StringBuffer类(可被修改,不产生新的对象,线程安全(同步访问))
append(string s):追加字符序列
reverse():反转字符序列
capacity():返回当前容量
StringBuilder类(可被修改,不产生对象,线程不安全,速度快于stringbuffe)
Java 数组
Java 数组是用来存储固定大小的同类型元素。
double[ ] list ; 声明数组
listname =new type[size] ; 创建数组,把数组引用赋给list
datatype[ ] arrname = new datatype[ size] ; 数组的声明、创建
datatype[ ] arrname = { value ,value1.....} ; 声明、创建数组 赋值
二维数组也是同样的
先声明再创建(声明,就是定义要分配什么类型的,什么东西。。。。。创建就是在内存中申请分配存储 定义 的空间。)
Java 日期时间
Date类提供两个构造函数实例化date对象,
Date()使当前日期时间初始化对象
Date(long millisec)该参数是从1970年1月1日起的毫秒数
获取当前日起时间,并格式化。
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
System.out.println(ft.format(date));
使用printf格式化日期。
System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);
System.out.printf("年-月-日%tF%n",date);
Java休眠(sleep)
sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用、目的是不让当前线程独自霸占该该进程所获的CPU资源,以留一定时间给其它线程执行的机会。
Thread.sleep(5*60*10); //休眠3秒
Calendar类
获取日期数据的特定部分,如小时,日,分钟等。
cakebdar c1 = Calendar.getInstance() //创建当前系统日期对象
c1.set(2020,5 - 1,12)
Java 方法
方法是解决一类问题的步骤的有序组合,包含于类对象中。
方法重载,方法的名字相同,参数列表不同
命令行传参
即在命令行下编译,执行,并传入相应的参数给main方法
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
Javac testjava
Java test ni hao i am very good
构造方法
当一个对象被创建时候,构造方法用来初始化该对象。构造方法和类名相同,没有返回值,也没有void。所有类都有构造方法,java自动提供默认构造方法。
可变参数
即在方法参数指定类型的一个可变的参数,必须是方法的最后一个参数。
Pri(int t, double.....numbers){ }
Java 流(Stream)、文件(file)和io
一个流可以理解为一个数据序列。输入流表示从一个源文件读取数据,输出流表示像一个目标写入数据。
FileInputStream
用于文件读取数据。字节流输入
byte bWrite[] = { 11, 21, 3, 40, 5 };
OutputStream os = new FileOutputStream("test.txt");
for (int x = 0; x < bWrite.length; x++) {
os.write(bWrite[x]); // writes the bytes
}
os.close();
会有乱码,所以需要如下。
File f = new File("a.txt");
FileOutputStream fop = new FileOutputStream(f); // 构建FileOutputStream对象,文件不存在会自动新建 OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
java目录
mkdir()创建一个文件夹,成功返回true。
mkdirs()创建一个文件夹和它所有父文件夹
String dirname = "/tmp/user/java/bin";
File d = new File(dirname); // 现在创建目录
d.mkdirs();
Scanner类
通过Scanner类获取用户输入。
Scanner s = new Scanner(System.in);
判断是否还有输入
if (scan.hasNext()) {
String str1 = scan.next();
System.out.println("输入的数据为:" + str1);
}
next()与nextLine()的区别
next():
一定要读取到有效字符后才可以结束输入,对空白,自动去掉,但输入字符后空白分为分隔符或结束符。
nextLine():
以enter为接收,可以获取空白。