Java的访问控制

in J2EE

包(Package)

  1. 创建自己的包时,要求 package语句必须是文件中的第一个“非注释”代码。
  2. 如果类名冲突时,可这样写java.util.Vector v = new java.util.Vector();
  3. 可能(但并常见)有一个编译单元根本没有任何公共类。此时,可按自己的意愿任意指定文件名。

访问控制

修饰符

类内部

同一个包

子类

任何地方

private

default

protected

public

类的修饰符只有public 和 default,默认时只能被同一个文件或包内访问。

阅读全文 »

1 Comment

Java运算符优先级(表格)

in J2EE

Java运算符优先级参考图表

本文来源 http://blog.csdn.net/xiaoli_feng/archive/2009/09/18/4567184.aspx

优先级

运算符

结合性

1

() [] .

从左到右

2

! +(正)  -(负) ~ ++ –

从右向左

3

* / %

从左向右

4

+(加) -(减)

从左向右

5

<< >> >>>

从左向右

6

< <= > >= instanceof

从左向右

7

==   !=

从左向右

8

&(按位与)

从左向右

9

^

从左向右

10

|

从左向右

11

&&

从左向右

12

||

从左向右

13

?:

从右向左

14

= += -= *= /= %= &= |= ^=  ~=  <<= >>= >>>=

从右向左

说明:

1、 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。

2、 结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3+-4,则意义为3加-4,符号首先和运算符右侧的内容结合。

3、 instanceof作用是判断对象是否为某个类或接口类型。

4、 注意区分正负号和加减号,以及按位与和逻辑与的区别

其实在实际的开发中,不需要去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号去进行替代,示例代码:

int m = 12;

int n = m << 1 + 2;

int n = m << (1 + 2); //这样更直观

这样书写代码,更方便编写代码,也便于代码的阅读和维护。

3 Comments

Java的重载(Overload)与重写(Override)

in 未分类

重载与重写之间的差别

区别点

重载方法

重写方法

参数列表

必须修改

一定不能修改

返回类型

可以修改

一定不能修改

异常

可以修改

可以减少或删除,一定不能抛出新的或者更广的异常

访问

可以修改

一定不能做更严格的限制(可以降低限制)

重载(Overload)

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
只能重载构造函数
规则

  • 被重载的方法必须改变参数列表;
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.fatkun;
 
/**
 * Overloading(重载,过载)
 * 方法名相同,参数类型不同或者参数类型顺序不同
 * 返回值,访问修饰符,异常可以不一样
 * @author fatkun
 *
 */
public class Overloading {
 
	public int test(){
		System.out.println("test1");
		return 1;
	}
 
	public void test(int a){
		System.out.println("test2");
	}	
 
	//以下两个参数类型顺序不同
	public String test(int a,String s){
		System.out.println("test3");
		return "returntest3";
	}	
 
	public String test(String s,int a){
		System.out.println("test4");
		return "returntest4";
	}	
 
	public static void main(String[] args){
		Overloading o = new Overloading();
		System.out.println(o.test());
		o.test(1);
		System.out.println(o.test(1,"test3"));
		System.out.println(o.test("test4",1));
	}

重写(Override)

能够在需要新的子类特有行为时重新在子类中定义方法。
规则

  • 参数列表必须完全与被重写方法的相同;
  • 返回类型必须完全与被重写方法的返回类型相同;
  • 访问级别的限制性一定不能比被重写方法的强;
  • 访问级别的限制性可以比被重写方法的弱;
  • 重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常
  • 重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明)
  • 不能重写被标示为final的方法
  • 如果不能继承一个方法,则不能重写这个方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.fatkun;
 
/**
 * Overriding(重写,覆盖)
 * 重写是子类继承父类对父类的方法进行修改。方法名,参数,返回值必须一样。
 * 访问级别的限制性和异常不能比被重写的方法强
 * @author fatkun
 *
 */
class TestClass {
	public void test(){
		System.out.println("这是TestClass的test方法");
	}
}
 
public class Overriding extends TestClass {
 
	public static void main(String[] args) {
		new Overriding().test();
	}
 
	@Override
	public void test() {
		System.out.println("这是Overriding的test方法,重写了TestClass中的方法");
	}
}

调用

重载方法:
参数类型决定选择哪个重载版本(根据声明的参数类型),这发生在编译时。被调用的实际方法仍是发生在运行时期的虚拟方法调用。但是编译器已经知道所调用的方法的签名。因此,在运行时期,参数匹配已经明确,只是还不知道该方法所在的实际类。
重写方法:
对象类型(即:堆上实际实例的类型决定调用选择哪个方法,这发生在运行时期)

文章来源:http://chen1984.javaeye.com/blog/353342 代码来源:fatkun

1 Comment

Java数据类型转换

in J2EE

1.在Java中看到象“1.39e-47f”这样的表达式时,它真正的含义是“1.39×10 的-47次方”。

2.注意如果编译器能够正确地识别类型,就不必使用尾随字符。对于下述语句:

long n3 = 200;

它并不存在含混不清的地方,所以 200后面的一个 L大可省去。然而,对于下述语句:

float f4 = 1e-47f; //10的幂数

编译器通常会将指数作为双精度数(double)处理,所以假如没有这个尾随的 f,就会收到一条出错提示,告诉我们须用一个“造型”将double 转换成 float。

3.通常,表达式中最大的数据类型是决定了表达式最终结果大小的那个类型。若将一个float 值与一个double值相乘,结果就是 double;如将一个 int和一个 long 值相加,则结果为long。

4.将一个 float或double 值造型成整数值后,总是将小数部分“砍掉”,不作任何进位处理。

5.Math.random()的输出值范围是[0,1) 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0

6.小数据类型转换成大数据类型可以自动转换,不会丢失精度。大数据类型转换为小数据类型必须显式的转换,可能丢失精度。

2 Comments

Java的运算符号(逻辑与、或、非、移位运算)

in J2EE

1.只可将AND,OR 或NOT 应用于布尔值。与在C 及C++中不同,不可将一个非布尔值当作布尔值在逻辑表达式中使用。
2.在AND(&&)运算中a()&&b()&&c(),当a为false时,b与c都不再执行,因为整个表达式都是false了,没必要再执行下去,OR(||)也是一样,当有一个为true时就结束。

1
2
3
4
5
6
7
8
9
10
11
public class CalClass {
	static Boolean test(int num){
		System.out.println(num+">2"+(num>2));
		return num>2;
	}
	public static void main(String[] args){
		int i = 1, j =3 , k = 4;
		System.out.println(test(i)||test(j)||test(k));
		System.out.println("end");
	}
}

3.对于布尔值,按位运算符(如&)具有与逻辑运算符(如&&)相同的效果,只是它们不会中途“短路”。

移位运算符

左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补 0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java 也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。
若对char,byte 或者short 进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个 int数里移动不切实际的位数。若对一个long 值进行处理,最后得到的结果也是long。此时只会用到右侧的 6个低位,防止移动超过 long 值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对 byte 或short 值进行右移位运算,得到的可能不是正确的结果(Java 1.0 和Java 1.1 特别突出)。它们会自动转换成int 类型,并进行右移位。但“零扩展”不会发生。
http://www.blogjava.net/rosen/archive/2005/08/12/9955.html
“>> 右移”;“<< 左移”;“>>> 无符号右移”
例子:

例子:
-5>>3=-1
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1111 1111
其结果与 Math.floor((double)-5/(2*2*2)) 完全相同。

-5<<3=-40
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1101 1000
其结果与 -5*2*2*2 完全相同。

-5>>>3=536870911
1111 1111 1111 1111 1111 1111 1111 1011
0001 1111 1111 1111 1111 1111 1111 1111

6 Comments

java变量的作用域

in J2EE
1
2
3
4
5
6
7
8
9
10
11
12
13
public class OneClass {
	static int x;//会赋值默认值0
	public static void main(String[] args){
		//int x = 2;
		//不能在同一个方法内定义同一个变量,不然会报错 Duplicate local variable x
		System.out.println("第一个x:"+x);
		{
			int x = 5;//在方法内的变量必须初始化,否则x会是随机值而不是0
			//如果不赋值会报错The local variable x may not have been initialized
			System.out.println("第二个x:"+x);
		}
	}
}
1 Comment

Java的主要类型及它们的取值范围

in J2EE

Java的主要类型

主类型

默认值

大小(位)

最小值

最大值

封装器类型

boolean

false

1

-

-

Boolean

char

‘\u0000′(null)

16

Unicode 0

Unicode 2^16-1

Character

byte

(byte)0

8

-128

127

Byte

short

(short)0

16

-2^15

+2^15-1

Short

int

0

32

-2^31

+2^31-1

Integer

long

0L

64

-2^63

-2^63-1

Long

float

0.0f

32

IEEE754

IEEE754

Float

double

0.0d

64

IEEE754

IEEE754

Double

对于float:共32个bits,Bit 31是MSB(Most Significant Bit),Bit 0是LSB(Least Significant Bit),则
Bit 31是符号位,接下来的8位是指数位,指数位被视为一个无符号的数,它与127的差就是以2为底的指数的部分。 最后的23位是小数部分。

在byte(8位)中的取值范围为-128 到 127的问题

在电脑用是使用补码来存储数字的,我搜索了很多,还不是很明白。以前的反码之类的没认真学习。。。

因为 -0 和 +0 在补码中是不一样的,把 1000 0000 作为-128(补)  ,127(补)=0111 1111,0(补) = 0000 0000, -127(补) = 1111 1111, -128在9位中表示应该为 1 1000 0000,取低八位就变成了  1000 0000

摘录一篇文章如下,更详细可以点链接查看

http://topic.csdn.net/t/20050828/10/4235813.html

在机器中
负数的补码是这样算的:
先将该负数取绝对值,再用二进制表示出这个绝对值
对该二进制数进行取反加一操作就得到负数的补码了
-128   绝对值是   128
128的二进制表示为:
1000   0000
取反
0111   1111
加1
1000   0000
这就是-128的补码

0 Comments

重新学习Java基础

in J2EE

想要重新学习Java基础,因为基础实在是太差了,很多概念都搞不清楚,而笔试题中大部分是基础题,加强基础还是很有必要的,苦于没有学习的条目,所以上网搜索到下面的文章,吓死我了,这位同学看了N本书,应该还写了N多的读书笔记~哎,学习没有捷径,唯有苦功夫。大概按照这来看着,看来我要买本《Thinking in Java》,看电子书不太舒服。

以下原文地址:学习java的步骤和一些必看的书籍

阅读全文 »

0 Comments