国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table of Contents
In object-oriented programming languages, polymorphism is the third basic feature after data abstraction and inheritance.
Richter substitution principle
忘記對(duì)象類型
2.顯露優(yōu)勢(shì)
合理即正確
可擴(kuò)展性
失靈了?
3.構(gòu)造器與多態(tài)
構(gòu)造器內(nèi)部的多態(tài)行為
Home Java JavaBase These days, if you say you know Java, you have to know polymorphism.

These days, if you say you know Java, you have to know polymorphism.

Sep 15, 2020 pm 04:46 PM
java Polymorphism

These days, if you say you know Java, you have to know polymorphism.

Related learning recommendations: java basic tutorial

Today, I visited the company as usual. Sit down at your workstation and turn on the computer, "It's another day of moving bricks". After thinking about it, I opened Idea skillfully, looked at today's requirements, and started typing the code. Hey, who wrote these codes, how come they appear in my code, and they are still waiting to be submitted. I remember I have never written them, so I looked at them with interest:

These days, if you say you know Java, you have to know polymorphism.
Isn’t this polymorphic? Whoever wrote the test on my computer couldn’t help but wonder.

"Look at the output of this?"

A sound came from behind. Because I was thinking about the output, I didn't care about the source of the sound, so I continued. After looking at the code, I came to the conclusion:

    polygon() before cal()
    square.cal(), border = 2
    polygon() after cal()
    square.square(), border = 4復(fù)制代碼

I thought: That’s it? At least you are a Java development engineer, okay? Although you usually do a lot of work, you still have some basic skills. I couldn't help but feel a little proud~

"Is this your answer? It seems that you are not doing well either"

The voice suddenly sounded again, this time I was not calm anymore , Nima! I also thought about this answer in my mind, okay? Who can see it? Moreover, it makes people want to perform a set of Awei's Eighteen Styles.

"Who are you?"

turned his head with a hint of doubt and anger. Why is there no one? I couldn't tolerate any doubts, "Xiaocai, wake up, why did you fall asleep during working hours?"Did you fall asleep during working hours? I opened my eyes and looked at my surroundings. It turned out to be a dream, and I breathed a sigh of relief. I looked around and saw the department manager standing in front of me. He was sleeping during working hours. Are you feeling unwell or something? I wrote a bunch of bugs yesterday but didn't correct them, and I submitted some messy stuff today. I think your performance this month is not what I want, and based on your performance, I have to start thinking about it for the department.

"I'm not, I didn't, I don't know why I fell asleep, please listen to my explanation!"

Before I could say this sentence, felt in my heart I want to take you home with the flower. I don’t care if it’s real or fake in the bar late at night. Please swing it to your heart’s content and forget about him. You are the most charming. Do you know? The alarm bell rang. I I stood up, my back was slightly wet, my forehead was slightly sweaty, I checked my phone, it was Saturday, 8:30, it turned out to be a dream! Strange, how could I have such a strange dream? It’s so scary. Then I thought of the part of the code in the dream. Are my results wrong? Based on memory, I typed it out again on the computer, and the results are as follows:

/*
    polygon() before cal()
    square.cal(), border = 0
    polygon() after cal()
    square.square(), border = 4
*/復(fù)制代碼

square.cal(), the result of border

is actually 0, not 2. Am I not even good at polymorphism now? In front of your computer and mobile phone, you don’t know if you have come up with the correct answer! Regardless of whether you have it or not, let’s review polymorphism with Xiao Cai!

Some friends may be confused about not only the result of square.cal(), border

is 0, but also why it is not

square.square(), border = 4 Output the doubts first. Then let’s get started with doubts! Polymorphism

In object-oriented programming languages, polymorphism is the third basic feature after data abstraction and inheritance.

Polymorphism can not only improve the organization and readability of code, but also create scalable programs. The function of polymorphism is to eliminate the coupling relationship

between types.

1. Upward transformation

According to the

Richter substitution principle

: Wherever a base class can appear, a subclass can definitely appear.

The object can be used either as its own type or as its base type. This method of treating a reference to an object as a reference to its base type is called - Upcast

. Because the parent class is above the child class, the child class must reference the parent class, so it is called

Upward transformation.

public class Animal {    void eat() {
        System.out.println("Animal eat()");
    }
}class Monkey extends Animal {    void eat() {
        System.out.println(" Monkey eat()");
    }
}class test {    public static void start(Animal animal) {
        animal.eat();
    }    public static void main(String[] args) {
        Monkey monkey = new Monkey();
        start(monkey);
    }
}/* OUTPUT:
Monkey eat()
*/復(fù)制代碼
The start()

method in the above

test class receives a reference to Animal, and naturally can also receive from Animal's exported class. When calling the eat() method, the eat() method defined in Monkey is naturally used without any type conversion. Because upgrading from Monkey to Animal can only reduce the number of interfaces, but not fewer interfaces than Animal. A not particularly appropriate analogy: Your father’s property will be inherited to you, and your property is still yours. In general, your property will not be less than your father’s.

These days, if you say you know Java, you have to know polymorphism.

忘記對(duì)象類型

test.start()方法中,定義傳入的是 Animal 的引用,但是卻傳入Monkey,這看起來(lái)似乎忘記了Monkey 的對(duì)象類型,那么為什么不直接把test類中的方法定義為void start(Monkey monkey),這樣看上去難道不會(huì)更直觀嗎。

直觀也許是它的優(yōu)點(diǎn),但是就會(huì)帶來(lái)其他問(wèn)題:Animal不止只有一個(gè)Monkey的導(dǎo)出類,這個(gè)時(shí)候來(lái)了個(gè)pig ,那么是不是就要再定義個(gè)方法為void start(Monkey monkey),重載用得挺溜嘛小伙子,但是未免太麻煩了。懶惰才是開(kāi)發(fā)人員的天性。

因此這樣就有了多態(tài)的產(chǎn)生

2.顯露優(yōu)勢(shì)

方法調(diào)用中分為 靜態(tài)綁定動(dòng)態(tài)綁定。何為綁定:將一個(gè)方法調(diào)用同一個(gè)方法主體關(guān)聯(lián)起來(lái)被稱作綁定。

  • 靜態(tài)綁定:又稱為前期綁定。是在程序執(zhí)行前進(jìn)行把綁定。我們平時(shí)聽(tīng)到"靜態(tài)"的時(shí)候,不難免想到static關(guān)鍵字,被static關(guān)鍵字修飾后的變量成為靜態(tài)變量,這種變量就是在程序執(zhí)行前初始化的。前期綁定是面向過(guò)程語(yǔ)言中默認(rèn)的綁定方式,例如 C 語(yǔ)言只有一種方法調(diào)用,那就是前期綁定。

引出思考:

public static void start(Animal animal) {
    animal.eat();
}復(fù)制代碼

start()方法中傳入的是Animal 的對(duì)象引用,如果有多個(gè)Animal的導(dǎo)出類,那么執(zhí)行eat()方法的時(shí)候如何知道調(diào)用哪個(gè)方法。如果通過(guò)前期綁定那么是無(wú)法實(shí)現(xiàn)的。因此就有了后期綁定。

  • 動(dòng)態(tài)綁定:又稱為后期綁定。是在程序運(yùn)行時(shí)根據(jù)對(duì)象類型進(jìn)行綁定的,因此又可以稱為運(yùn)行時(shí)綁定。而 Java 就是根據(jù)它自己的后期綁定機(jī)制,以便在運(yùn)行時(shí)能夠判斷對(duì)象的類型,從而調(diào)用正確的方法。

小結(jié):

Java 中除了 staticfinal 修飾的方法之外,都是屬于后期綁定

合理即正確

顯然通過(guò)動(dòng)態(tài)綁定來(lái)實(shí)現(xiàn)多態(tài)是合理的。這樣子我們?cè)陂_(kāi)發(fā)接口的時(shí)候只需要傳入 基類 的引用,從而這些代碼對(duì)所有 基類 的 導(dǎo)出類 都可以正確的運(yùn)行。

These days, if you say you know Java, you have to know polymorphism.

其中Monkey、Pig、Dog皆是Animal的導(dǎo)出類

Animal animal = new Monkey() 看上去不正確的賦值,但是上通過(guò)繼承,Monkey就是一種Animal,如果我們調(diào)用animal.eat()方法,不了解多態(tài)的小伙伴常常會(huì)誤以為調(diào)用的是Animaleat()方法,但是最終卻是調(diào)用了Monkey自己的eat()方法。

Animal作為基類,它的作用就是為導(dǎo)出類建立公用接口。所有從Animal繼承出去的導(dǎo)出類都可以有自己獨(dú)特的實(shí)現(xiàn)行為。

可擴(kuò)展性

有了多態(tài)機(jī)制,我們可以根據(jù)自己的需求對(duì)系統(tǒng)添加任意多的新類型,而不需要重載void start(Animal animal)方法。

在一個(gè)設(shè)計(jì)良好的OOP程序中,大多數(shù)或者所有方法都會(huì)遵循start()方法的模型,只與基類接口同行,這樣的程序就是具有可擴(kuò)展性的,我們可以通過(guò)從通用的基類繼承出新的數(shù)據(jù)類型,從而添加一些功能,那些操縱基類接口的方法就不需要任何改動(dòng)就可以應(yīng)用于新類。

失靈了?

我們先來(lái)復(fù)習(xí)一下權(quán)限修飾符:

##private√×××
  • public:所有類可見(jiàn)
  • protected:本類、本包和子類都可見(jiàn)
  • default:本類和本包可見(jiàn)
  • private:本類可見(jiàn)

私有方法帶來(lái)的失靈

復(fù)習(xí)完我們?cè)賮?lái)看一組代碼:

public class PrivateScope {    private void f() {
        System.out.println("PrivateScope f()");
    }    public static void main(String[] args) {
        PrivateScope p = new PrivateOverride();
        p.f();
    }
}class PrivateOverride extends PrivateScope {    private void f() {
        System.out.println("PrivateOverride f()");
    }
}/* OUTPUT
 PrivateScope f()
*/復(fù)制代碼

是否感到有點(diǎn)奇怪,為什么這個(gè)時(shí)候調(diào)用的f()是基類中定義的,而不像上面所述的那樣,通過(guò)動(dòng)態(tài)綁定,從而調(diào)用導(dǎo)出類PrivateOverride中定義的f()。不知道心細(xì)的你是否發(fā)現(xiàn),基類中f()方法的修飾是private。沒(méi)錯(cuò),這就是問(wèn)題所在,PrivateOverride中定義的f()方法是一個(gè)全新的方法,因?yàn)?code>private的緣故,對(duì)子類不可見(jiàn),自然也不能被重載。

結(jié)論

只有非 private 修飾的方法才可以被覆蓋

我們通過(guò) Idea 寫(xiě)代碼的時(shí)候,重寫(xiě)的方法頭上可以標(biāo)注@Override注解,如果不是重寫(xiě)的方法,標(biāo)注@Override注解就會(huì)報(bào)錯(cuò):

These days, if you say you know Java, you have to know polymorphism.

這樣也可以很好的提示我們非重寫(xiě)方法,而是全新的方法。

域帶來(lái)的失靈

當(dāng)小伙伴看到這里,就會(huì)開(kāi)始認(rèn)為所有事物(除private修飾)都可以多態(tài)地發(fā)生。然而現(xiàn)實(shí)卻不是這樣子的,只有普通的方法調(diào)用才可以是多態(tài)的。這邊是多態(tài)的誤區(qū)所在。

讓我們?cè)倏纯聪旅孢@組代碼:

class Super {    public int field = 0;    public int getField() {        return field;
    }
}class Son extends Super {    public int field = 1;    public int getField() {        return field;
    }    public int getSuperField() {        return super.field;
    }
}class FieldTest {    public static void main(String[] args) {
        Super sup = new Son();
        System.out.println("sup.field:" + sup.field + " sup.getField():" + sup.getField());

        Son son = new Son();
        System.out.println("son.field:" + son.field + " son.getField:" + son.getField() + " son.getSupField:" + son.getSuperField());
    }
}/* OUTPUT
sup.field:0 sup.getField():1
son.field:1 son.getField:1 son.getSupField:0
*/復(fù)制代碼

從上面代碼中我們看到sup.field輸出的值不是 Son 對(duì)象中所定義的,而是Super本身定義的。這與我們認(rèn)識(shí)的多態(tài)有點(diǎn)沖突。

These days, if you say you know Java, you have to know polymorphism.

其實(shí)不然,當(dāng)Super對(duì)象轉(zhuǎn)型為Son引用時(shí),任何域訪問(wèn)操作都將由編譯器解析,因此不是多態(tài)的。在本例中,為Super.fieldSon.field分配了不同的存儲(chǔ)空間,而Son類是從Super類導(dǎo)出的,因此,Son實(shí)際上是包含兩個(gè)稱為field的域:它自己的+Super。

雖然這種問(wèn)題看上去很令人頭痛,但是我們開(kāi)發(fā)規(guī)范中,通常會(huì)將所有的域都設(shè)置為 private,這樣就不能直接訪問(wèn)它們,只能通過(guò)調(diào)用方法來(lái)訪問(wèn)。

static 帶來(lái)的失靈

看到這里,小伙伴們應(yīng)該對(duì)多態(tài)有個(gè)大致的了解,但是不要掉以輕心哦,還有一種情況也是會(huì)出現(xiàn)失靈的,那就是如果某個(gè)方法是靜態(tài)的,那么它的行為就不具有多態(tài)性。

老規(guī)矩,我們看下這組代碼:

class StaticSuper {    public static void staticTest() {
        System.out.println("StaticSuper staticTest()");
    }

}class StaticSon extends StaticSuper{    public static void staticTest() {
        System.out.println("StaticSon staticTest()");
    }

}class StaticTest {    public static void main(String[] args) {
        StaticSuper sup = new StaticSon();
        sup.staticTest();
    }
}/* OUTPUT
StaticSuper staticTest()
*/復(fù)制代碼

靜態(tài)方法是與類相關(guān)聯(lián),而非與對(duì)象相關(guān)聯(lián)

3.構(gòu)造器與多態(tài)

首先我們需要明白的是構(gòu)造器不具有多態(tài)性,因?yàn)闃?gòu)造器實(shí)際上是static方法,只不過(guò)該static的聲明是隱式的。

我們先回到開(kāi)頭的那段神秘代碼:

These days, if you say you know Java, you have to know polymorphism.

其中輸出結(jié)果是:

/*
    polygon() before cal()
    square.cal(), border = 0
    polygon() after cal()
    square.square(), border = 4
*/復(fù)制代碼

我們可以看到先輸出的是基類polygon中構(gòu)造器的方法。

這是因?yàn)榛惖臉?gòu)造器總是在導(dǎo)出類的構(gòu)造過(guò)程中被調(diào)用,而且是按照繼承層次逐漸向上鏈接,以使每個(gè)基類的構(gòu)造器都能得到調(diào)用。

These days, if you say you know Java, you have to know polymorphism.

因?yàn)闃?gòu)造器有一項(xiàng)特殊的任務(wù):檢查對(duì)象是否能正確的被構(gòu)造。導(dǎo)出類只能訪問(wèn)它自己的成員,不能訪問(wèn)基類的成員(基類成員通常是private類型)。只有基類的構(gòu)造器才具有權(quán)限來(lái)對(duì)自己的元素進(jìn)行初始化。因此,必須令所有構(gòu)造器都得到調(diào)用,否則就不可能正確構(gòu)造完整對(duì)象。

步驟如下:

  • 調(diào)用基類構(gòu)造器,這個(gè)步驟會(huì)不斷的遞歸下去,首先是構(gòu)造這種層次結(jié)構(gòu)的根,然后是下一層導(dǎo)出類,...,直到最底層的導(dǎo)出類
  • 按聲明順序調(diào)用成員的初始化方法
  • 調(diào)用導(dǎo)出類構(gòu)造其的主體

打個(gè)不是特別恰當(dāng)?shù)谋确剑?em>你的出現(xiàn)是否先要有你父親,你父親的出現(xiàn)是否先要有你的爺爺,這就是逐漸向上鏈接的方式

構(gòu)造器內(nèi)部的多態(tài)行為

有沒(méi)有想過(guò)如果在一個(gè)構(gòu)造器的內(nèi)調(diào)用正在構(gòu)造的對(duì)象的某個(gè)動(dòng)態(tài)綁定方法,那么會(huì)發(fā)生什么情況呢? 動(dòng)態(tài)綁定的調(diào)用是在運(yùn)行時(shí)才決定的,因?yàn)閷?duì)象無(wú)法知道它是屬于方法所在的那個(gè)類還是那個(gè)類的導(dǎo)出類。如果要調(diào)用構(gòu)造器內(nèi)部的一個(gè)動(dòng)態(tài)綁定方法,就要用到那個(gè)方法的被覆蓋后的定義。然而因?yàn)楸桓采w的方法在對(duì)象被完全構(gòu)造之前就會(huì)被調(diào)用,這可能就會(huì)導(dǎo)致一些難于發(fā)現(xiàn)的隱藏錯(cuò)誤。

問(wèn)題引索

一個(gè)動(dòng)態(tài)綁定的方法調(diào)用會(huì)向外深入到繼承層次結(jié)構(gòu)內(nèi)部,它可以調(diào)動(dòng)導(dǎo)出類里的方法,如果我們是在構(gòu)造器內(nèi)部這樣做,那么就可能會(huì)調(diào)用某個(gè)方法,而這個(gè)方法做操縱的成員可能還未進(jìn)行初始化,這肯定就會(huì)招致災(zāi)難的。

敏感的小伙伴是不是想到了開(kāi)頭的那段代碼:

These days, if you say you know Java, you have to know polymorphism.

輸出結(jié)果是:

/*
    polygon() before cal()
    square.cal(), border = 0
    polygon() after cal()
    square.square(), border = 4
*/復(fù)制代碼

我們?cè)谶M(jìn)行square對(duì)象初始化的時(shí)候,會(huì)先進(jìn)行polygon對(duì)象的初始化,在polygon構(gòu)造器中有個(gè)cal()方法,這個(gè)時(shí)候就采用了動(dòng)態(tài)綁定機(jī)制,調(diào)用了squarecal(),但這個(gè)時(shí)候border這個(gè)變量尚未進(jìn)行初始化,int 類型的默認(rèn)值為 0,因此就有了square.cal(), border = 0的輸出??吹竭@里,小伙伴們是不是有種撥開(kāi)云霧見(jiàn)青天的感覺(jué)!

這組代碼初始化的實(shí)際過(guò)程為:

  • 在其他任何事物發(fā)生之前,將分配給對(duì)象的存儲(chǔ)空間初始化成二進(jìn)制的零
  • 調(diào)用基類構(gòu)造器時(shí),會(huì)調(diào)用被覆蓋后的cal()方法,由于步驟1的緣故,因此 border 的值為 0
  • 按照聲明的順序調(diào)用成員的初始化方法
  • 調(diào)用導(dǎo)出類的構(gòu)造器主體

不知道下次又會(huì)做什么樣的夢(mèng)~

These days, if you say you know Java, you have to know polymorphism.

想了解更多編程學(xué)習(xí),敬請(qǐng)關(guān)注php培訓(xùn)欄目!

The above is the detailed content of These days, if you say you know Java, you have to know polymorphism.. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

PHP Tutorial
1502
276
How to handle transactions in Java with JDBC? How to handle transactions in Java with JDBC? Aug 02, 2025 pm 12:29 PM

To correctly handle JDBC transactions, you must first turn off the automatic commit mode, then perform multiple operations, and finally commit or rollback according to the results; 1. Call conn.setAutoCommit(false) to start the transaction; 2. Execute multiple SQL operations, such as INSERT and UPDATE; 3. Call conn.commit() if all operations are successful, and call conn.rollback() if an exception occurs to ensure data consistency; at the same time, try-with-resources should be used to manage resources, properly handle exceptions and close connections to avoid connection leakage; in addition, it is recommended to use connection pools and set save points to achieve partial rollback, and keep transactions as short as possible to improve performance.

Understanding the Java Virtual Machine (JVM) Internals Understanding the Java Virtual Machine (JVM) Internals Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

How to work with Calendar in Java? How to work with Calendar in Java? Aug 02, 2025 am 02:38 AM

Use classes in the java.time package to replace the old Date and Calendar classes; 2. Get the current date and time through LocalDate, LocalDateTime and LocalTime; 3. Create a specific date and time using the of() method; 4. Use the plus/minus method to immutably increase and decrease the time; 5. Use ZonedDateTime and ZoneId to process the time zone; 6. Format and parse date strings through DateTimeFormatter; 7. Use Instant to be compatible with the old date types when necessary; date processing in modern Java should give priority to using java.timeAPI, which provides clear, immutable and linear

Comparing Java Frameworks: Spring Boot vs Quarkus vs Micronaut Comparing Java Frameworks: Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMoryusage, Quarkusandmicronautleadduetocompile-Timeprocessingandgraalvsupport, Withquarkusoftenperforminglightbetterine ServerLess scenarios.2.Thyvelopecosyste,

How does garbage collection work in Java? How does garbage collection work in Java? Aug 02, 2025 pm 01:55 PM

Java's garbage collection (GC) is a mechanism that automatically manages memory, which reduces the risk of memory leakage by reclaiming unreachable objects. 1.GC judges the accessibility of the object from the root object (such as stack variables, active threads, static fields, etc.), and unreachable objects are marked as garbage. 2. Based on the mark-clearing algorithm, mark all reachable objects and clear unmarked objects. 3. Adopt a generational collection strategy: the new generation (Eden, S0, S1) frequently executes MinorGC; the elderly performs less but takes longer to perform MajorGC; Metaspace stores class metadata. 4. JVM provides a variety of GC devices: SerialGC is suitable for small applications; ParallelGC improves throughput; CMS reduces

Understanding Network Ports and Firewalls Understanding Network Ports and Firewalls Aug 01, 2025 am 06:40 AM

Networkportsandfirewallsworktogethertoenablecommunicationwhileensuringsecurity.1.Networkportsarevirtualendpointsnumbered0–65535,withwell-knownportslike80(HTTP),443(HTTPS),22(SSH),and25(SMTP)identifyingspecificservices.2.PortsoperateoverTCP(reliable,c

go by example defer statement explained go by example defer statement explained Aug 02, 2025 am 06:26 AM

defer is used to perform specified operations before the function returns, such as cleaning resources; parameters are evaluated immediately when defer, and the functions are executed in the order of last-in-first-out (LIFO); 1. Multiple defers are executed in reverse order of declarations; 2. Commonly used for secure cleaning such as file closing; 3. The named return value can be modified; 4. It will be executed even if panic occurs, suitable for recovery; 5. Avoid abuse of defer in loops to prevent resource leakage; correct use can improve code security and readability.

Comparing Java Build Tools: Maven vs. Gradle Comparing Java Build Tools: Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

See all articles
<li id="axke4"></li>

ScopeCurrent classUse a packageDescendant classesOther packages
public
protected×
default××