java基本学习
基本语法
(一)关键字与标识符
1. Java关键字的使用
定义:java中那些被用来专门使用的单词
-
定义数据类型的关键字
- class、interface、enum、byte、short、int、long、float、double、char、boolean、void 定义流程控制的关键字
- if、else、switch、case、default、while、do、for、break、continue、return 修饰符权限的关键字
- private、protected、public 定义类、函数、变量修饰符的关键字
- abstract、final、static、synchronized 定义类与类之间关系的关键字
- extends、implements 定义建立实例及引用实例的关键字
- new、this、super、instanceof 用于异常处理的关键字
- try、catch、finally、throw、throws 用于包的关键字
- package、import 定义数据类型值的关键字
- true、false、 null 其他修饰符关键字
- native、strictfp、transient、volatile、assert
2.保留字
goto, const
3.标识符的使用
3.1 定义
凡是自己可以起名字的地方都是标识符。
3.2涉及到的结构
包名、类名、接口名、变量名、方法名、常量名
3.3规则
- 由26个大小写英文字母+0~9的数字,_和$组成
- 不可以使用关键字和保留字
- 数字不能放在开头
- 标识符不能有空格
3.4规范
- 包名:所有单词均是小写
- 类名,接口名:所有单词首字母均是大写
- 变量名,方法名:第一个单子首字母小写,剩下的单词首字母均是大写
- 常量名:所有单词的字母都是大写
有意义的命名
1.介绍 软件中随处可见命名。我们给变量、函数、参数、类和包命名。我们给源代码及源代码所在目录命名。 这么多命名要做,不妨做好它。下文列出了取个好名字的几条简单规则。2.名副其实,见名知意
变量名太随意,haha、list1、ok、theList 这些都没啥意义3.避免误导
包含List、import、java等类名、关键字或特殊字;
字母o与数字0,字母l与数字1等
提防使用不同之处较小的名称。比如:XYZControllerForEfficientHandlingOfStrings与XYZControllerForEfficientStorageOfStrings4.做有意义的区分
反面教材,变量名:a1、a2、a3
避免冗余,不要出现Variable、表字段中避免出现table、字符串避免出现nameString,直接name就行,知道是字符串类型
再比如:定义了两个类:Customer类和CustomerObject类,如何区分?
定义了三个方法:getActiveAccount()、getActiveAccounts()、getActiveAccountInfo(),如何区分?5.使用读得出来的名称
不要使用自己拼凑出来的单词,比如:xsxm(学生姓名);genymdhms(生成日期,年、月、日、时、分、秒)
所谓的驼峰命名法,尽量使用完整的单词6.使用可搜索的名称
一些常量,最好不直接使用数字,而指定一个变量名,这个变量名可以便于搜索到.
比如:找MAX_CLASSES_PER_STUDENT很容易,但想找数字7就麻烦了。7.避免使用编码
7.1.匈牙利语标记法
即变量名表明该变量数据类型的小写字母开始。例如,szCmdLine的前缀sz表示“以零结束的字符串”。
7.2.成员前缀
避免使用前缀,但是Android中一个比较好的喜欢用m表示私有等,个人感觉比较好
7.3.接口和实现
作者不喜欢把接口使用I来开头,实现也希望只是在后面添加Imp8.避免思维映射
比如传统上惯用单字母名称做循环计数器。所以就不要给一些非计数器的变量命名为:i、j、k等9.类名
类名与对象名应该是名词与名词短语。如Customer、WikiPage、Account和AddressParser。避免使用Data或Info这样的类名。
不能使动词。比如:Manage、Process10.方法名
方法名应当是动词或者动词短语。如postPayment、deletePage或save11.别扮可爱
有的变量名叫haha、banana
别用eatMyShorts()表示abort()12.每个概念对应一个词
项目中同时出现controllers与managers,为什么不统一使用其中一种?
对于那些会用到你代码的程序员,一以贯之的命名法简直就是天降福音。13.别用双关语
有时可能使用add并不合适,比例insert、append。add表示完整的新添加的含义。14.使用解决方案领域名称
看代码的都是程序员,所以尽量用那些计算机科学术语、算法名、模式名、数学术语,
依据问题所涉领域来命名不算是聪明的做法。15.使用源自所涉问题领域的名称
如果不能用程序员熟悉的术语来给手头的工作命名,就采用从所涉问题领域而来的名称吧。
至少,负责维护代码的程序员就能去请教领域专家了。16.添加有意义的语境
可以把相关的变量放到一个类中,使用这个类来表明语境。17.不要添加没用的语境
名字中带有项目的缩写,这样完全没有必要。比如有一个名为“加油站豪华版”(Gas Station Deluxe)的项目,
在其中给每个类添加GSD前缀就不是什么好策略。18.最后的话
取好名字最难的地方在于需要良好的描述技巧和共有文化背景。
(二)变量的使用
int a, b, c; // 声明三个int型整数:a、 b、c
int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值
byte z = 22; // 声明并初始化 z
String s = "hello world"; // 声明并初始化字符串 s
double pi = 3.14159; // 声明了双精度浮点型变量 pi
char x = 'x'; // 声明变量 x 的值是字符 'x'
java支持的变量类型有:
- 类变量:独立于方法之外的变量,用static修饰
- 实例变量:独立于方法之外的变量,没有static修饰
- 局部变量:类的方法中的变量
public class Variable{
static int allClicks=0; // 类变量
String str="hello world"; // 实例变量
public void method(){
int i =0; // 局部变量
}
}
java 局部变量
- 局部变量声明在方法、构造方法或者语句块中
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当他们执行完成后,变量会被销毁
- 访问修饰符不能用于局部变量
- 局部变量只在声明它的方法,构造方法或者语句块中不可见
- 局部变量是在栈上分配的
- 局部变量没有默认值,所以局部变量在被声明后,必须初始化才能使用
java 实例变量
- 实例变量声明在一个类中,但在方法、构造方法和语句块之外
- 当一个对象被实例化后,每个实例变量的值就跟着确定
- 实例变量的值应该至少被一个方法、构造方法和语句块引用,使得外被能够通过这些方式获取实例变量信息
- 实例变量可以声明在使用前和使用后
- 访问修饰符可以修饰实例变量
- 实例变量对于类中的方法、构造方法和语句块一般都是可见的。一般情况下都是将实例变量设为私有。通过访问修饰符可以使实例变量对子类可见
- 实例变量有默认值,数值型的默认是0,布尔型的默认是false,引用类型的默认是null。变量的值可以在声明的时候指定,也可以在构造方法中指定
- 实例变量可以通过变量名访问。但在静态方法以及其他类中,就可以使用完全限定名:ObjectReference.VariableName
java 类变量
- 类变量也被称为静态变量,在类中以static关键字声明,但必须在方法之外
- 无论一个类创建了多少对象,类只拥有类变量的一份拷贝
- 静态变量除了被声明为常量外很少被使用,静态变量是指声明为public/private,final和static类型的变量,静态变量被初始化后无法改变
- 静态变量存储在静态存储区。经常被声明为常量。很少单独使用static声明变量
- 静态变量在第一次被访问时创建,在程序结束时销毁
- 与实例变量具有相似的可见性。但为了能对类的使用者可见,大多数静态变量声明为public
- 默认值与实例变量相似。静态变量还可以在静态语句块中被初始化
- 静态变量可以通过ClassName.VaribaleName的方式访问
- 类变量被声明为public static final类型时,类变量名称一般是使用全大写,如果不是public和final类型,其命名方式与实例变量的命名方式一致
(三)java 修饰符
访问控制修饰符
使用访问控制符来保护对类、变量、方法和构造方法的访问
- default:在同一包内可见
- private:在同一类内可见。不能修饰类
- public:对所有类可见
- protected:对同一包内的类和所有子类可见。不能修饰类
- 非访问修饰符
修饰符 | 当前类 | 同一包内 | 同一包内 | 子孙类(同包) | 子孙类(不同包) | 其他包 |
---|---|---|---|---|---|---|
public | √ | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | √ | × |
default | √ | √ | √ | √ | × | × |
private | √ | × | × | × | × | × |
默认访问修饰符-----不使用任何修饰符
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量隐式声明为public static final,而接口里的方法默认情况下访问权限为public
私有访问修饰符-----private
私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
公有访问修饰符----public
被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
受保护的访问修饰符-protected
- 子类与基类在同一包中:被声明为protected的变量、方法和构造器能被同一个包中的任何其他类访问
- 子类与基类不在同一包中:在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法
protected 可以修饰数据成员、构造方法、方法成员。不能修饰类(内部类除外),接口及接口的成员变量和成员方法不能声明为protected
java 位运算
位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。
- 与运算符&:两个操作数中位数都是1结果才是1,否则结果为0
- 或运算符|:两个操作数中位数只要有一个是1结果就是1,否则为0
- 非运算符~:如果位数为1,则结果是0,反之亦然
- 异或运算符^:两个操作数中位数相同则为0,不同则为1
java中的运算符
按照优先级:由高到低
- 后缀:(), [], .
- 一元:expr++, exper–
先进行表达式计算,再自增 - 一元:++exper, --exper, +, -, ~, !
先自增,再进行表达式计算 - 乘性:*, /, %
- 加性:+, -
- 移位:>>, >>>, <<
>>>按位右移补零操作符 - 关系:>, >=, <, <=
- 想等:==, !=
- 按位与:&
- 按位异或:^
- 按位或:|
- 逻辑与:&&
- 逻辑或:||
- 条件:?:
- 赋值:=, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=
- 逗号:,
(四)数组
- 数组的相关概念
相同数据类型的元素按照一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,以便统一管理他们,然后用编号区分他们,这个名字就成为数组名,编号称为下标或索引(index),数组的各个变量成为元素(element)。数组中元素的个数称为数组的长度(length)。 - 一维数组初始化
1 确定数组的长度,也就是先要为数组和数组元素在jVM内存模型中分配空间,一旦数组的长度固定了就不可改变
2 确定数组元素的值
(方式一)静态初始化
数据元素的数据类型[] 数组名 = new 数据元素的数据类型[]{元素的值列表};
public class Test02_ArrayDefineAndUse {
public static void main(String[] args) {
// (1)声明一个数组,存储分数
// int [] scores;
// (2)初始化数组
// 1. 静态初始化
// scores = new int[]{10,20,30,40,50};
// 还可以写成如下 前提是声明与初始化在同一行
int [] scores = {20,20,30,50,60};
for(int i = 0;i<scores.length;i++) {
System.out.print(scores[i]+" ");
}
(方式二)静态初始化
数组名 = new 数组的元素类型[长度];
char[] words = new char[26];
for (int i = 0; i < 26; i++) {
words[i] = (char)(65+i);
System.out.print(words[i]);
}
基本数据类型在初始化的时候默认 int 为0 ,float为0.0,double为0.0,Boolean为false,char为’\u0000’
引用数据类型在初始化的时候默认是null
不能同时使用静态和动态初始化
如
int[] nums = new int[3]{1,2,3};
- 二维数组初始化
1 静态初始
int[][] a = {{1,2},{3,4},{5,6}}
2 动态初始化
int[][] a = new int[3][]
(四) 代码块
用{}括起来的代码:
- 普通代码块: 类中方法的方法体
- 构造代码块:类中{}直接括起来的语句,每次创建对象都会被调用,并且优先于构造函数执行
- 静态代码块:类中static{}括起来的语句,只执行一次,先于构造代码块执行
- 同步代码块:类中Synchronized(){}括起来的语句,多线程环境下互斥执行