Java语言
目录
(4)this、super、final、abstract、instanceof 8
正文
一、java是什么
java是一种跨平台的编程语言,也是javaSE、javaEE、Android的基础,但是过渡依赖虚拟机的话可能会带来很大困扰;对程序员来说这是一门极友好的语言。
二、环境配置
1.windows操作系统
下载较新的jdk并安装,在计算机->属性->高级系统设置->环境变量中填写属性,比如:
JAVA_HOME | C:\Program Files\Java\jdk1.8.0_131 |
classpath | .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar |
Path | %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin |
三、命令行编译运行
虽然现在java代码几乎都用集成的IDE开发工具了,但是有时候IDE也不能解决全部问题(比如远程过程调用,需要手动的在命令行编译运行一些java代码);当.java文件比较庞大时,有必要像文件夹一样用包来管理它们,功能比较相似的.java文件放在同一个包中(包下面不会再有包);下面介绍的是.java带包名的情况,不带包名要简单得多,用javac和java命令即可。
1. 切换到.java文件的目录下
2. 命令行输入命令javac XX.java得到.class文件
3. 在当前目录下按照包名依次建立文件夹,将上面的.class文件剪切到对应的文件夹下
4. 在.java目录下命令行中输入命令java XX的包名.XX,即可运行
四、基本数据类型
const在java中是不再使用的保留字,如果定义常量用static final代替;byte占1个字节有符号位,short有符号位、char占2个字节,int有符号位、float占4个字节保留8位有效数字,long、double占8个字节保留16位有效数字
1.常见的基本数据类型
逻辑 | boolean包括true、false |
整数 | int、long、short、byte |
字符 | char |
浮点数 | float、double |
空 | null |
(1)char类型的常用方法
Character.isLowerCase(‘字符’) | 判断该字符是否是小写、类似的函数还有Character.isUpperCase(‘字符’) |
Character.toLowerCase(‘字符’) | 将该字符转换成小写、类似的函数还有Character.toUpperCase(‘字符’) |
(1)unicode编码和char数据的相互转换
unicode即万国码、是一套记录了很多国家文字的字符集;可以使用搜狗输入法的符号大全输入一些奇葩的字符、通过这个办法获取到它的unicode编码,反过来通过unicode编码也可以获取到一些奇葩的字符;微软word的快捷功能alt+x
通过字符获取unicode编码 | “(int)字符”可以得到字符在unicode表中的位置、范围是0-65535,再将这个数据转换为四位数字的16进制编码 |
通过unicode编码获取字符 | “\u四位数字的编码” |
2.数组
可以把类型相同的数据可以当作一个数组;数组、对象、接口都属于引用型变量,地址是System.out.println(""+数组名);、System.out.println(数组名);将直接输出数组的内容,通过.length可以访问数组的长度;数组名相互赋值、即相互引用,操作的是同一个对象
(1)数组的声明和定义
//声明一个数组
int[] a,b;
float[][] c,d;
//使用数组前必须先分配空间,声明数组、分配空间也可以同时完成;Java中可以用int类型变量指定数组空间的大小
a=new int[4];
b=new float[3][4];
int[] c=new int[5];
int d=55;
int[] e=new int[d];
//多个不同长度的数组也可以构成一个多维数组
Int[][] a=new int[3][];
a[0]=new int[6];
a[1]=new int[12];
a[2]=new int[8];
(2)数组的初始化
int[] a={0,1,2,3,4};
//或者
int[] a=new int[5];
a[0]=0;
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=4;
//或者
int[] a=new int[]{0,1,2,3,4};
(3)数组的常用方法
Arrays.sort(数组名); | 将数组从小到大排列 |
Arrays.toString(数组名); | 输出排序后的结果 |
Arrays.binarySearch(数组名,要查询的数据); | 返回数据在数组中的下标,返回负数表示数组中没有这个数据 |
3.类型转换
(1)数值类型间的转换
byte short char int long float double,由低到到会自动转换,否则使用“(类型)要转换的变量”;float类型的正确赋值方式是float a=3.14f、3.14默认是double类型的。
五、语句和表达式
1.运算符和表达式
和CC++几乎相同,下表描述的是运算符的优先级:
优先级 | 运算符 | 结合性 |
1 | [] () . , ; | 右到左 |
2 | intanceof ++ -- ! | 左到右 |
3 | * / % | 左到右 |
4 | + - | 左到右 |
5 | >> << >>> | 左到右 |
6 | < <= > >= | 左到右 |
7 | == != | 左到右 |
8 | & | 左到右 |
9 | ^ | 左到右 |
10 | | | 左到右 |
11 | && | 左到右 |
12 | || | 左到右 |
13 | ?: | 左到右 |
14 | = | 右到左 |
2.条件语句
不太容易理解的是switch…case语句,这个逻辑是:先计算表达式的值,如果这个值和case后面的某个常量相等,就执行后面的若干个语句、直到遇到break为止
switch (表达式) {
case 常量0:
语句块0
break;
case 常量1:
语句块1
break;
...
case 常量2:
语句块2
break;
default:
break;
}
3.循环语句
break将结束一个循环体、continue表示继续循环但是跳到下一次
//加强型for循环
char[] a= {'土','地','很','肥','沃'};
for(char tmp:a) {
System.out.println(tmp);
}
六、类
成员变量默认是友好的,同一个包下面的类省略包名也可以相互访问;如果一个内存空间没有被引用,那它就会被系统当作垃圾回收掉,相互赋值会有这种情况发生,强制让虚拟机执行垃圾回收的方法是System.gc();
1.自定义类
函数体中操作的是函数参数的拷贝,操作不会改变传入参数的变量、引用类型的参数除外;成员变量中有static的是类变量、否则是实例变量,类变量可以在多个类中共享数据(一开始就分配了空间,而且变量的生命周期发生了变化),类似的有实例方法和类方法,实例方法必须通过对象调用、类方法可以直接通过类名调用(如果一个方法不需要类中的其他实例变量就可以考虑设计成类方法);this指代当前对象,尤其是成员变量和局部变量冲突时、这个关键字会非常有用,但是不能用在类变量、类方法前
(1)一般格式
①无继承
访问权限 class 类名{
//成员变量的声明或定义
访问权限 基本数据类型 变量0,变量1…,变量n;
访问权限 已知类 变量0,变量1…,变量n;
//构造函数,可以没有由系统提供默认的构造函数
类名(参数列表){
用于初始化的语句块;
}
//功能函数,也可以是重载函数(函数名相同参数列表不同)
访问权限 基本数据类型或已知类 函数名(参数列表){
语句块或含有return的语句块;
}
}
②继承
Java不支持多继承,一个子类只能有一个父类,所有类都是Object的子类
访问权限 class 子类的名称 extends 父类的名称{
//内容的定义方法和无继承的情况一样
…
}
(2)访问权限
同一个包下 | 不同包下 | |
public | 能被继承,分配空间后可以用“.”访问数据 | 能被继承,分配空间后可以用“.”访问数据 |
protected | 能被继承、供内部使用(分配空间后可以用“.”访问数据) | 能被继承、供内部使用(分配空间后不能用“.”访问数据) |
友好,默认不修饰 | 只能在同一个包下使用 | |
private | 不能被继承、供内部使用,分配空间后不能用“.”访问数据 | 不能被继承、供内部使用,分配空间后不能用“.”访问数据 |
(3)继承中方法和变量的覆盖
子类可以重载父类中的方法(和重载有区别的是返回值必须是父类对应方法的返回值的子类),当方法和父类中对应方法的形式完全一样时,子类将覆盖父类中对应的方法,类似的子类中的变量也是覆盖父类中同名的变量;访问限定字可以提高、不允许降低(public、protected、友好、private);子类不继承父类的构造方法
(4)this、super、final、abstract、instanceof
①this、super、final
this是当前类,super指父类
final修饰的类不能被继承,可能处于安全上的考虑;final修饰的方法继承的时候可以被重载不能被覆盖;final修饰的变量定义后不能再修改
②abstract
面向抽象类编程不依赖于具体的类,就不会大面积的改动程序、可维护性较好;核心部分允许扩展、不允许修改,有利于一个系统的维护
抽象类、抽象方法不能和final、static搭配使用,一般类也不能和static搭配使用;有抽象方法的类有且仅有抽象类,抽象类中的方法不一定都是抽象方法;继承抽象类的子类必须重写抽象类的抽象方法;可以用抽象类声明对象,但不能使用new为抽象类分配空间,不过声明对象后给它的非抽象子类分配空间、再使用这个对象是完全合理的(向上转型)
③instanceof
//父类创建的对象不属于子类的实例,子类创建的对象属于父类的实例,返回值true或false
对象 instanceof 类
(5)接口
类必须实现某些方法或功能,不要求类有相同的父类,接口间也是可以继承的;接口可以做参数使用,但是必须传入具体的实现类
①定义接口
访问权限 interface 接口的名称{
//常量的定义,一般省略public final static
类型 变量名=初始值;
//共有抽象方法的声明,一般省略public abstract
类型 函数的名称(参数列表);
}
②接口的使用
a.继承接口的类
访问权限 class 类的名称 implements 接口的名称{
接口的具体实现;
其他变量和方法;
}
b.继承接口的抽象类
//抽象类完成后,还需要通过具体的类继承才能使用
访问权限 abstract class 抽象类的名称 implements 接口的名称{
部分接口的具体实现;
其他变量、抽象方法、方法;
}
c.接口回调
和向上转换一样,可以调用接口中已有的、子类中对应的具体方法
(6)内部类、外嵌类、匿名类
内部类、外嵌类:在一个类的内部再定义其他类,外面的是外嵌类、里面的叫内部类;内部类可以调用外嵌类的变量和方法,但不可以声明或定义类变量、类方法(可以定义常量);定义的内部类不能在外部使用(有一种情况除外:内部类可以在访问权限的后面加上static即可,这样这个内部类一开始就有自己的空间、可以供外部使用,但是不能使用实例方法、实例对象),但是内部类的对象是可以供外部使用的;内部类得到的字节码名字是“外嵌类$内部类.class”
匿名类:在参数中直接使用“new 类的名称()//可以继承后重写父类,里面不能有新的类对象和类方法”,实现接口的方法后对接口适用
(7)异常处理
比较常用的是“throw new IllegalArgumentException(“”);”
①异常类和try…catch
异常类
获取异常的字符串内容.getMessage(),继承自Exception类并重写构造函数、重写getMessage()返回需要的字符串,在用到异常类的方法后面声明“throws 异常类的名称”、在需要的地方抛出异常即可
try{
可能会抛出异常的代码;
}
//对抛出的异常进行捕获
catch(异常类的子类0 e){
异常处理的代码;
}
…
//对抛出的异常进行捕获
catch(异常类的子类n e){
异常处理的代码;
}
//finally语句块可以没有
finally{
try…catch中如果没有System.exit(0);则执行这个部分;
}
②断言
“assert 条件;”或者“assert 条件:”对异常的说明”;”
a.用命令行的方式得到.class文件后,用“java –ea XX的包名.XX”启用断言
b.Run->Run Configuration->选择Java Application中的主类->(x)=Arguments的VM arguments中填写“-ea”、Program arguments中填写说明,再次运行即可
2.内置实用类
写程序的时候,这些类似的资料可以在对象的声明中找到
(1)输入输出数据的类Scanner
Scanner sc=new Scanner(System.in);
double sum=0.0,a=sc.nextDouble();
while(a!=0) {
sum+=a;
//还可以是nextInt()、nextBoolean()等
a=sc.nextDouble();
}
//println()输出结束后会自动换行、print()不自动换行;Java中也有个类似CC++的输出方法printf()
System.out.println("sum: "+sum);
(2)字符串String
和CC++不同的是Java中的长String数据不会自动连接、需要用到+号
①String的初始化
//拷贝构造
String s0;
String s=new String(s0);
//直接赋值
String s=”how are you?”;
//由char类型的数组初始化
char a[]={‘j’,’a’,’v’,’a’};
String s=new String(a);
String s=new String(a,1,2);
//由byte类型的数组初始化
byte[] a=new byte[1024];
String s=new String(a);
②String类的常用方法
length() | 获取字符串的长度 |
equals() | 返回布尔值,判断两个字符串是否相同 |
startsWith()、endsWith() | 判断字符串是否以另一个字符串开头、结尾 |
compareTo() | 按字典序相比较 |
contains() | 字符串是否含有另一个字符串 |
indexOf() | 字符串在另一个字符串中的第一个位置下标 |
substring() | 获取子字符串 |
trim() | 去除字符串的前后空格 |
Integer.parseInt()… | 字符串转换为int数据,其他类似… |
String.valueof() | 将数据转换为字符串 |
(2)数学计算
①Math类
abs() | 求绝对值 |
max() | 返回两个数中的最大值 |
min() | 返回两个数中的最小值 |
random() | 产生(0,1)间的随机数 |
pow() | 求幂 |
sqrt() | 平方根 |
log() | 对数,底数是10 |
sin() | 正弦值 |
asin() | 反正弦值 |
②产生随机数
(int)(Math.random()*100)+1 | 得到[0,100]间的随机整数 |
Random random=new Random(); Random.nextInt(100); | 得到[0,100)间的随机整数 |
Random random=new Random(); Random.nextBoolean(); | 得到随机的布尔值 |
(3)获取时间日期
//从1970年0点0分0刻到如今的毫秒数
System.currentTimeMillis();
七、泛型
八、流
九、数据库
十、Applet和xml传值
十一、多线程
十二、网络编程
十三、GUI
十四、附录
1.debug
双击代码行的左侧可以添加、取消断点;
启动debug,f6进入下一行
2.反编译和html格式文档
“javap [选项] 字节码文件”可以得到对应的源文件;“javadoc [选项] 不带包名和后缀的源文件”将生成类的html说明文档,-d选项可以设置说明文档的目录
3.导出jar文件
本质上是得到一个压缩包,避开了程序中资源的路径问题、所以会更容易使用;一般用命令行打开“java –jar 具体的jar文件”,带UI的程序还可以直接用Java(TM)打开;如果将.jar文件放到C:\Program Files\Java\jre1.8.0_131\lib\ext下,重启eclipse后可以引用.jar文件中的包名、使用里面的类(可惜不会有拼写上的提示)
(1)IDE的方式
File->Export…->JAR file;
选择export destination的位置;
选择seal package的内容、Main class的内容,确认即可;
(2)命令行的方式
用命令行先得到.class文件、将文件放到正确的目录下;
在包名的同级目录下创建.mf文件:
Manifest-Version: 1.0
Main-Class: logic.demo0
Class: logic.demo0
Create-By: morning
在命令行执行“jar cfm 任意名称.jar 对应名称.mf 目录名称\*.class”即可