[关闭]
@smallcatx0 2018-04-18T01:13:45.000000Z 字数 16980 阅读 1184

一周学完Java基础

学习 java


同步于我博客,欢迎关注小魁的学习博客

(一)准备工作

0.下载jdk:官方下载

安装,添加环境变量...

1.工欲善其事必先利其器--我选择Sublime

  1. {
  2. "shell_cmd": "javaRun \"$file\"",
  3. "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
  4. "working_dir": "${file_path}",
  5. "selector": "source.java",
  6. // 中文乱码问题
  7. "encoding":"gbk",
  8. "variants":[
  9. // 编译并在CMD中运行
  10. {
  11. "name":"java CMD Run",
  12. "shell":true,
  13. "shell_cmd":"start cmd /c \"javaRun \"$file\" & pause\""
  14. }
  15. ]
  16. }

保存为JavaRun.sublime-build

mark

再写入:

  1. @ECHO OFF
  2. cd %~dp1
  3. ECHO Compiling %~nx1.......
  4. IF EXIST %~n1.class (
  5. DEL %~n1.class
  6. )
  7. javac %~nx1
  8. IF EXIST %~n1.class (
  9. ECHO -----------OUTPUT-----------
  10. java %~n1
  11. )

2.helloword 走一波

先选择java的编译系统,就是第一步修改(新建)的。

编译系统

Ctrl+B 运行一波

helloword

-----------------更新线------2017年12月29日 13:36:58-----------

PS:解决中文乱码以及编译报错的方法
jdk安装目录/bin/JavaRun.bat中编译命令改为:javac -encoding UTF-8 ...

bat

sublime中编译系统javaRun.sublime-build增加一行
"encoding":"gbk"

sublimeBuild

(二)Java基础

1.数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

名称 位数 描述 范围 默认值
boolean 1 一个二进制位 true/false flase
byte 8 有符号二进制补码整数 -128(-2^7)~ 127(2^7-1) 0
short 16 有符号二进制补码整数 -32768(-2^15)~ 32767(2^15 - 1) 0
int 32 有符号二进制补码整数 -2,147,483,648(-2^31)~2,147,483,647(2^31 - 1) 0
long 64 有符号以二进制补码整数 -9,223,372,036,854,775,808(-2^63)~ 9,223,372,036,854,775,807(2^63 -1) 0L
float 32 单精度浮点形 -3.4E308~3.4E308 0.0f
double 64 双精度浮点形 -1.7E308~1.7E308 0.0d
char 16 一个单一的 16 位 Unicode 字符 \u0000(即为0)~ \uffff(即为65,535)

注意:char: 与c语言不同,为两个字节(16位)
       是Unicode的编码,所以可以存放一个中文字符
    float: 32个二进制位:
        1位符号位
        23位位数位(小数点后)
        8位指数位(00000000 - 11111111)-127~127
        0代表0,255代表无穷大

低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double

  1. byte a = 3;
  2. byte b = 4;
  3. byte c = a + b;
  4. // 报错:可能会损失精度。
  5. // byte 与byte(或short、char)进行运算时候会提升精度为int。
  1. System.out.println("hello"+'a'+2);
  2. /**
  3. * -----------OUTPUT-----------
  4. * helloa2
  5. * 解释:任何数据类型,用 + 与字符串相连接都会产生字符串
  6. **/
  7. System.out.println("5+5="+5+5);
  8. /**
  9. * -----------OUTPUT-----------
  10. * 5+5=55
  11. * 解释:运算顺序是从左往右算。
  12. **/

2.运算符

  1. int a = 5,b = 5;
  2. System.out.println("(a++)= " + (a++));
  3. System.out.println(" a = " + a);
  4. System.out.println("(++b)= " + (++b));
  5. System.out.println(" b = " + b);
  6. /**
  7. * -----------OUTPUT-----------
  8. * (a++)= 5
  9. * a = 6
  10. * (++b)= 6
  11. * b = 6
  12. **/
  13. int x = 4;
  14. // y = 4 + 6 + 60;
  15. int y = (x++)+(++x)+(x*10);
  16. System.out.println(y);
  17. /**
  18. * -----------OUTPUT-----------
  19. * 70
  20. **/

&(按位与) ,|(按位或),!(非),^(异或),~(按位取反)。
&&(短路与), ||(短路或)【短路特性】

Ps: ^(异或运算符)特点:一个数对另一个数异或两次,得该数本身。

  1. // 不借助第三方变量,交换两个变量的值
  2. int a = 3,b=5;
  3. a = a ^ b;
  4. b = a ^ b;
  5. a = a ^ b;
  6. System.out.println("a = " + a + " b = "+b);
  7. /**
  8. * -----------OUTPUT-----------
  9. * a = 5 b = 3
  10. **/

<< : 左移 左边最高位丢弃,右边补0
>>: 右移 最高位是什么,左边就补什么。
>>>:无符号右移 无论最高位是什么,左边都补0.

  1. // 最有效率的计算7*8
  2. System.out.println(7<<3);

3.键盘输入

  1. import java.util.Scanner; //引入包
  2. class testScanner{
  3. public static void main(String[] args) {
  4. // 实例化一个对象
  5. Scanner sc = new Scanner(System.in);
  6. System.out.println("请输入一个数");
  7. // 调用方法
  8. int x = sc.nextInt();
  9. System.out.println(x);
  10. }
  11. }

4.流程控制(参见C语言跳过)

补:java 中的foreach

  1. for(int i : arr){
  2. ......
  3. }

(三)面向对象

1.类与对象

1.1 类变量:

1.2 类方法

一个类可以拥有多个方法。

  1. class functions {
  2. public static void main(String[] args) {
  3. // 用不同的参数调用add()方法
  4. System.out.println("add(3,8) =" + add(3,8));
  5. System.out.println("add(3,8,7) =" +add(3,8,7));
  6. System.out.println("add(3.1,8.5) =" + add(3.1,8.5));
  7. }
  8. public static int add(int a,int b){
  9. return a+b;
  10. }
  11. public static double add(double a,double b){
  12. return a+b;
  13. }
  14. public static int add(int a,int b,int c){
  15. return a+b+c;
  16. }
  17. }
  18. /*
  19. -----------OUTPUT-----------
  20. add(3,8) = 11
  21. add(3,8,7) = 18
  22. add(3.1,8.5) = 11.6
  23. */

1.3 创建对象

对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:

  1. public class classTest{
  2. public static void main(String[] args) {
  3. // 实例化一个对象 传入构造方法所需的参数
  4. Dog cat = new Dog("haha");
  5. cat.barking();
  6. cat.setAge(5);
  7. System.out.println("getAge : "+cat.getAge());
  8. cat.aboutMe();
  9. }
  10. }
  11. class Dog{
  12. String name;
  13. int age;
  14. // 构造方法:在对象实例化的时候自动运行
  15. public Dog(String name){
  16. this.name = name;
  17. }
  18. public void barking(){
  19. System.out.println("汪汪");
  20. }
  21. public void setAge(int n){
  22. age = n;
  23. }
  24. public int getAge(){
  25. return age;
  26. }
  27. public void aboutMe(){
  28. System.out.println("name :"+name+"| age: "+age);
  29. }
  30. }

1.4 java中的主方法

java语言最大的特点就在于主方法。

1.5 代码块

写在{}内的代码称为一个代码块
Java代码块分为4种:普通代码块、构造块、静态块、同步代码块(等待多线程)。

优先级:
  【构造方法】<【构造块】<【静态块】

  1. public class blockTest {
  2. public static void main(String[] args) {
  3. bTest t1 = new bTest("t1");
  4. bTest t2 = new bTest("t2");
  5. }
  6. }
  7. class bTest {
  8. public String name;
  9. public bTest(String name){
  10. this.name = name;
  11. System.out.println(this.name+" 构造方法运行");
  12. }
  13. // 构造块
  14. {
  15. System.out.println(this.name+" 构造块运行");
  16. }
  17. // 静态块
  18. static {
  19. System.out.println("静态块运行");
  20. }
  21. }

运行结果:

-----------OUTPUT-----------
静态块运行
null 构造块运行
t1 构造方法运行
null 构造块运行
t2 构造方法运行

2.封装

两层含义:

2.1 权限修饰符(访问修饰符)

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Javav支持 4 种不同的访问权限。

权限表:

修饰符 当前类 同一包 子孙类 其他包
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N

2.2 权限继承

2.3 static关键字

static 修饰的属性、方法不用实例化就可使用

3.继承

严格来讲就是扩充一个类已有的功能。

格式:class 子类 extents父类{}

3.1 继承的限制

3.2 继承的覆写

子类定义属性、方法时,出现与父类重名的情况时,就会出现属性、方法的覆写。

重载 覆写
Overloading Override
发生在一个类里 发生在继承关系中
方法名称相同,参数类型及个数不同 方法名称相同、参数类型、个数相同、方法返回值相同
没有权限限制 背覆写的方法不能拥有比父类更严格的访问控制权限
this super
调用本类构造、本类方法、本类属性 子类调用父类构造、父类方法、父类属性
先查找本类中是否存在指定的调用结构,如果有直接调用,如果没有则调用父类定义 不查找子类,直接调用父类
表示本类的当前对象 -

**【补充】this() super()只能写在构造方法的第一句,且只能存在一个。 **

3.3 继承的终结--final关键字

4.多态性

方向 描述 格式
向上转型 子类对象变为父类对象 父类 父类对象 = 子类实例;// 自动转换
想下转型 父类对象变为子类对象 子类 子类对象 = (子类)父类实例 //强制转换

【补充】java提供一个关键字 instanceof

  1. 对象 instaceof // 返回boolean

多态性的意义是为了实现范型

4.1 抽象类

抽象方法:没有方法体的方法,必须由abstract关键字修饰

抽象类是指在普通类中增加抽象方法,拥有抽象方法的类一定属于抽象类抽象类必须使用abstract修饰(ps:抽象类中可以全都是具体方法)

4.2 接口

如果一个类只由抽象方法全局常量组成,往往将其定义成一个接口
在Java中使用interface关键字来定义接口
Java中接口主要用来解决单继承的问题

4.3 抽象类与接口的区别

区别 抽象类 接口
关键字 abstract class interface
组成 构造方法、普通方法、抽象方法、
static方法、常量、变量
抽象方法、全局常量
子类使用 class 子类 extends 抽象类 class 子类 implements 接口1,接口2...
关系 抽象类可以实现多个接口 接口不能继承抽象类,却可以继承多个父接口
权限 可以使用各种权限修饰符 只能使用public权限
限制 单继承局限 没有单继承局限
子类 抽象类和接口都必须有子类 ,子类必须要覆写全部的抽象方法 同左
实例化对象 依靠子类对象向上转型进行实例化 同左

4.4 多态的实现--Object类

Object 类是所有类的父类。
任何一个类向上转型都能得到一个Object类
利用Object类可以接受全部类的对象(向上转型)
Object 类中提供了一个无参构造函数,所以如果一个类没有写构造函数,他默认会继承Object的无参构造。
Object类中提供的方法

以上方法,在任意对象都存在

5.总结实例 java实现的链表(范式)

(四)包及访问控制

java中包的主要用于将不同的文件进行分割,解决同名文件冲突问题,而设置的不同目录

(五)异常

异常对象结构图

  1. try{
  2. // 可能出现异常的语句
  3. }[catch (异常类型 对象){
  4. // 异常处理
  5. catch(异常类型 对象){
  6. // 异常处理
  7. ...]
  8. [fianlly {
  9. // 不论是否出现异常,都执行统一代码
  10. }

由于Java中的对象可以自动向上转型,所以Exception可以接收所有异常
处理多个异常的时候,捕获范围小的异常要放在前面

(六)Java常见类库

1.StringBuffer类

Java中的String类型表示的字符串一旦声明就不可更改,String字符串对象每一次改变,都是对象的指向地址发生了改变,之前的引用就变为了垃圾,所以String对象不适合用于会频繁修改的字符串。
StringBuffer则解决了这个问题。其定义的字符串内容可以被修改(即在原地址上进行增、删、改)

2.Runtime 类

利用Runtime类可以启动新的线程或者进行相关环境操作(如取得内存空间或者释放垃圾)
Runtime使用了单列模式通过Runtime.getRuntime()获得对象的实例

3.System 类

提供一些系统的支持操作

System 类的gc()方法是间接调用Runtime的gc()方法,既System.gc()Runtime.getRuntime().gc()完全等价

4.对象的克隆

在Object类中存在一个方法clone用于对象的克隆
protected Object clone() throws CloneNotSupportException;
此方法是用protected修饰的,所以子类必须覆写此方法才能被克隆。
此方法抛出一个异常CloneNotSupportException(不支持的克隆对象),是因为Java中不是所有的类都支持克隆操作,Java提供了一个标识接口Cloneable(接口中没有任何方法)来区分可以被克隆的类。

5.数学操作类

java.lang.Math 类 提供了基础数学计算
java.math 包 专门负责大数字的操作
编号 方法 解释
1 static double abs(double a) 此方法返回一个double值的绝对值.
5 static double acos(double a) 此方法返回一个值的反余弦值,返回的角度范围从0.0到pi.
6 static double asin(double a) 此方法返回一个值的反正弦,返回的角度范围在-pi/2到pi/2.
7 static double atan(double a) 此方法返回一个值的反正切值,返回的角度范围在-pi/2到pi/2.
9 static double cbrt(double a) 此方法返回一个double值的立方根.
10 static double ceil(double a) 此方法返回最小的(最接近负无穷大)double值,大于或等于参数,并等于一个整数.
11 static double copySign(double magnitude, double sign) 此方法返回的第一个浮点参数与第二个浮点参数的符号.
12 static float copySign(float magnitude, float sign) 此方法返回的第一个浮点参数与第二个浮点参数的符号.
13 static double cos(double a) 此方法返回一个角的三角余弦.
14 static double cosh(double x) 此方法返回一个double值的双曲余弦.
17 static double floor(double a) 此方法返回最大的(最接近正无穷大)double值小于或相等于参数,并相等于一个整数.
22 static double log(double a) 此方法返回一个double值的自然对数(以e为底).
23 static double log10(double a) 此方法返回一个double值以10为底.
24 static double log1p(double x) 此方法返回自然对数的总和的参数.
25 static double max(double a, double b) 此方法返回两个double值较大的那一个.
29 static double min(double a, double b) 此方法返回的两个较小的double值.
35 static double nextUp(double d) 在正无穷大的方向,此方法返回至d相邻的浮点值.
36 static float nextUp(float f) 此方法返回到f相邻的浮点值在正无穷方向上.
38 static double random() 该方法返回一个无符号的double值,大于或等于0.0且小于1.0.
39 static double rint(double a) 此方法返回的double值,值的参数是最接近的,相等于一个整数.
40 static long round(double a) 此方法返回的参数最接近的long.
41 static int round(float a) 此方法返回的参数最接近的整数.
42 static double scalb(double d, int scaleFactor) 此方法返回d × 2scaleFactor 四舍五入,如果由一个单一的正确舍入的浮点乘法的double值组的成员.
43 static float scalb(float f, int scaleFactor) 此方法返回f × 2scaleFactor 四舍五入,如果由一个单一的正确舍入的浮点乘法,浮点值集合的成员.
44 static double signum(double d) 此方法返回signum函数的参数,如果参数是零返回0,如果参数大于零返回1.0,如果参数小于零返回-1.0.
45 static float signum(float f) 此方法返回signum函数的参数,如果参数是零返回0,如果参数大于零返回1.0f,如果参数小于零返回-1.0f.
46 static double sin(double a) 此方法返回一个double值的双曲正弦.
47 static double sinh(double x) 此方法返回一个double值的双曲正弦.
48 static double sqrt(double a) 此方法返回正确舍入的一个double值的正平方根.
49 static double tan(double a) 此方法返回一个角的三角函数正切值
50 static double tanh(double x) 此方法返回一个double值的双曲正切.
51 static double toDegrees(double angrad) 这种方法大致相等的角度,以度为单位的角度转换成弧度测量.
52 static double toRadians(double angdeg) 此方法转换一个角度,以度为单位大致相等的角弧度测量.

6.Random 类

java.util.Random 类是一个专门产生随机数的操作类

7.日期处理类

7.1 java.util.Data 日期处理

7.2 java.text.SimpleDataFormat 日期格式化

7.3 java.util.Calendar 精确时间操作

Calendar 是一个抽象类通过getInstance()方法获得对象实例(单列模式)

8.比较器

java提供了3个数组操作类

8.1 Arrays类(java.util.Arrays)

8.2 比较器 Comparable

普通数组可以通过直接调用Arrays.sort(int[] a)排序,但是对象数组中每个位置存的都是对象的地址不能直接依据大小排序。但是Arrays中任然重载了一个Arrays.sort(Object[] a),此方法可以直接针对对象数组进行排序
使用前提:对象所在的类一定要实现Comparable接口 否则会报ClassCastException异常

  1. public interface Comparable<T>{
  2. public int compareTo(T o);
  3. }

覆写compareTo()方法时需要返回三种结果:1(>0),-1(<0),0(=0)

8.3 匿名比较器 -- Lambda表达式

如果对象数组没有实现Comparable接口,可以使用lambda表达式来临时定义比较方法

  1. public static void main(String[] args) {
  2. book b1[] = new book[] {
  3. new book("java入门经典",79.45),
  4. new book("python简单教程",59.00),
  5. new book("sql开发天书",63.45),
  6. new book("node.js实战",48.50)
  7. };
  8. // lambda表达式
  9. java.util.Arrays.sort(b1,(x,y)->{
  10. if (x.p > y.p) {
  11. return 1;
  12. }else if (x.p < y.p) {
  13. return -1;
  14. }else{
  15. return 0;
  16. }
  17. });
  18. // 输出
  19. for (book one :b1 ) {
  20. System.out.print(one);
  21. }

-----------OUTPUT-----------
书名: node.js实战价格: 48.5
书名: python简单教程价格: 59.0
书名: sql开发天书价格: 63.45
书名: java入门经典价格: 79.45

9.基本数据类型的转换

9.1 int ---> String

  1. int a = 6534;
  2. // 1.加个空串
  3. String s1 = a + "";
  4. // 2.用String.valueOf()方法
  5. String s2 = String.valueOf(a);
  6. // 3.用Integer对象的toString()方法
  7. Integer i1 = new Integer(a);
  8. String s3 = i1.toString();
  9. // 4.用Integer的静态方法toString(int i)
  10. String s4 = Integer.toString(a);

9.2 String ---> int

  1. String s = "4327";
  2. int i;
  3. // 1.用Integer构造函数将String转换成Integer
  4. // 再用Integer对象的intValue()方法转换成int
  5. Integer i2 = new Integer(s);
  6. i = i2.intValue();
  7. // 2.用Integer的静态方法parseInt(String s)
  8. i = Integer.parseInt(s);

9.3 String ---> 各种类型

  1. // 8种基本数据类型包装类中,有7种都有parseXxx()的方法,
  2. // 可以将7种字符串表现形式转换为基本数据类型(其中 Character没有)
  3. String s2 = "3.1415";
  4. float x = Float.parseFloat(s2);
  5. double z = Double.parseDouble(s2);

10.正则表达式

10.1 正则标记

符号 意义
. 匹配任意一个字符
\d 数字,等价于[0-9]
\D 非数字 等价于[^0-9]
\s 任意空白字符
\S 任意非空白字符
\w 任意字母数字和"_" 等价于[a-zA-Z_0-9]
\W 上面取反 等价于[^a-zA-Z_0-9]
? 1个或0个
+ 1个或多个
* 0个1个或多个
{n} 出现n次
{n,} 出现n次及以上
{n,m} 出现n~m次

10.2 String 类对正则的支持

方法名 描述
boolean matches(String regex) 正则验证,字符串是否符合正则内容
String replaceAll(String regex ,String repl) 将满足正则的内容全部替换为repl串
String replaceFirst(String regex ,String repl) 将满足正则的内容首个替换为repl串
String[] split(String regex) 按照正则标记切分全部字符串
String[] split(String regex,int limit) 按照正则标记切分部分字符串

10.3 java.util.regex 包

此包下有Pattern类和Matcher类具体查API

10.4 正则练习

  1. /**
  2. * eg1: 快快乐乐,BBAA
  3. * eg2: baba,高兴高兴
  4. */
  5. // \\1代表第一组,\\2代表第二组
  6. String r = "(.)\\1(.)\\2"; // 匹配 AABB 形
  7. String r2 = "(..)\\1"; // ABAB 形
  8. System.out.println("快快乐乐".matches(r));
  9. System.out.println("AABB".matches(r));
  10. System.out.println("高兴高兴".matches(r2));
  11. System.out.println("baba".matches(r2));
  12. / */

-----------OUTPUT-----------
true
true
true
true

  1. /**
  2. * eg:我我我。。。要。。。要。。学。。。学学。。编编。。编编编。。。程。
  3. * out: 我要学编程。
  4. */
  5. String s2 ="我我我。。。要。。。要。。要。。。。学。。。学学。。编编。。编编编。。。程。";
  6. String r4 = "(.)\\1+";
  7. s2 = s2.replaceAll("。","");
  8. String out = s2.replaceAll(r4,"$1");
  9. System.out.println(out);

==================================END=============================

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注