@smallcatx0
2018-04-18T01:13:45.000000Z
字数 16980
阅读 1184
学习
java
同步于我博客,欢迎关注小魁的学习博客
安装,添加环境变量...
配置sublime的Java编译系统
工具->编译系统->新建编译系统
写入
{
"shell_cmd": "javaRun \"$file\"",
"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
"working_dir": "${file_path}",
"selector": "source.java",
// 中文乱码问题
"encoding":"gbk",
"variants":[
// 编译并在CMD中运行
{
"name":"java CMD Run",
"shell":true,
"shell_cmd":"start cmd /c \"javaRun \"$file\" & pause\""
}
]
}
保存为JavaRun.sublime-build
JavaRun.bat
的批处理再写入:
@ECHO OFF
cd %~dp1
ECHO Compiling %~nx1.......
IF EXIST %~n1.class (
DEL %~n1.class
)
javac %~nx1
IF EXIST %~n1.class (
ECHO -----------OUTPUT-----------
java %~n1
)
先选择java的编译系统,就是第一步修改(新建)的。
Ctrl+B 运行一波
-----------------更新线------2017年12月29日 13:36:58-----------
PS:解决中文乱码以及编译报错的方法
jdk安装目录/bin/JavaRun.bat
中编译命令改为:javac -encoding UTF-8 ...
sublime中编译系统javaRun.sublime-build
增加一行
"encoding":"gbk"
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
byte a = 3;
byte b = 4;
byte c = a + b;
// 报错:可能会损失精度。
// byte 与byte(或short、char)进行运算时候会提升精度为int。
System.out.println("hello"+'a'+2);
/**
* -----------OUTPUT-----------
* helloa2
* 解释:任何数据类型,用 + 与字符串相连接都会产生字符串
**/
System.out.println("5+5="+5+5);
/**
* -----------OUTPUT-----------
* 5+5=55
* 解释:运算顺序是从左往右算。
**/
int a = 5,b = 5;
System.out.println("(a++)= " + (a++));
System.out.println(" a = " + a);
System.out.println("(++b)= " + (++b));
System.out.println(" b = " + b);
/**
* -----------OUTPUT-----------
* (a++)= 5
* a = 6
* (++b)= 6
* b = 6
**/
int x = 4;
// y = 4 + 6 + 60;
int y = (x++)+(++x)+(x*10);
System.out.println(y);
/**
* -----------OUTPUT-----------
* 70
**/
&(按位与) ,|(按位或),!(非),^(异或),~(按位取反)。
&&(短路与), ||(短路或)【短路特性】
Ps: ^(异或运算符)特点:一个数对另一个数异或两次,得该数本身。
// 不借助第三方变量,交换两个变量的值
int a = 3,b=5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a = " + a + " b = "+b);
/**
* -----------OUTPUT-----------
* a = 5 b = 3
**/
<< : 左移 左边最高位丢弃,右边补0
>>: 右移 最高位是什么,左边就补什么。
>>>:无符号右移 无论最高位是什么,左边都补0.
// 最有效率的计算7*8
System.out.println(7<<3);
import java.util.Scanner; //引入包
class testScanner{
public static void main(String[] args) {
// 实例化一个对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数");
// 调用方法
int x = sc.nextInt();
System.out.println(x);
}
}
补:java 中的foreach
for(int i : arr){
......
}
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
局部变量:
在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:
成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:
类变量也声明在类中,方法体之外,但必须声明为static类型。
一个类可以拥有多个方法。
构造方法
每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
this 关键字
this.方法();
this();
方法的重载
方法名称相同,参数类型或者个数不同,调用的时候会按照传递的参数和类型和个数选择不同的方法体。
class functions {
public static void main(String[] args) {
// 用不同的参数调用add()方法
System.out.println("add(3,8) =" + add(3,8));
System.out.println("add(3,8,7) =" +add(3,8,7));
System.out.println("add(3.1,8.5) =" + add(3.1,8.5));
}
public static int add(int a,int b){
return a+b;
}
public static double add(double a,double b){
return a+b;
}
public static int add(int a,int b,int c){
return a+b+c;
}
}
/*
-----------OUTPUT-----------
add(3,8) = 11
add(3,8,7) = 18
add(3.1,8.5) = 11.6
*/
对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:
public class classTest{
public static void main(String[] args) {
// 实例化一个对象 传入构造方法所需的参数
Dog cat = new Dog("haha");
cat.barking();
cat.setAge(5);
System.out.println("getAge : "+cat.getAge());
cat.aboutMe();
}
}
class Dog{
String name;
int age;
// 构造方法:在对象实例化的时候自动运行
public Dog(String name){
this.name = name;
}
public void barking(){
System.out.println("汪汪");
}
public void setAge(int n){
age = n;
}
public int getAge(){
return age;
}
public void aboutMe(){
System.out.println("name :"+name+"| age: "+age);
}
}
java语言最大的特点就在于主方法。
写在{}
内的代码称为一个代码块
Java代码块分为4种:普通代码块、构造块、静态块、同步代码块(等待多线程)。
优先级:
【构造方法】<【构造块】<【静态块】
public class blockTest {
public static void main(String[] args) {
bTest t1 = new bTest("t1");
bTest t2 = new bTest("t2");
}
}
class bTest {
public String name;
public bTest(String name){
this.name = name;
System.out.println(this.name+" 构造方法运行");
}
// 构造块
{
System.out.println(this.name+" 构造块运行");
}
// 静态块
static {
System.out.println("静态块运行");
}
}
运行结果:
-----------OUTPUT-----------
静态块运行
null 构造块运行
t1 构造方法运行
null 构造块运行
t2 构造方法运行
两层含义:
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Javav支持 4 种不同的访问权限。
default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
权限表:
修饰符 | 当前类 | 同一包 | 子孙类 | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
static 修饰的属性、方法不用实例化就可使用
严格来讲就是扩充一个类已有的功能。
格式:class 子类 extents父类{}
在子类对象构造前一定会默认调用父类的构造,以保证父类先实例化子类后实例化;
super();
指父类的构造函数
当父类中有无参数的构造方法时,子类的构造函数首先会默认执行super();
,此时子类构造方法中写super();
不写都一样。而父类中无有参构造方法则必须写上才会执行。
子类定义属性、方法时,出现与父类重名的情况时,就会出现属性、方法的覆写。
重载 | 覆写 |
---|---|
Overloading | Override |
发生在一个类里 | 发生在继承关系中 |
方法名称相同,参数类型及个数不同 | 方法名称相同、参数类型、个数相同、方法返回值相同 |
没有权限限制 | 背覆写的方法不能拥有比父类更严格的访问控制权限 |
this | super |
---|---|
调用本类构造、本类方法、本类属性 | 子类调用父类构造、父类方法、父类属性 |
先查找本类中是否存在指定的调用结构,如果有直接调用,如果没有则调用父类定义 | 不查找子类,直接调用父类 |
表示本类的当前对象 | - |
**【补充】this()
super()
只能写在构造方法的第一句,且只能存在一个。 **
方向 | 描述 | 格式 |
---|---|---|
向上转型 | 子类对象变为父类对象 | 父类 父类对象 = 子类实例;// 自动转换 |
想下转型 | 父类对象变为子类对象 | 子类 子类对象 = (子类)父类实例 //强制转换 |
【补充】java提供一个关键字 instanceof
对象 instaceof 类 // 返回boolean
多态性的意义是为了实现范型
抽象方法:没有方法体的方法,必须由abstract关键字修饰
抽象类是指在普通类中增加抽象方法,拥有抽象方法的类一定属于抽象类抽象类必须使用abstract修饰(ps:抽象类中可以全都是具体方法)
如果一个类只由抽象方法和全局常量组成,往往将其定义成一个接口
在Java中使用interface关键字来定义接口
Java中接口主要用来解决单继承的问题
区别 | 抽象类 | 接口 |
---|---|---|
关键字 | abstract class | interface |
组成 | 构造方法、普通方法、抽象方法、 static方法、常量、变量 |
抽象方法、全局常量 |
子类使用 | class 子类 extends 抽象类 | class 子类 implements 接口1,接口2... |
关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,却可以继承多个父接口 |
权限 | 可以使用各种权限修饰符 | 只能使用public权限 |
限制 | 单继承局限 | 没有单继承局限 |
子类 | 抽象类和接口都必须有子类 ,子类必须要覆写全部的抽象方法 | 同左 |
实例化对象 | 依靠子类对象向上转型进行实例化 | 同左 |
Object 类是所有类的父类。
任何一个类向上转型都能得到一个Object类
利用Object类可以接受全部类的对象(向上转型)
Object 类中提供了一个无参构造函数,所以如果一个类没有写构造函数,他默认会继承Object的无参构造。
Object类中提供的方法
以上方法,在任意对象都存在
java中包的主要用于将不同的文件进行分割,解决同名文件冲突问题,而设置的不同目录
package 包名;//(多级包用.分割)
包的导入
用关键字 import 导入;
必须写在类定义之前,package语句之后。
权限控制--- 权限表
Error与Exception的区别
异常处理格式:
try{
// 可能出现异常的语句
}[catch (异常类型 对象){
// 异常处理
}catch(异常类型 对象){
// 异常处理
}
...]
[fianlly {
// 不论是否出现异常,都执行统一代码
}
由于Java中的对象可以自动向上转型,所以Exception可以接收所有异常
处理多个异常的时候,捕获范围小的异常要放在前面
throws与throw 关键字
RuntimeException 类
编译的时候不会强制要求处理异常,如果没有处理又发生了异常,将交给jvm处理。
RuntimeException类及其子类异常可以通过编译
assert断言
格式: assert 逻辑运算 : 提示字符串 ;
程序运行到assert的时候,若逻辑运算符为假。则程序停止并抛出java.lang.AssertError 异常
断言不是自动启动的需要用户用控制,在运行时增加-ea参数
自定义异常
自定义异常需要继承Exception(强制异常处理)或RuntimeException(选择性异常处理)
Java中的String类型表示的字符串一旦声明就不可更改,String字符串对象每一次改变,都是对象的指向地址发生了改变,之前的引用就变为了垃圾,所以String对象不适合用于会频繁修改的字符串。
StringBuffer则解决了这个问题。其定义的字符串内容可以被修改(即在原地址上进行增、删、改)
String与StringBuffer的相互转换
StringBuffer buf = new StringBuffer("www.heykui.cn");
常用方法
构造方法:空参构造
有参构造:StringBuffer buf = new StringBuffer("www.heykui.cn");
append(String s)
将指定的字符串追加到此字符序列
利用Runtime类可以启动新的线程或者进行相关环境操作(如取得内存空间或者释放垃圾)
Runtime使用了单列模式通过Runtime.getRuntime()
获得对象的实例
提供一些系统的支持操作
System 类的gc()方法是间接调用Runtime的gc()方法,既System.gc()
与Runtime.getRuntime().gc()
完全等价
在Object类中存在一个方法clone用于对象的克隆
protected Object clone() throws CloneNotSupportException;
此方法是用protected修饰的,所以子类必须覆写此方法才能被克隆。
此方法抛出一个异常CloneNotSupportException
(不支持的克隆对象),是因为Java中不是所有的类都支持克隆操作,Java提供了一个标识接口Cloneable
(接口中没有任何方法)来区分可以被克隆的类。
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) | 此方法转换一个角度,以度为单位大致相等的角弧度测量. |
java.util.Random 类是一个专门产生随机数的操作类
Calendar 是一个抽象类通过getInstance()方法获得对象实例(单列模式)
java提供了3个数组操作类
普通数组可以通过直接调用Arrays.sort(int[] a)排序,但是对象数组中每个位置存的都是对象的地址不能直接依据大小排序。但是Arrays中任然重载了一个Arrays.sort(Object[] a),此方法可以直接针对对象数组进行排序
使用前提:对象所在的类一定要实现Comparable接口 否则会报ClassCastException异常
public interface Comparable<T>{
public int compareTo(T o);
}
覆写compareTo()方法时需要返回三种结果:1(>0),-1(<0),0(=0)
如果对象数组没有实现Comparable接口,可以使用lambda表达式来临时定义比较方法
public static void main(String[] args) {
book b1[] = new book[] {
new book("java入门经典",79.45),
new book("python简单教程",59.00),
new book("sql开发天书",63.45),
new book("node.js实战",48.50)
};
// lambda表达式
java.util.Arrays.sort(b1,(x,y)->{
if (x.p > y.p) {
return 1;
}else if (x.p < y.p) {
return -1;
}else{
return 0;
}
});
// 输出
for (book one :b1 ) {
System.out.print(one);
}
-----------OUTPUT-----------
书名: node.js实战价格: 48.5
书名: python简单教程价格: 59.0
书名: sql开发天书价格: 63.45
书名: java入门经典价格: 79.45
int a = 6534;
// 1.加个空串
String s1 = a + "";
// 2.用String.valueOf()方法
String s2 = String.valueOf(a);
// 3.用Integer对象的toString()方法
Integer i1 = new Integer(a);
String s3 = i1.toString();
// 4.用Integer的静态方法toString(int i)
String s4 = Integer.toString(a);
String s = "4327";
int i;
// 1.用Integer构造函数将String转换成Integer
// 再用Integer对象的intValue()方法转换成int
Integer i2 = new Integer(s);
i = i2.intValue();
// 2.用Integer的静态方法parseInt(String s)
i = Integer.parseInt(s);
// 8种基本数据类型包装类中,有7种都有parseXxx()的方法,
// 可以将7种字符串表现形式转换为基本数据类型(其中 Character没有)
String s2 = "3.1415";
float x = Float.parseFloat(s2);
double z = Double.parseDouble(s2);
符号 | 意义 |
---|---|
. | 匹配任意一个字符 |
\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次 |
方法名 | 描述 |
---|---|
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) | 按照正则标记切分部分字符串 |
此包下有Pattern类和Matcher类具体查API
/**
* eg1: 快快乐乐,BBAA
* eg2: baba,高兴高兴
*/
// \\1代表第一组,\\2代表第二组
String r = "(.)\\1(.)\\2"; // 匹配 AABB 形
String r2 = "(..)\\1"; // ABAB 形
System.out.println("快快乐乐".matches(r));
System.out.println("AABB".matches(r));
System.out.println("高兴高兴".matches(r2));
System.out.println("baba".matches(r2));
/ */
-----------OUTPUT-----------
true
true
true
true
/**
* eg:我我我。。。要。。。要。。学。。。学学。。编编。。编编编。。。程。
* out: 我要学编程。
*/
String s2 ="我我我。。。要。。。要。。要。。。。学。。。学学。。编编。。编编编。。。程。";
String r4 = "(.)\\1+";
s2 = s2.replaceAll("。","");
String out = s2.replaceAll(r4,"$1");
System.out.println(out);
==================================END=============================