一文带你搞懂Java中常用的关键字(持续更新中)
文章目录
一、用于定义访问权限修饰符的关键字
private ,default ,protected,public
1.private
(1)在同一类内可见,可以修饰变量和方法,不能修饰外部类。
(2)最严格的访问级别:被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能被声明为private。
(3)声明为私有类型的变量只能通过类中公共的getter方法被外部类访问。
2.default
这是默认情况下的访问修饰符,可以修饰变量和方法,对同一个包里的类是可见的;还可以修饰类和接口,在同一包内可见。
3.protected
- 对同一包内的类和所有子类可见,可以修饰变量、方法,不能修饰外部类。
- 如果子类和基类在同一个包中:被声明为protected的变量、方法和构造器能被同一个包中的任何其他类访问。
- 如果子类和父类不在同一个包中:那么在子类中,子类实例可以访问其从父类继承来的protected方法,而不能访问父类实例的protected方法。(也就是表中的说明那里)
(1)protected可以修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外)。
(2)接口以及接口的成员变量和成员方法不能声明为protected。
(3)如果我们只想让该方法对其所在类的子类可见,则将该方法声明为protected。
4.public
(1)被public修饰的类、方法、构造方法和接口能被任何其他类访问。
(2)如果几个相互访问的public类分布在不同的包中,则需要导入public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类所继承。
二、用于定义类,函数,变量修饰符的关键字
abstract ,final,static,synchronized
1.abstrcat
- abstract可以修饰类的时候,表明该类是抽象类。
(1)抽象类不能用来实例化对象,这样声明的目的是将来对该类进行补充。
(2)一个类不能同时被abstract和final修饰,如果一个类包含了抽象方法,那么该类一定要声明为抽象类,否则会编译错误。
(3)抽象类可以包含不抽象的方法。 - abstract可以修饰方法的时候,表明该方法是抽象方法。
(1)抽象方法是一种没有任何实现的方法,该方法的据图实现由子类提供。
(2)抽象方法不能被声明成final和static。
(3)任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
(4)抽象方法的声明由分号结尾,例如public abstract sample();
2.final
- final修饰变量
(1)final修饰变量后,还变量不能被重新赋值,被final修饰的变量一定要显示指定初始值。
当然也可以这样:
(2)final修饰符通常和static修饰符一起使用来创建类的常量:static写在前边 - final修饰方法
(1)父类的final方法可以被子类继承,但是不能被子类重写。
(2)声明 final 方法的主要目的是防止该方法的内容被修改。 - final修饰类
final修饰类的时候,该类不能被继承,没有类能够继承final类的任何特性。
3.static
- static可以修饰变量、方法,代码块。不管修饰什么都是将它和它所属的类的对象解绑,成为类的一部分。
-
static修饰变量
(1)无论一个类实例化多少个对象,它的静态变量只有一份拷贝,静态变量也叫类变量。
(2)被static修饰前,成员变量属于类实例存放在堆中。被static修饰后,成员变量属于类,存放的位置发生变化,放在方法区中。 -
static修饰方法
静态方法不能使用类的非静态变量。静态方法是参数列表中得到数据,然后计算这些数据。
4.synchronized -
对于synchronized声明的方法在同一时间只能被一个线程访问,是一种同步锁。
-
它可以修饰代码块,方法,静态方法,类。
-
修饰代码块
(1)被修饰的代码块称为同步代码块,范围是{括起来的代码},作用的对象是调用这个代码块的对象(它会锁定当前的对象)。
(2)一个线程访问一个对象中的synchronized修饰的同步代码块时,其他访问该对象的线程将会被阻塞;访问该对象的非同步代码块不受影响。 -
修饰方法
(1)当修饰方法时,它的作用范围会改变到整个方法。
(2)synchronized修饰方法的时候并不能被继承:
虽然可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继承。如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了。
(3)在定义接口方法的时候不能使用synchronized关键字。
(4)构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。
(5)我们知道静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是这个类的所有对象,相当于是所有对象用的是同一把锁。 -
修饰类
(1)用法如下:
synchronized作用于一个类T时,是给这个类T加锁,T的所有对象用的是同一把锁。 -
总结
A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
三、用于定义类与类之间的关键字
extends,implements
1.extends
- 在Java中通过extends继承一个已有的类,被继承的类称为父类(超类、基类),新的类称为子类(派生类),在Java中不允许多继承,但是可以多层继承。
(1)子类继承父类时,可以重写(也称覆盖)类的方法,也可以不重写。重写后就实现了新的功能,不重写就实现父类的功能。
(2)方法的重写发生在子类与父类之间。另外,可用super提供对父类的访问实现父类的功能。 - 不懂重载和重写的区别的老铁点击这里 传送门
2.implements
- implements是实现接口的关键字,用法如下:
- 实现接口的注意点
(1)实现一个接口就要实现该接口的所有方法(如上图)。
(2)接口中的方法都是抽象的。
(3)多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。
(4)JAVA中不支持多重继承,但是可以用接口来实现,这样就用到了implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了,比如 class A extends B implements C,D,E {} 。
四、用于定义建立实例及引用实例,判断实例的关键字
new,this,super, instanceof
1.new