一、Java语言初始
1.JDK和JRE
JDK:开发者工具包,提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。
JRE:Java运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。
2.javac与java命令
javac Hello.java:将java文件编译,生成class文件
java Hello:运行class文件
3.编译型语言和解释型语言
编译型语言:使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。现有的C、C++、Objective等都属于编译型语言。
解释型语言:使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。.Python等属于解释型语言。
Java和其他的语言不太一样。因为java针对不同的平台有不同的JVM,实现了跨平台。所以Java语言有一次编译到处运行的说法。
1.你可以说它是编译型的:因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有。?
2.你可以说它是解释型的:因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释的了。?
3.但是,现在的JVM为了效率,都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的。
二、Java基础语法
1.注释
//:行内注释
/**/:多行注释
/** */:文档注释是用来生成帮助文档的。文档注释,是一种特殊的多行注释。javadoc 生成帮助文档
public class Test{
/**
* 求输入两个参数范围以内整数的和
* @param n 接收的第一个参数,范围起点
* @param m 接收的第二个参数,范围终点
* @return 两个参数范围以内整数的和
*/
public int add(int n, int m) {
int sum = 0;
for (int i = n; i <= m; i++) {
sum = sum + i;
}
return sum;
}
}
2.标识符
java关键字:java关键字_百度百科 (baidu.com)https://baike.baidu.com/item/java%E5%85%B3%E9%94%AE%E5%AD%97/5808816
3.数据类型:
基本数据类型(八种):
类型名称 | 关键字 | 占用内存 | 取值范围 |
---|
字节型 | byte | 1 字节 | -128~127 | 短整型 | short | 2 字节 | -32768~32767 | 整型 | int | 4 字节 | -2147483648~2147483647 | 长整型 | long | 8 字节 | -9223372036854775808L~9223372036854775807L | 单精度浮点型 | float | 4 字节 | +/-3.4E+38F(6~7 个有效位) | 双精度浮点型 | double | 8 字节 | +/-1.8E+308 (15 个有效位) | 字符型 | char | 2 字节 | ISO 单一字符集 | 布尔型 | boolean | 1 字节 | true 或 false |
?引用数据类型:引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。另外,Java 语言中不支持?C++?中的指针类型、结构类型、联合类型和枚举类型。
?4.类型转换:
自动类型转换:
1.当java程序在进行赋值或运算时,精度小的类型自动转换为精度(容量)大的数据类型,这个就是自动类型转换。
2. 数据类型按精度大小排序为:
(1)char——>int——>long——>float——>double
(2)byte——>short——>int——>long——>float——>double 强制类型转换:?Java类型强制转换_CZengze的专栏-CSDN博客
5.进制转换
0b 二进制转换
0? 八进制转换
0x 十六进制转换
6.变量和常量
变量:
- 类变量:独立于方法之外的变量,用 static 修饰。
- 实例变量:独立于方法之外的变量,不过没有 static 修饰。
- 局部变量:类的方法中的变量。
public class Variable{
static int allClicks=0; // 类变量
String str="hello world"; // 实例变量
public void method(){
int i =0; // 局部变量
}
}
类变量(静态变量)
- 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
- 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
- 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
- 静态变量在第一次被访问时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
- 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
- 静态变量可以通过:ClassName.VariableName的方式访问。
- 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
实例变量
- 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
- 当一个对象被实例化之后,每个实例变量的值就跟着确定;
- 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
- 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
- 实例变量可以声明在使用前或者使用后;
- 访问修饰符可以修饰实例变量;
- 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
- 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
局部变量
- 局部变量声明在方法、构造方法或者语句块中;
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
- 访问修饰符不能用于局部变量;
- 局部变量只在声明它的方法、构造方法或者语句块中可见;
- 局部变量是在栈上分配的。
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
常量:Java 语言使用 final 关键字来定义一个常量,其语法如下所示:
final dataType variableName = value
常量与变量命名规则:
1.见名知意
2.驼峰命名(变量、方法)--------类:首字母大写+驼峰命名
3.常量:字母大写+下划线
7.运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
算数运算符:
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 | - | 减法 - 左操作数减去右操作数 | A – B 等于 -10 | * | 乘法 - 相乘操作符两侧的值 | A * B等于200 | / | 除法 - 左操作数除以右操作数 | B / A等于2 | % | 取余 - 左操作数除以右操作数的余数 | B%A等于0 | ++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21(区别详见下文) | -- | 自减: 操作数的值减少1 | B-- 或 --B 等于 19(区别详见下文) |
?自增自减运算符:
前缀自增自减法(++a,--a):?先进行自增或者自减运算,再进行表达式运算。
后缀自增自减法(a++,a--):?先进行表达式运算,再进行自增或者自减运算 。
public class selfAddMinus{
public static void main(String[] args){
int a = 5;//定义一个变量;
int b = 5;
int x = 2*++a;
int y = 2*b++;
System.out.println("自增运算符前缀运算后a="+a+",x="+x);
System.out.println("自增运算符后缀运算后b="+b+",y="+y);
}
}
关系运算符:
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 | != | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 | >? | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假。 | <? | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 | >= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 | <= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
instanceof 运算符
如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。
String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真
位运算符 :
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 | | | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 | ^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 | ? | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (?A)得到-61,即1100 0011 | <<? | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 | >>? | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 | >>>? | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
public class Test {
public static void main(String[] args) {
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
System.out.println("a & b = " + c );
c = a | b; /* 61 = 0011 1101 */
System.out.println("a | b = " + c );
c = a ^ b; /* 49 = 0011 0001 */
System.out.println("a ^ b = " + c );
c = ~a; /*-61 = 1100 0011 */
System.out.println("~a = " + c );
c = a << 2; /* 240 = 1111 0000 */
System.out.println("a << 2 = " + c );
c = a >> 2; /* 15 = 1111 */
System.out.println("a >> 2 = " + c );
c = a >>> 2; /* 15 = 0000 1111 */
System.out.println("a >>> 2 = " + c );
}
}
?逻辑运算符:
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 | | | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 | ! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
?
赋值运算符
下面是Java语言支持的赋值运算符:
操作符 | 描述 | 例子 |
---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C | + = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A | - = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A | * = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A | / = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A | (%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A | << = | 左移位赋值运算符 | C << = 2等价于C = C << 2 | >> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 | &= | 按位与赋值运算符 | C&= 2等价于C = C&2 | ^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 | | = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
?条件运算符(?:)
public class Test {
public static void main(String[] args){
int a , b;
a = 10;
// 如果 a 等于 1 成立,则设置 b 为 20,否则为 30
b = (a == 1) ? 20 : 30;
System.out.println( "Value of b is : " + b );
// 如果 a 等于 10 成立,则设置 b 为 20,否则为 30
b = (a == 10) ? 20 : 30;
System.out.println( "Value of b is : " + b );
}
}
结果:
Value of b is : 30
Value of b is : 20
8.java修饰符:
ava中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
-
default?(即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。 -
private?: 在同一类内可见。使用对象:变量、方法。?注意:不能修饰类(外部类) -
public?: 对所有类可见。使用对象:类、接口、变量、方法 -
protected?: 对同一包内的类和所有子类可见。使用对象:变量、方法。?注意:不能修饰类(外部类)。
我们可以通过以下表来说明访问权限:
访问控制
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不同包) | 其他包 |
---|
public | Y | Y | Y | Y | Y | protected | Y | Y | Y | Y/N(说明) | N | default | Y | Y | Y | N | N | private | Y | N | N | N | N |
默认访问修饰符-不使用任何关键字
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为?public static final,而接口里的方法默认情况下访问权限为?public。
私有访问修饰符-private
私有访问修饰符是最严格的访问级别,所以被声明为?private?的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为?private。
声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。
Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
公有访问修饰符-public
被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。
如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
受保护的访问修饰符-protected
protected 需要从以下两个点来分析说明:
protected 可以修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外)。
访问控制和继承
请注意以下方法继承的规则:
-
父类中声明为 public 的方法在子类中也必须为 public。 -
父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。 -
父类中声明为 private 的方法,不能够被继承。
非访问修饰符
为了实现一些其他的功能,Java 也提供了许多非访问修饰符。
static 修饰符,用来修饰类方法和类变量。
final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
abstract 修饰符,用来创建抽象类和抽象方法。
synchronized 和 volatile 修饰符,主要用于线程的编程。
|