Java開發(fā)必備的三大修飾符
更新時間:2021年06月02日 15:26:16 作者:北夷煙雪江中雨
JAVA的三個修飾:static,final,abstract,在JAVA語言里無處不在,但是它們都能修飾什么組件,修飾組件的含義又有什么限制,總是混淆.所以來總結一下,需要的朋友可以參考下
一、abstract 抽象的
抽象類:被abstract 修飾的類
語法: abstract class 類名{}
抽象方法 : 被abstract 修飾的方法
定義語法:
訪問修飾符 abstract 返回值類型 方法名(參數(shù)列表);
abstract 訪問修飾符 返回值類型 方法名(參數(shù)列表);
特點:
1.當一個類中存在抽象方法 那么這個類也必須是抽象的
2.一個抽象類中可以有抽象方法也可以有非抽象方法
3.如果一個類繼承了抽象類,這個類如果不想成為抽象類,那么這個類必須實現(xiàn)抽象類中的所有抽象方法
4.抽象類不能創(chuàng)建對象,但是可以聲明引用,抽象類的對象是存在的,是由子類創(chuàng)建子類對象時調(diào)用父類構造方法創(chuàng)建的,是無法自己手動去new 抽象類的對象的
抽象類的好處:強制使用多態(tài)
案例:
public class Demo{
public static void main(String[] args) {
}
}
abstract class Animal{
//抽象方法
public abstract void eat();
public abstract void sleep();
public void m1() {
System.out.println("m1");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃屎");
}
public void sleep(){
System.out.println("狗睡");
}
}
案例:
public class Demo{
public static void main(String[] args) {
Animal a = new Dog();
}
}
abstract class Animal{
public Animal() {
System.out.println("動物類的構造被調(diào)用 創(chuàng)建了 對象");
}
//抽象方法
abstract public void eat();
public abstract void sleep();
public void m1() {
System.out.println("m1");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃屎");
}
public void sleep(){
System.out.println("狗睡");
}
}
二、static 靜態(tài)的
static修飾成員變量:類變量 靜態(tài)變量 靜態(tài)屬性
定義語法:
訪問修飾符 static 數(shù)據(jù)類型 變量名 = 變量值;
static 訪問修飾符 數(shù)據(jù)類型 變量名 = 變量值;
訪問的方式(特點)
1.類變量可以用 類名.屬性名 訪問
2.可以通過創(chuàng)建對象 用引用去訪問 (不推薦)
案例:
public class Demo{
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test();
t1.a++;
t1.b++;
System.out.println(t2.a);//10
System.out.println(t2.b);//21
}
}
class Test{
int a = 10;//實例變量
static int b = 20;//類變量
}
案例2:
public class Demo{
public static void main(String[] args) {
/*Test t1 = new Test();
Test t2 = new Test();
t1.a++;
t1.b++;
System.out.println(t2.a);
System.out.println(t2.b);*/
System.out.println(Test.b);//20
}
}
class Test{
int a = 10;//實例變量
static int b = 20;//類變量
}
static修飾成員方法: 靜態(tài)方法
語法:
訪問修飾符 static 返回值類型 方法名(形參列表){
方法的實現(xiàn);
}
static 訪問修飾符 返回值類型 方法名(形參列表){
方法的實現(xiàn);
}
特點:
1.靜態(tài)的方法中 不可以直接訪問非靜態(tài)的成員(成員變量 和 成員方法)
2.如果要訪問非靜態(tài)的成員 必須創(chuàng)建對象 通過引用取訪問
3.靜態(tài)方法可以通過 類名.方法名() 訪問 也可以通過引用去訪問(不建議)
4.靜態(tài)的方法可以被繼承 靜態(tài)的方法不能被非靜態(tài)的方法所覆蓋 只能被靜態(tài)方法覆蓋 但是沒有多態(tài)(引用是什么類型 調(diào)用的方法就是這個類型中的方法)
5.在靜態(tài)方法中是不可以使用 this 和 super 關鍵字 因為 this 和 super都是和對象有關的 而靜態(tài)的成員和對象無關 先于對象存在
案例:關于靜態(tài)方法 訪問非靜態(tài)的成員
public class Demo{
public static void main(String[] args) {
/*Test t1 = new Test();
Test t2 = new Test();
t1.a++;
t1.b++;
System.out.println(t2.a);
System.out.println(t2.b);*/
//System.out.println(Test.b);//20
}
}
class Test{
int a = 10;//實例變量
static int b = 20;//類變量
//靜態(tài)方法
public static void m1() {
m2();
//System.out.println(a);
}
//成員方法
public void m2() {
}
}
案例:關于 靜態(tài)方法的使用 和 通過引用去訪問非靜態(tài)的成員
public class Demo{
public static void main(String[] args) {
//Test.m1();
Test t = new Test();
t.m1();
}
}
class Test{
int a = 10;//實例變量
static int b = 20;//類變量
//靜態(tài)方法
public static void m1() {
Test t = new Test();
System.out.println(t.a);
t.m2();
}
//成員方法
public void m2() {
System.out.println("m2");
}
}
案例:關于 靜態(tài)方法被繼承
public class Demo{
public static void main(String[] args) {
/*Dog d = new Dog();
d.eat();*/
Dog.eat();
}
}
//定義動物類
class Animal{
public static void eat() {
System.out.println("動物吃");
}
}
class Dog extends Animal{
}
案例:關于 靜態(tài)方法中是否能使用 this 和 super
public class Demo{
public static void main(String[] args) {
/*Dog d = new Dog();
d.eat();*/
//Dog.eat();
/*Animal a = new Dog();
a.eat();*/
Dog.eat();
}
}
//定義動物類
class Animal{
String sex = "狗妖";
public static void eat() {
System.out.println("動物吃");
}
}
class Dog extends Animal{
/*static String name = "金毛";
static int age = 3;*/
String sex = "母";//成員變量
public static void eat() {
String sex = "公"; //局部變量
System.out.println(super.sex);
/*System.out.println(name);
System.out.println(age);
System.out.println("狗吃");*/
}
}
初始代碼塊:定義在類中 方法外 用于在創(chuàng)建對象時 和 成員變量 按照從上向下的順序執(zhí)行初始化的操作 也叫做 動態(tài)代碼塊
語法:
{初始化代碼塊 }
案例:
public class Demo{
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.a);
System.out.println(t.b);
System.out.println(t.c);
}
}
class Test{
int a = 10;
int c;
int b;
{//初始化屬性的
c = 30;
b = 20;
}
}
static 修飾初始化代碼塊:靜態(tài)代碼塊
靜態(tài)代碼塊的作用:在類加載時 和靜態(tài)的屬性 按照順序執(zhí)行 為類進行初始化操作
語法:
static{
}
案例:
public class Demo{
public static void main(String[] args) {
System.out.println(Test.a);
System.out.println(Test.b);
}
}
class Test{
static int a = 20;
static{
b = 40;
}
static int b;
}
注意:靜態(tài)變量 時有默認值 先進行賦默認值 再初始化
==================================================================
類加載:當jvm第一次使用一個類時 需要通過classpath 找到.class = 字節(jié)碼文件
讀入這個類中的信息(包名 類名 屬性 方法 靜態(tài)的變量 靜態(tài)的方法 。。。)并保存在虛擬機中 類加載只進行一次
類加載的時機:
1.創(chuàng)建對象時
2.類名訪問靜態(tài)成員(靜態(tài)屬性 靜態(tài)方法)
3.子類進行類加載時 會先進行父類的類加載
案例:關于 1和2 兩種情況類加載
public class Demo{
public static void main(String[] args) {
//1.創(chuàng)建對象
//Test t = new Test();
//2. 訪問靜態(tài)的成員
System.out.println(Test.a);
}
}
class Test{
static int a = 20;
static{
System.out.println("父類 類加載了");
}
}
案例:關于 3 情況的類加載
public class Demo{
public static void main(String[] args) {
//創(chuàng)建子類的對象
//Sub s = new Sub();
System.out.println(Sub.b);
}
}
class Test{
static int a = 20;
static{
System.out.println("父類 類加載了");
}
}
class Sub extends Test{
static int b = 30;
static{
System.out.println("子類進行類加載了");
}
}
三、final 最終的
修飾變量
局部變量:final修飾的局部變量只能賦值一次 值一旦賦值不可以改變
常量的定義:
public static final double PI = 3.14159265457;
案例:
public class Demo{
public static void main(String[] args) {
int a = 20;//局部變量
final int b = 10;
a++;
b++;
System.out.println(a);
System.out.println(b);
}
}
public class Demo{
public static void main(String[] args) {
final int a ;//聲明
a = 10;
a = 20;//報錯
System.out.println(a);
}
}
實例變量
特點:
1.final修飾的實例變量沒有默認值
2.final修飾的實例變量只能賦值一次
3.final修飾的實例變量可以在構造方法中初始化 但是要保證每個構造都必須能夠為這個變量初始化
案例:
public class Demo{
public static void main(String[] args) {
Animal a = new Animal(250);
//System.out.println(a.a);//0
System.out.println(a.b);
}
}
class Animal{
/*int a = 10;//實例變量
final int b = 20;*/
int a;
final int b = 20;
public Animal(int b) {
this.b = b;
}
}
public class Demo{
public static void main(String[] args) {
Animal a = new Animal(250);
//System.out.println(a.a);//0
System.out.println(a.b);
}
}
class Animal{
/*int a = 10;//實例變量
final int b = 20;*/
int a;
final int b ;
public Animal(int b) {
this.b = b;
}
public Animal() {
b = 30;
}
}
類變量
特點:
1.final修飾的類變量沒有默認值
2.final修飾的類變量可以通過靜態(tài)代碼塊進行初始化
案例:
public class Demo{
public static void main(String[] args) {
System.out.println(Animal.a);
System.out.println(Animal.b);
}
}
class Animal{
static int a ;
final static int b ;
static{
b = 250;
}
}
修飾方法
成員方法:
特點:
1.final修飾的成員方法可以重載
2.final修飾的成員方法不可以被覆蓋
語法:
public final void m1() {
}
final public void m1() {
}
案例:
public class Demo{
public static void main(String[] args) {
}
}
class Animal{
public void m1() {
System.out.println("m1");
}
}
class Dog extends Animal{
public final void m1() {
System.out.println();
}
}
靜態(tài)方法:
特點:
1.final修飾的靜態(tài)方法可以重載
2.final修飾的靜態(tài)方法不可以被覆蓋
案例:
public class Demo{
public static void main(String[] args) {
}
}
class Animal{
public final static void m1() {
System.out.println("m1");
}
public final static void m1(int a) {
System.out.println("m1");
}
}
class Dog extends Animal{
}
修飾類
語法:
final class Animal{
}
特點:final修飾的類沒有子類 俗稱斷子絕孫類
jdk的類庫中有哪些final修飾的類?
String Math System
案例:
public class Demo{
public static void main(String[] args) {
}
}
class Dog extends System{
}
四、關于修飾符混搭的原則
class Animal{
public final static void m1() {
System.out.println("m1");
}
public final static void m1(int a) {
System.out.println("m1");
}
}
class Dog extends Animal{
}
##### 修飾類
```java
語法:
final class Animal{
}
特點:final修飾的類沒有子類 俗稱斷子絕孫類
jdk的類庫中有哪些final修飾的類?
String Math System
案例:
public class Demo{
public static void main(String[] args) {
}
}
class Dog extends System{
}
五、關于修飾符混搭的原則


到此這篇關于Java開發(fā)必備的三大修飾符的文章就介紹到這了,更多相關Java三大修飾符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談Java list.remove( )方法需要注意的兩個坑
這篇文章主要介紹了淺談Java list.remove( )方法需要注意的兩個坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Springboot整合mybatis開啟二級緩存的實現(xiàn)示例
在一級緩存中,是查詢兩次數(shù)據(jù)庫的,顯然這是一種浪費,既然SQL查詢相同,就沒有必要再次查庫了,直接利用緩存數(shù)據(jù)即可,這種思想就是MyBatis二級緩存的初衷,本文就詳細的介紹了Springboot整合mybatis開啟二級緩存,感興趣的可以了解一下2022-05-05

