JAVA修饰符
修饰符用来定义类、方法或者变量,通常放在语句的最前端
一、访问修饰符
1、default默认访问修饰符:在同一包内可见,不使用任何修饰符,使用对象为类、接口、变量、方法,访问级别是包级别(package-level),即只能被同一包中的其他类访问
2、private私有访问修饰符:最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private,声明为私有访问类型的变量只能通过类中公共的getter方法被外部类访问,主要用来隐藏类的实现细节和保护类的数据
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
实例中,Logger类中的format变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,定义了两个public方法:getFormat()(返回format的值)和 setFormat(String)(设置format的值)
3、public共有访问修饰符:被声明为public的类、方法、构造方法和接口能够被任何其他类访问。如果几个相互访问的public 类分布在不同的包中,则需要导入相应public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
- Java程序的main()方法必须设置成公有的,否则,Java解释器将不能运行该类。
4、protected受保护的访问修饰符:
(1)子类与基类在同一包中:被声明为protected的变量、方法和构造器能被同一个包中的任何其他类访问
(2)子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法
- protected可以修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外),接口及接口的成员变量和成员方法不能声明为protected
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 实现细节
}
}
class StreamingAudioPlayer extends AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 实现细节
}
}
父类使用了protected访问修饰符,子类重写了父类的 openSpeaker()方法,如果把openSpeaker()方法声明为 private,那么除了AudioPlayer外,其他类将不能访问该方法,只想让该方法对其所在类的子类可见,则将该方法声明为protected。
5、访问控制和继承:
(1)父类中声明为public的方法在子类中也必须为public
(2)父类中声明为protected的方法在子类中要么声明为 protected,要么声明为public,不能声明为private
(3)父类中声明为private的方法,不能够被子类继承
二、非访问修饰符
1、static修饰符:用来修饰类方法和类变量
(1)静态变量:用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。静态变量也被称为类变量。局部变量不能被声明为static变量。
(2)静态方法:用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
- 对类变量和方法的访问可以直接使用
classname.variablename
和classname.methodname
的方式访问。
3、实例
public class InstanceCounter {
private static int numInstances = 0;
protected static int getCount() {
return numInstances;
}
private static void addInstance() {
numInstances++;
}
InstanceCounter() {
InstanceCounter.addInstance();
}
public static void main(String[] arguments) {
System.out.println("Starting with " +
InstanceCounter.getCount() + " instances");
for (int i = 0; i < 500; ++i){
new InstanceCounter();
}
System.out.println("Created " +
InstanceCounter.getCount() + " instances");
}
}
Starting with 0 instances
Created 500 instances
2、final修饰符:
(1)final变量:变量一旦赋值后,不能被重新赋值。被 final修饰的实例变量必须显式指定初始值。final修饰符通常和 static修饰符一起使用来创建类常量。
(2)final方法:父类中的final方法可以被子类继承,但是不能被子类重写。声明final方法的主要目的是防止该方法的内容被修改。
public class Test{
public final void changeName(){
// 方法体
}
}
(3)final类:不能被继承
3、abstract修饰符
(1)抽象类:不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。一个类不能同时被abstract和final修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类。抽象类可以包含抽象方法非抽象方法。
(2)抽象方法:一种没有任何实现的方法,该方法的具体实现由子类提供,不能被声明成final和static。任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。抽象方法的声明以分号结尾。
4、synchronized修饰符:synchronized关键字声明的方法同一时间只能被一个线程访问。synchronized修饰符可以应用于四个访问修饰符。
5、transient修饰符:该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。
public transient int limit = 55; // 不会持久化
public int b; // 持久化
6、volatile修饰符
public class MyRunnable implements Runnable
{
private volatile boolean active;
public void run()
{
active = true;
while (active) // 第一行
{
// 代码
}
}
public void stop()
{
active = false; // 第二行
}
}
通常情况下,在一个线程调用run()方法(在Runnable开启的线程),在另一个线程调用stop()方法。 如果第一行中缓冲区的active值被使用,那么在第二行的active值为false时循环不会停止。但是以上代码中使用了volatile修饰active,所以该循环会停止。
JAVA运算符
一、算术运算符
表格中的实例假设整数变量A的值为10,变量B的值为20
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 - 相乘操作符两侧的值 | A * B 等于 200 |
/ | 除法 - 左操作数除以右操作数 | B / A 等于 2 |
% | 取余 - 左操作数除以右操作数的余数 | B%A等于0 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21 |
-- | 自减: 操作数的值减少1 | B-- 或 --B 等于 19 |
1、自增自减运算符
public class selfAddMinus{
public static void main(String[] args){
int a = 3;//定义一个变量;
int b = ++a;//自增运算
int c = 3;
int d = --c;//自减运算
System.out.println("进行自增运算后的值等于"+b);
System.out.println("进行自减运算后的值等于"+d);
}
}
进行自增运算后的值等于4
进行自减运算后的值等于2
- int b = ++a; 拆分运算过程为: a=a+1=4; b=a=4, 最后结果为b=4,a=4
- int d = --c; 拆分运算过程为: c=c-1=2; d=c=2, 最后结果为d=2,c=2
2、前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算
3、后缀自增自减法(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=6,x=12
自增运算符后缀运算后b=6,y=10
二、关系运算符
运算符 | 描述 | 例子 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真 | (A == B)为假 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真 | (A != B) 为真 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真 | (A> B)为假 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真 | (A <B)为真 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真 | (A> = B)为假 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真 | (A <= B)为真 |
三、位运算符
应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算符作用在所有的位上,并且按位运算。
A = 00111100,B = 00001101
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B)得到12,即00001100 |
或 | 如果相对应位都是0,则结果为0,否则为1 | (A或B)得到61,即00111101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A^B)得到49,即00110001 |
~ | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0 | (〜A)得到-61,即11000011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数 | A <<2得到240,即11110000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数 | A >> 2得到15即1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 | A>>>2得到15即00001111 |
四、逻辑运算符
假设布尔变量A为真,变量B为假
操作符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真 | (A && B)为假 |
称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真 | (A B)为真 | |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false | !(A && B)为真 |
- 短路逻辑运算符:当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了
五、赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | 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 |
按位或赋值操作符 |
六、条件运算符(?:)
也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要作用是决定哪个值应该赋值给变量。
variable x = (expression) ? value if true : value if false
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
七、instanceof运算符
用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)
( Object reference variable ) instanceof (class/interface type)
如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真
String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真
如果被比较的对象兼容于右侧类型,该运算符仍然返回 true
class Vehicle {}
public class Car extends Vehicle {
public static void main(String[] args){
Vehicle a = new Car();
boolean result = a instanceof Car;
System.out.println( result);
}
}
true
八、Java运算符优先级
后缀(括号类、点操作符) > 一元(自增自减) > 乘性(* /%) > 加性 > 移位 > 关系(>>= <<=) > 相等 > 按位与 > 按位异或 > 按位或 > 逻辑与 > 逻辑或 > 条件 > 赋值 > 逗号
JAVA循环语句
一、while循环
while( 布尔表达式 ) {
//循环内容
}
只要布尔表达式为 true,循环就会一直执行下去
二、do...while循环
对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。do…while循环和 while循环相似,不同的是,do…while循环至少会执行一次
do {
//代码语句
}while(布尔表达式);
public class Test {
public static void main(String[] args){
int x = 10;
do{
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}while( x < 20 );
}
}
public class Test {
public static void main(String[] args){
int x = 10;
do{
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}while( x < 20 );
}
}
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
三、for循环
for循环执行的次数是在执行前就确定的
for(初始化; 布尔表达式; 更新) {
//代码语句
}
- 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句
- 然后,检测布尔表达式的值。如果为true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句
- 执行一次循环后,更新循环控制变量
- 再次检测布尔表达式。循环执行上面的过程
四、Java增强for循环
主要用于数组
for(声明语句 : 表达式)
{
//代码句子
}
- 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等
- 表达式:表达式是要访问的数组名,或者是返回值为数组的方法
public class Test {
public static void main(String[] args){
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
}
}
10,20,30,40,50,
James,Larry,Tom,Lacy,
五、break关键字
主要用在循环语句或者 switch 语句中,用来跳出整个语句块。break跳出最里层的循环,并且继续执行该循环下面的语句。
六、continue关键字
continue适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
- 在for循环中,continue语句使程序立即跳转到更新语句。
- 在while或者do…while循环中,程序立即跳转到布尔表达式的判断语句。
public class Test {
public static void main(String[] args) {
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ) {
if( x == 30 ) {
continue;
}
System.out.print( x );
System.out.print("\n");
}
}
}
10
20
40
50
标签:操作数,JAVA,变量,int,修饰符,运算符,public
From: https://www.cnblogs.com/shihongpin/p/18350349