- public关键字在文件中只能定义一个非内部类,否则编译器将会出错;
- public 、 protected 、friendly(默认) 、private修饰符的访问权限:
权限大小:public>protected>friendly>private
- protected修饰属性、方法和构造函数;可见范围有同一个包内和与基类不在同一个包内的子类(只能访问自身从基类继承而来的受保护的成员,而不能访问基类实例本身的受保护成员);
- 保护成员对除了子类外的所有类实际上都是包级访问或默认访问。对于包外子类,只能通过继承访问。
- 通过参数的顺序和类型来区分重载与重写,返回类型对区分方法没有帮助。
方法重载:
同一个类中允许同时存在两个以上同名的方法
重载规则:方法名相同
方法参数不同(参数个数不同、参数类型、参数顺序不同)
与返回值类型无关(可相同,也可不相同)
方法重写:
子类继承父类时才会发生
重写规则:
方法名相同
方法参数相同(参数个数,参数类型、参数顺序都得相同)
返回值类型相同
子类中方法的访问权限要不小于父类中方法的访问权限(即子类修饰符不能低于父类的修饰符)
- static方法不能被重写
- case语句中,default语句不是必须在结尾处出现的;
- switch语句中,参数类型只能是byte、char、short或int类型的变量;
- if表达式的返回类型只能是Boolean类型;
- for中定义的变量只能在内部可用,在for循环外部来说永远是不可见的;
- 在子类中一个重写的方法只可能只抛出父类中声明过的异常或者异常的子类,或者不抛出异常。
- 一个类的构造方法无论是什么修饰符去修饰,它的main方法都可以实例化这个 方法;
System.gc()
是用来调用垃圾收集器的,但是这并不能保证执行。- 当代码已经无法再访问对象的时候,这个对象就成为了可回收的垃圾。
- 对象无法再被访问的情况有两种,分别为
对象的引用设置为null
和指向指挥官对象的引用指向了其他对象
- 定义在方法中的类只能看到来自嵌套方法中的final域,但是它可以看到嵌套类中包括私有域在内的域。
- 构造函数的执行顺序(由此不难看出java类初始化时构造函数的调用顺序): 构造函数的执行顺序(由此不难看出java类初始化时构造函数的调用顺序):
1.初始化对象:初始化的对象的存储空间为空,或者值为0;
2.按顺序分别调用父类成员变量和实例成员变量的初始化表达式;
3.调用父类构造函数:可以用super()方法指定具体的某个父类的构造函数;
4.按顺序分别调用类成员变量和实例成员变量的初始化表达式;
5.调用类本身的构造函数
- Java中的关键字:
1.与数据类型相关
关键字------类型------占字节数------备注;
boolean------布尔数据类型------1------有true和false两个值;
long------长整型数据类型------8;
int------整型数据类型------4------ -2^31~2^31-1;
short------短整型数据类型------2------ -2^15~2^15-1;
byte ------字节数据类型------1------大小范围为-2^7~2^7-1;
float ------浮点型(实数型)------4;
double------双精度型数据类型------8;
char------字符型数据类型------ 2------(Unicode码);
class------表示一个类------不确定------可用于定义一个类;
interface------表示一个接口------不确定------可用于定义一个接口;
2.与流程控制
if------表示条件判断;
else------条件转折,与if连用;
do-while------表示循环语句,最少执行一次;
for------表示循环,for循环是最常使用的循环,格式for(表达式a; 表达式b; 表达式c)括号里面的书通常用于控制循环的次数,一般会用一个int类型的变量类计数,如(int i=0; i<10; i++)表达式a用于流程控制的开始值,表达式b表示循环终止条件,表达式c用于计数。
switch(条件a)case……:switch和case合起来用于表示条件分支流程。如:
while(int c) {
case 1: {语句块1}
case 2: {语句块2}
……?????? ……
case n: {语句块n}
default:exit(0);
}
如果c为1,则执行语句块1;如果c为2,则执行语句块2;以此类推,如果c为n,则执行语句块n。default表示除case以外出现的情况。
default:在switch……case……分支语句可知,default是在所有case条件下都不成立时使用。用于包表示src文件夹下的当前包;如果用于类,表示只可被本文件内的其它类访问。
break:用于结束本层循环,或跳出某层循环。
continue:用于跳出本次循环,而break跳出本层循环。Break和continue可以实现类似于C\C++中goto语句的用法:
try{……}中放置可能会发生异常的的语句块,catch(){……}用于抓住异常,{}定义当出现异常时的处理方法。finally{……}表示不管异常是否发生,都得进行finally{}中的处理。
java关键字众多,在此就不一 一附上了
- 类级别的变量总会被赋予一个缺省值,而一个成员变量(包含在方法中)将不会被赋予任何缺省值;
- 任何基本类型的数组元素的值总是在初始化的时候就会被初始化缺省值,无论数组是否被定义、无论数组定义为类级别还是方法级别;
- java中进制的表示:
八进制:以0开头,eg:012表示10
十进制:正常表示,eg:20
十六进制:以0X开头:eg:0X12表示18
- 一个具有小数部分的数据的缺省值类型是double而不是float;
- char是java中唯一的未赋值的原始数据类型,他是16位长的;
- 对于基本类型的包装类可以直接赋值;
- 只有+运算符可以对字符串进行重载,不能对字符串使用除号和减号,否则就会出错;
- 3>>>32的值是3,也就是说被移动了0位。
移位运算符:
>>: 左移运算符
<<:右移运算符
>>>:无符号右移,忽略符号位,空位都以0补齐
- 参数传递:基本类型是值传递。引用类型是地址传递,可以改变其内容。
- 运算优先级:
单操作数运算符>算数运算符>移位运算符>比较运算符>按位运算符>逻辑运算符>条件运算符>赋值运算符
- 十进制负数与二进制的转化:
去掉符号(-)-----转化为二进制-----取反-----加1
- 二进制负数与十进制的转化:
减1-----取反-----转化为十进制-----加上符号(-)
- 带符号移位运算:
左移:相当于*2
和右移:相当于/2
- 逻辑运算符:
&&:第一操作数为假,则第二个操作没有作用,所有结构都为假;
和||:如果第一个操作为真,则所有计算结果都为真;
- 按位运算符可以对boolean进行操作;
- 按位运算符优先级:
&>^>|
- final常量在使用前必须初始化,否则会出现编译错误;
- static关键字不能修饰顶层类;
- 方法中的局部变量不能是用static来修饰;
- transient关键字只能用于修饰变量,而不能修饰类和方法;
注意:本地变量是不能被transient关键字修饰的
- synchronized关键字不能修饰构造函数。
- 单操作数运算符在进行算数时的基本数据类型转换规则如下:
1).当运算符取正运算符(+)、取负运算符(-)、或按位取反运算符(~)时,如果操作数为字节型(byte)、短整型(short)、或字符型(char)、则先被转化为整型,再参与运算;
2).当运算符为自动递增运算符(++)或自动递减运算符(--)时,如果操作数为字节型(byte)、短整型(short)、或字符型(char),则不用转化为整型,而是直接参与算数运算,且运算结果类型也不变;
3).如果操作数为整型(int)或长整型(long),则无论运算符为何种但操作运算,均不发生类型转换,直接参与运算,且结果类型不变(结果类型为大类型);
- 双操作数运算符在进行算数时的基本数据类型转化规则如下:
1).如果操作数之一为双精度型(double),则另一个操作数先被转化为双精度型(double),再参与算数运算;
2).如果两个操作数均不为双精度(double),当操作数之一为单精度型(float),则另一个数先转化为单精度,再参与运算;
3).如果采用+=、*=等缩略形式的运算符,系统会自动强制将运算符结果转化为目标变量的类型;
- 数组实现了Cloneable接口,继承了Object类
- 执行执行
System.exit()
方法或者出现error错误时,finally语句块才不会获得执行而退出程序(即:如果程序中没有System.exit()
方法和程序没有error错误,则finally语句块必须执行); - 在使用
try……catch
语句块时,如果try中没有响应异常产生,则catch中不能有这种异常。否则编译错误。但exception、throwable可以出现。运行时异常也可以,如NullPointException
- 在用实现Runnble接口的方法来创建线程时,必须要求创建一个Thread对象的实例,并且必须要在创建的时候,把实现该Runnble接口的对象作为构造方法的参数传递进去;
- 关键字synchronized可以用在标记一段声明或者锁定一段代码,请注意的是这里的锁是基于对象而不是基于方法的;
- wait和notify应该放在Synchronized关键字标记的代码中保证当前的代码在监视器的监控之中。
- 线程调度不是独立的,不能依靠虚拟机让他用同一种方式运行
ceil()
方法返回的是比操作数大的最小的double值,如一下代码块输出值为2.0;
System.out.println(Math.ceil(1.1));
floor()
方法返回的是比操作数小的最大的double值,如下图代码块输出值为1.0;
System.out.println(Math.floor(1.1));
- 不像一些随机数系统,Java似乎并不支持提供种子数来增加随机数;
round()
方法返回一个最接近参数的整数,如果小数部分大于等于0.5,则入,否则则舍;
System.out.println(Math.round(1.49));
结果为1.0
- 接口可以是默认的访问修饰符
- 抽象类的第一个具体子类必须实现超类的所有抽象方法;
- 一个方法永远不能同时标识为abstract和final,或者同时标识为abstract和private,也不能与static修饰符组合使用;
- static不能修饰类;
- 从java5起,只要新的返回类型是被重写的(超类)方法所声明的返回类型的子类型,就允许更改重写方法中的返回类型;
- 只能将静态变量和方法作为调用super()或this()的一部分进行访问,例如,
super(Animal.Name)
不能用非静态属性; - 一个类的构造方法是私有的时候,这个类的main方法是可以访问的,再main方法中可以直接new一个类的实例;
- 以下赋值是非法的:
int x = 25,36;
char e = -29;
char e = 70000;
- 以下赋值是合法的
int x,y = 1
char e = (char)-29;
char e = (char)70000;
- 以下声明二维数组是合法的:
int[][] arr = new int [2][];
- JVM只需知道赋予变量arr的大小;
- 使用匿名数组创建语法时,不能指定数组的大小:
new int[]{1,2}
- 所有数组均是对象;
- int类型的数组不能引用其他类型的数组:以下代码是错误的:
char[] arr = new int [2]
- 实例初始化块代码的运行时间恰好发生在调用构造函数中super()之后。换句话说,在所有超类的构造函数运行之后,如果有多个初始化块,则运行顺序是自顶向下。静态代码块只会在类初始化的时候执行一次。
- 除了Character之外,所有的包装类都是提供2个构造函数:一个是基本类型、一个是String表示的变元。
- 为了节省内存,对于以下包装器对象的两个实例,当他们的基本值相同时,他们总是==关系:
Boolean、Byte、从\u0000到\u007f的字符(7f是十进制的127)、-128~127的Short和Integer
- 对于方法的重载需要记住以下规则:
加宽是优先于装箱执行的
加宽优先于var-arg(边长参数)执行
装箱优先于var-arg(边长参数)执行
不能从一个包装类加宽到另一个包装类
不能先加宽,后装箱
可以先装箱,后加宽
顺序是:
1.参数是基本类型:先匹配自身>加宽>包装类
2.参数是包装类型:先匹配自身>拆箱基本类型>拆箱加宽基本类型
- 在是final变量上不能使用递增或递减运算符
- case常量必须是编译时的常量,即如
switch(a){ case b: }
其中的b必须和a是同一种类型;
byte g = 127;
switch(g){
case 127:
}
代码编译错误:因为128超出byte范围;
- 多个case标签使用相同的值也是非法的;
- switch中的default会像任何其他的case一样直落运行。
- 使用不带catch子句和fianlly子句的try子句是非法的;
- 任何catch子句都必须紧跟在try之后;
- 任何finally必须跟在最后一个catch子句之后,没有catch子句,则必须紧跟在try子句之后;
Exception
、Error
、RuntimeException
和Throwable
类型的异常都够使用throw
关键字抛出;