helloworld
public class HelloWorld{
public static void main(String[] args) {
System.out.println("HelloWorld")
}
}
注释
- 行内注释 //
- 块注释
/**
*
*/
- 文档注释
/**
* @author 作者
* @version 版本
* @since jdk
* @param 参数
* @return 返回值
* @ throws 异常
*/
在命令行中使用javadoc命令就可以生成api文档。
javadoc -encoding UTF-8 -charset UTF-8 [java文件]
注解
具有语义,会实现某些功能
@Override
数据类型
java 属于强类型语言:要求变量的使用要严格符合规定,所有变量必须先定义后使用。
在java中数据类型分为两大类:
-
基本数据类型
-
引用数据类型
基本数据类型
- 数值类型
整数类型
- byte
占1个字节,数值范围:-127~128
public class Main{
public static void main(String[] args){
byte i = 12;
System.out.println(i); //=> 12
byte i = 129;
System.out.println(i); //=> error,内存溢出
}
}
- short
占2个字节,数值范围:-32768~32767
public class Main{
public static void main(String[] args){
short i = 12;
System.out.println(i); //=> 12
}
}
- int
占4个字节,数值范围:-2147483648~2147483647
public class Main{
public static void main(String[] args){
int i = 12;
System.out.println(i); //=> 12
}
}
- long
占8个字节,数值范围:-9223372036854775808~9223372036854775807
public class Main{
public static void main(String[] args){
long i = 12L;
System.out.println(i); //=> 12
}
}
浮点类型
- float
占4个字节
public class Main{
public static void main(String[] args){
float i = 1.2F;
System.out.println(i); //=> 1.2
}
}
- double
占8个字节
public class Main{
public static void main(String[] args){
double i = 1.2;
System.out.println(i); //=> 1.20
}
}
- 注意事项:
float 与 double 的比较:
public class Main{
public static void main(String[] args){
float f = 0.1F;
double f2 = 1.0/10;
System.out.println(f==f2); //=> false
float f3 = 2313131313131F;
float f4 = f3+1;
System.out.println(f3==f4); //=> true
}
}
说明:float具有舍入误差性,只能取个大概,所以在进行一些严密计算或浮点类型进行比较时,尽量使用数学工具类 BigDecimal
字符类型
- char
英文占1个字节,中文占2个字节
public class Main{
public static void main(String[] args){
char i = "中";
System.out.println(i); //=> 中
}
}
说明:所有的字符本质都是数字,并且可以进行类型的转换。
- 字节数
Java中char的字节数
以前一直以为char占一个字节,后来发现远没这么简单。Java中char的字节数,和编码有关。使用UTF-8,英文字符占1个字节,中文占3个字节。下面在是在Ubuntu中测试的结果:
public static void main(String[] args) throws IOException {
String chnStr = "中文";
System.out.println("length of two Chinese character: " + chnStr.getBytes("UTF-8").length );
String engStr = "en";
System.out.println("length of two English character: " + engStr.getBytes("UTF-8").length );
}
输出:
length of two Chinese character: 6
length of two English character: 2
在网上流传这样一个面试题:Java中一个中文char的字节数是?答案为不确定(2,3,4),跟编码有关。下面这段程序可以证明这个答案:
public static void main(String[] args) throws IOException {
String chnStr = "华";
System.out.println("length of one Chinese character in gbk: " + chnStr.getBytes("GBK").length );
System.out.println("length of one Chinese character in UTF-8: " + chnStr.getBytes("UTF-8").length );
System.out.println("length of one Chinese character in Unicode: " + chnStr.getBytes("UNICODE").length );
}
输出:
length of one Chinese character in gbk: 2
length of one Chinese character in UTF-8: 3
length of one Chinese character in Unicode: 4
- 布尔类型
true
占1位
public class Main{
public static void main(String[] args){
boolean bool = true;
System.out.println(bool); //=> true
}
}
注意:
- 不能对布尔值进行转换
false
占1位
public class Main{
public static void main(String[] args){
boolean bool = false;
System.out.println(bool); //=> false
}
}
注意:
- 不能对布尔值进行转换
引用数据类型
- 类
java 内置类(java SDK 封装的类),需要实例化对象进行调用。
- String
- StringBuilder
- StringBuffer
- Date
- DateFormat
- Math
- Random
- …
实例化对象:
public class Main{
public static void main(String[] args){
String a = new String("abc");
System.out.println(a); //=> abc
}
}
自定义的类
- 自定义类,实例化点调用
public class Main{
public static void main(String[] args){
Main m = new Main();
m.console(); //=> this is a function
}
public void console(){
System.out.println("this is a function");
}
}
- 接口
抽象类
- 使用 interface 关键字声明接口类。
- 接口中所有的方法都是抽象的。
- 使用 implements 继承接口。相比于 extends 可实现多继承。
- 子类(继承接口类)重写父类定义的接口方法,用于实现功能。
- 接口不能被实例化,因为没有构造方法。
// UserService.java 接口类
public interface UserService{
// 定义抽象方法
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
// TimerService.java
public interface TimerService{
// 定义抽象方法
void timer(String name);
}
// UserServiceImpl.java 接口实现类
/* 多继承 */
public class UserServiceImpl implements UserService,TimerService{
// 方法重写
@override
public void add(String name){
}
@override
public void delete(String name){
}
@override
public void update(String name){
}
@override
public void query(String name){
}
@override
public void timer(String name){
}
}
- 数组
数组的声明
- 数组变量本身属于引用类型,数组也可以看成对象(同样可以通过 new 实例化对象),数组中每一个元素相当于对象成员本身。
- 由于 java 中的对象存放在堆中,所以数组同样存放在堆中。
public class Main{
public static void main(String[] args){
int[] arr = new int[2];
System.out.println(arr); //=>[0, 0]
}
}
- 枚举
枚举类的声明与使用
- 定义枚举类的关键字是 enum
- 可以直接使用枚举类进行调用。
- 所有的枚举都隐性继承于 java.lang.Enum。枚举实际上还是一个类,每个被类枚举的成员实际上还是一个枚举类型的实例,它们都默认使用 public static final 修饰,所以直接使用枚举类调用即可。
// 定义枚举类
public enum Gender{
男,女;
}
public class Main{
public static void main(String[] args){
System.out.println(Gender.男); //=> 男
}
}
类型转换
基本数据类型:byte,short,char —> int —> long —> float —> double
引用数据类型:[子]class —> [父]class —> Object
- 自动类型转换
低数据类型转高数据类型
(高数据类型)变量名 = (低数据类型的值)
- 强制类型转换
高数据类型转低数据类型
(低数据类型)变量名 = (高数据类型的值)
- 注意点:
- 对于基本数据类型来说,强制类型转换会造成精度的缺失,并且要注意(计算时)内存溢出问题。
public class Main{
public static void main(String[] args){
int a = 129;
byte i = a;
System.out.println(a); //=> 128
System.out.println(i); //=> error,内存溢出
}
}
public class Main{
public static void main(String[] args){
int a = 10_0000_0000;
int b = 20;
int c = a*b; // 此处存在计算式内存移除问题
long c = a*b; // 默认是 int ,由于计算时没有进行类型的转换以至于造成计算时的内存溢出
// 进行类型的转换,先将一个变量进行类型转换
long c1 = a*((long)b);
System.out.println(c1); //=> 20000000000
}
}
- 对于引用数据类型来说,引用类型的转换多发生于继承关系之中,但是可能会造成自身属性、函数的丢失。此外不能把对象类型转换为不相干的类型。
// Father.java
public class Father /*extends Object*/{
public void fatherMethod(){
System.out.println('this is a father method')
}
}
// Son.java
public class Son extends Father{
public void sonMethod(){
System.out.println('this is a son method')
}
}
// Main.java
public class Main{
public static void main(String[] args){
// 自动转换
Father son = new Son();
son.fatherMethod(); //=> this is a father method
son.sonMethod(); //=> error,没有这个方法需要进行强制转换
((Son)son).sonMethod(); //=> this is a son method
}
}
- 不能对布尔值进行转换