internet pencereler Android

Java'da hangi erişim değiştiricileri var? Erişim değiştiricileri

Burada, erişim değiştiricileri kullanmanın neredeyse tüm durumlarını ele almaya çalışacağız. Tek istisna, iç içe ( yuvalanmış) ve dahili ( ) sınıflar ve arayüzler için, bu konuları henüz düşünmediğimiz için.

Erişim değiştiricilerle birlikte kullanılan sınıflar ve paketler, kapsülleme araçları, yani uygulama ayrıntılarını basit bir arabirimin arkasına gizleme aracı olarak hizmet eder.

Erişim değiştiricileri hem sınıflara hem de üyelerine - alanlara ve yöntemlere - uygulanabilir. Toplamda dört erişim değiştiricisi vardır ve burada bunların kısa bir açıklamasını vereceğiz, sonra her birini ayrıntılı olarak ele alacağız.

  • halka açık- olarak bildirilen herhangi bir bileşen halka açık, herhangi bir koddan erişilebilir
  • korumalı- paket içindeki bileşene ve alt sınıfların sınıflarına erişime izin verir
  • özel- sınıf içindeki bileşenlere erişime izin verir
  • varsayılan(anahtar kelime yok) - paket içindeki bileşenlere erişime izin verir

Miras alınan sınıflar, bir sınıftan miras alınan sınıflardır. Henüz kalıtım çalışmadık.

Sınıflara erişim

Varsayılan olarak, üst düzey sınıflar tanımlandıkları pakette mevcuttur.... Ancak, üst düzey sınıf olarak bildirilirse halka açık o zaman her yerde (veya paketin kendisinin mevcut olduğu her yerde) kullanılabilir. Sınıflar diğer sınıfların üyesi olarak bildirilebileceğinden, bu ifadeyi üst düzey sınıflarla sınırladık. Bu iç sınıflar, sınıfın üyeleri olduğundan, sınıf üyelerine erişimi denetleme kurallarına uyarlar..

Sınıf üyelerine erişme

Sınıfın üyeleri her zaman sınıfın gövdesinde bulunur. Varsayılan sınıf üyeleri, sınıfın tanımlandığı pakette de mevcuttur..

Genel değiştirici

Yuvalanmamış bir sınıf için, iki olası erişim seviyesinden yalnızca biri belirtilebilir: verilen varsayılan ve halka açık . Sınıf olarak bildirildiğinde halka açık, tek olmalı halka açık dosyada belirtilen sınıf ve dosya adı, sınıf adıyla eşleşmelidir.

Nasıl halka açık sınıflar, alanlar, yöntemler ve yapıcılar bildirilebilir.

Korumalı değiştirici

Sınıf mirası konusunda bu değiştiriciye daha yakından bakacağız. Kalıtım kullanılmazsa, bu değiştirici tıpkı varsayılan değiştirici gibi çalışır.

Şimdi kısaca söylenebilecek tek şey, şu şekilde bildirilen bileşenlerin korumalı erişime sahip olacak herhangi bir paketten herhangi bir alt sınıf veya aynı paketteki herhangi bir sınıf.

Nasıl korumalı alanlar, yöntemler, yapıcılar, iç içe sınıflar ve iç içe arabirimler bildirilebilir.

korumalı .

Özel değiştirici

Bu, erişim kısıtlaması açısından en kısıtlayıcı değiştiricidir. olarak beyan edilen öğeler özel yalnızca aynı sınıf içinde erişilebilir ve sınıf dışında hiç kimse tarafından erişilebilir.

Nasıl özel alanlar, yöntemler, yapıcılar, iç içe sınıflar ve iç içe arabirimler bildirilebilir.

Üst düzey sınıflar ve arabirimler olarak bildirilemez özel .

Temel olarak, erişim değiştiricileri basit bir konudur, ancak onlara daha sonra geri döneceğiz. Sadece bir tanıdık iken. Ve şimdi biraz pratik...

pro.java.pkg002 paketine ait Mod02.java, DefMod.java, ProMod.java ve PrvMod.java sınıfları ile pro.java.pkg003 paketine ait PubMod.java sınıfını oluşturdum. Daha sonra bu sınıfların ekran görüntülerini ve programın sonucunu vereceğim:

Değiştiriciler hakkında konuşacağız: değiştiriciler, kapsamlar, sınıflar için değiştiriciler, alanlar, yöntemler nelerdir. Bence sıkıcı olmayacak.

Java'daki değiştiriciler Bir sınıf, sınıf alanı veya yönteme belirli özellikler veren anahtar sözcüklerdir.

Bir sınıfın yöntemlerinin ve alanlarının görünürlüğünü belirtmek için 4 erişim değiştiricisi vardır:

  • özel sınıfın üyelerine yalnızca sınıf içinde erişilebilir;
  • paket-özel veya varsayılan (varsayılan) sınıf üyeleri paketin içinde görünür;
  • korumalı sınıf üyeleri paketin içinde ve türetilmiş sınıflarda bulunur;
  • halka açık sınıf üyeleri herkese açıktır.

Hatırlarsanız, sonunda Cat sınıfını içe aktardığımızda hala bir derleme hatasıyla karşılaştık.

Mesele şu ki, alanlarımıza ve yöntemlerimize herhangi bir erişim değiştiricisi kaydetmedik ve bunların varsayılan bir özelliği var (sınıf üyeleri paketin içinde görülebilir). Kodumuzun derleme hatasını düzeltmek ve sonunda çalıştırmak için yapıcımızı ve yöntemlerimizi herkese açık hale getirmemiz gerekiyor. Daha sonra diğer paketlerden çağrılabilirler.

Merak etmeye başlayabilirsiniz: Bütün bunlar ne için? Neden kodu herhangi bir paket veya sınıftan görünür hale getirmiyorsunuz, ancak erişimi farklılaştırmanız gerekiyor? Karmaşık ve hantal projeler yazma zamanı geldiğinde bu sorular kendiliğinden kaybolacaktır. Şimdi, işlevselliği bir veya iki sınıfla sınırlı uygulamalar yazdığımızda, bir şeyi sınırlamanın bir anlamı yok gibi görünüyor.

Bir ürün nesnesini görüntüleyen bir sınıfınız olduğunu hayal edin. Örneğin bir araba. Arabanın bir fiyatı olabilir. Bir fiyat alanı ve diğer birçok alan, işlevsellikten sorumlu bir dizi yöntem yarattınız. Her şey iyi görünüyor. Sınıf arabanız büyük bir projenin parçası ve herkes mutlu. Ama diyelim ki birisi yanlışlıkla veya bilerek araba sınıfını somutlaştırdı ve negatif bir fiyat belirledi. Bir ürünün fiyatı nasıl negatif olabilir? Bu çok ilkel bir örnek ve gerçek hayatta olması pek mümkün değil ama bence fikir açık. Bazen doğrudan değil, belirli yöntemlerle erişim vermeniz gerekir. Diğer kodun işlevselliğinden kod sorumlu olabilir ve birisinin sizin bir parçanızı değiştirmesini ve düzenlemesini istemiyor olabilirsiniz. Bütün bunlar için bir erişim kısıtlaması var.

Yapıcılar, yöntemler ve alanlar herhangi bir erişim değiştiricisine sahip olabilir. Bir sınıf yalnızca genel veya varsayılan olabilir ve bir dosyada yalnızca bir genel sınıf olabilir.

Şimdilik erişim değiştiriciler hakkında yeterince bilgi olacak. "Nesneye Yönelik Programlama" makalesinde onlar hakkında daha ayrıntılı olarak konuşacağız, ancak şimdi bu arada, çok fazla olan diğer değiştiriciler hakkında konuşalım.

Şimdi bir sonraki değiştirici statik... Yuvalanmış bir sınıf bildirmek istediğimizde bir yöntemin, alanın ve hatta bir sınıfın önünde kullanılabilir. Java'da sınıfları diğer sınıfların içine yazabilirsiniz ve sınıf içindeki sınıfın önündeki değiştirici statik ise, o zaman böyle bir sınıfa iç içe denir, başka bir değiştirici varsa veya varsayılan olarak böyle bir sınıfa dahili denir. İç içe ve iç sınıflar hakkında ayrı bir makale olacak, çünkü orada her şey o kadar basit değil.

Bir yöntemin veya alanın önündeki statik değiştirici, bunların bu sınıfın bir örneğine ait olmadığını gösterir. Bu bizim için ne anlama geliyor? Bir sınıf alanını veya yöntemini statik olarak tanımladığımızda, sınıfın bir örneği kullanılmadan çağrılabilir. Yani bu yapı yerine: Cat cat = new Cat(); cat.method (), sadece Cat.method () yazabilirsiniz. Yöntemin statik olarak bildirilmesi şartıyla. Statik değişkenler, sınıfın tüm nesneleri için aynıdır. Onların bir bağlantısı var.

    public class Değiştiriciler (

    static int başkaStaticField = 5;

    public static void myStaticMethod() (

    someField = "Benim alanım";

    // nonStaticField = ""; Derleme Hatası

    // statik olmayan alanlar kullanılamaz

    // statik yöntemlerde

    public void myNonStaticMethod() (

    başkaStaticField = 4; // statik alanlar kullanılabilir

    // statik olmayan yöntemlerde

    // ana yöntemin ayrıca statik bir değiştiricisi vardır

    yeni Değiştiriciler () .myNonStaticMethod();

    Modificators.myStaticMethod(); // statik yöntemleri ve alanları çağır

    // classname.method aracılığıyla

Statik değiştiriciler hakkında dikkat edilmesi gereken bir diğer önemli nokta, statik alanların sınıf yükleme zamanında başlatılmasıdır. Genellikle çeşitli Java testlerinde aşağıdaki kodu bulabilirsiniz:

Soru: Konsolda ne görüntülenecek? Herhangi bir senaryoda ilk önce statik bloğun görüntüleneceği unutulmamalıdır. Sonraki varsayılan blok olacaktır. Ardından, konsol ekranına bakın:

Bakacağımız bir sonraki değiştirici nihai.

Bence final kelimesi kendisi için konuşur. Nihai değiştiriciyi uygulayarak, alanların değiştirilemeyeceğini, yöntemlerin geçersiz kılındığını ve sınıfların miras alınamayacağını söylüyorsunuz (miras hakkında ayrı bir makale olacak). Bu değiştirici yalnızca sınıflar, yöntemler ve değişkenler için geçerlidir (yerel değişkenler için de).

OOP makalesinde yöntem ve sınıfların son değiştiricisinden bahsedeceğiz.

Ardından, yeni başlayanlar veya bu makale dizisini sıfırdan okuyanlar için çok net olmayacak değiştiriciler olacak. Ve hala size her şeyi açıklayamasam da (birlikte verilen materyali bilmediğiniz için), yine de onlara aşina olmanızı tavsiye ediyorum. Bu değiştiricileri kullanma zamanı geldiğinde, aşağıda kullanılan terimlerin çoğunu zaten anlayacaksınız.

değiştirici senkronize- yöntemin aynı anda yalnızca bir iş parçacığı tarafından kullanılabileceğini belirtir. Bu size hiçbir şey söylemese de, çoklu iş parçacığı hakkında bilgi edindikçe bu değiştiricinin kullanışlılığı görülecektir.

değiştirici geçici- nesne serileştirme sırasında bazı alanların yok sayılması gerektiğini söylüyor. Tipik olarak, bu alanlar ara değerleri depolar.

değiştirici uçucu- çoklu kullanım sırasında kullanılır. Uçucu değiştiriciye sahip bir alan birden fazla iş parçacığı tarafından kullanıldığında ve değiştirildiğinde, bu değiştirici, alanın sırayla değişmesini ve onunla karışıklık olmamasını sağlar.

değiştirici yerli Yöntem bildiriminden önce, yöntemin başka bir programlama dilinde yazıldığını belirtir. Genellikle C'de.

değiştirici katı fp- Float ve double (kayan nokta) tipi sayılar üzerinde IEEE 754 standardına göre işlem yapılmasını sağlar.Ya da daha basit bir ifadeyle bir metot dahilinde hesaplama sonuçlarının tüm platformlarda aynı olacağını garanti eder.

Henüz değiştirici hakkında konuşmadım Öz... Size kısaca bundan bahsedeceğim, çünkü nesne yönelimli programlamanın temelleri hakkında bilgi sahibi olmadan bundan bahsetmenin bir anlamı yok.

Soyut değiştiriciye sahip bir sınıf somutlaştırılamaz. Bunun tek amacı genişletmektir. Soyut bir sınıf, hem soyut yöntemleri hem de sıradan yöntemleri içerebilir.

OOP makalesinde soyut değiştirici hakkında daha fazla konuşacağız.

Bu, değiştiriciler hakkındaki makaleyi tamamlar. Onlar hakkında çok şey söylenmedi. Ancak bunun nedeni henüz OOP konseptlerimizin olmamasıdır. Birkaç makale daha, değiştiriciler hakkında bilgi ekleyeceğiz ve boşlukları dolduracağız.

Değerleri değiştirmek için başlatma sırasında eklediğiniz. Java dilinin çok çeşitli değiştiricileri vardır, bunlardan başlıcaları şunlardır:

  • erişim değiştiricileri;
  • erişim için kullanılmayan sınıf, yöntem, değişken ve akış değiştiricileri.

Java'da bir değiştirici kullanmak için, anahtar kelimesini bir sınıf, yöntem veya değişken tanımına dahil etmeniz gerekir. Değiştirici, aşağıdaki örneklerde gösterildiği gibi, ifadenin geri kalanının önünde olmalıdır:

Genel sınıf className (// ...) özel boolean myFlag; statik son çift hafta = 9,5; korumalı statik final int BOXWIDTH = 42; public static void main (Dize bağımsız değişkenleri) (// yöntem gövdesi)

Erişim değiştiricileri

Java, sınıflar, değişkenler, yöntemler ve yapıcılar için erişim düzeylerini ayarlamak için bir dizi erişim değiştiricisi sağlar. Dört erişim noktası vardır:

  • Pakette görünür (varsayılan ve değiştirici gerekmez).
  • Yalnızca sınıf için görünür (özel).
  • Herkese görünür (genel).
  • Pakete ve tüm alt sınıflara görünür (korumalı).

Varsayılan erişim değiştiricisi anahtar sözcük değildir

Varsayılan erişim değiştiricisi- Java'da bir sınıf, alan, yöntem vb. için açıkça bir erişim değiştiricisi bildirmediğimiz anlamına gelir.

Erişim denetimi değiştiricisi olmadan bildirilen bir değişken veya yöntem, aynı paketteki başka herhangi bir sınıf tarafından kullanılabilir. Bir arabirimdeki alanlar dolaylı olarak geneldir, statik, nihaidir ve arabirimdeki yöntemler varsayılan olarak geneldir.

Örnek

Değişkenler ve yöntemler, aşağıdaki örnekte gösterildiği gibi, Java'da herhangi bir değiştirici olmadan bildirilebilir:

Dizi sürümü = "1.5.1"; boolean processOrder () (true true;)

Özel erişim değiştiricisi

Özel değiştirici- Java'da özel olarak bildirilen yöntemlere, değişkenlere ve oluşturuculara yalnızca bildirilen sınıfın içinden erişilebilir.

Özel erişim değiştiricisi, en kısıtlayıcı erişim düzeyidir. Sınıf ve arayüzler özel olamaz.

Özel olarak bildirilen değişkenlere, alıcı genel yöntemler sınıfta mevcutsa, sınıfın dışında erişilebilir (bir örnek ve açıklama için aşağıya bakın).

Java'da özel değiştiriciyi kullanmak, verileri gizlemenin ana yoludur.

Örnek

Aşağıdaki sınıf özel erişim denetimi kullanır:

Genel sınıf Kaydedici (özel Dize biçimi; genel Dize getFormat () (bu. biçimi döndür;) genel geçersiz setFormat (Dize biçimi) (this.format = biçim;))

Burada değişken biçim sınıf Ağaç kesicisiözeldir, bu nedenle diğer sınıfların değerini doğrudan alması ve ayarlaması mümkün değildir.

Bu nedenle, bu değişkeni her şey için kullanılabilir hale getirmek için iki genel yöntem tanımladık: getFormat () hangi değeri döndürür biçim, ve setFormat (Dize) hangi onun değerini ayarlar.

Genel erişim değiştiricisi

Genel değiştirici- sınıf, yöntem, kurucu, arayüz vb. ilan edilen public'e başka herhangi bir sınıftan erişilebilir. Bu nedenle, bir public sınıf içinde bildirilen alanlara, yöntemlere, bloklara Java evrenine ait herhangi bir sınıftan erişilebilir.

Ancak başka bir paketteki bir public sınıfa erişmeye çalışırsak, public sınıfın import edilmesi gerekir.

Sınıf mirası nedeniyle, Java'da bir sınıfın tüm genel yöntemleri ve değişkenleri, alt sınıfları tarafından miras alınır.

Örnek

Aşağıdaki işlev, genel erişim kontrolünü kullanır:

Public static void main (Dize argümanları) (// ...)

Yöntem ana () halka açık olmalıdır. Aksi takdirde, sınıfı çalıştırmak için Java yorumlayıcısı tarafından çağrılamaz.

Korumalı erişim değiştiricisi

Korumalı değiştirici- bir üst sınıfta korumalı olarak bildirilen değişkenler, yöntemler ve oluşturuculara yalnızca başka bir paketteki alt sınıflar veya korumalı bir sınıf paketindeki herhangi bir sınıf için erişilebilir.

Java'daki korumalı erişim değiştiricisi, sınıfa ve arabirimlere uygulanamaz. Yöntemler ve alanlar korumalı olarak bildirilebilir, ancak bir arabirimdeki yöntemler ve alanlar korumalı olarak bildirilemez.

Korumalı erişim, bir alt sınıfa yardımcı bir yöntem veya değişken kullanma yeteneği vererek alakasız bir sınıfın onu kullanmaya çalışmasını engeller.

Örnek

Aşağıdaki üst sınıf, alt sınıfının yöntemi geçersiz kılması için korumalı erişim denetimlerini kullanır. açıkHoparlör ():

AudioPlayer sınıfı (korumalı boolean openSpeaker (Speaker sp) (// uygulama detayları)) class StreamingAudioPlayer (boolean openSpeaker (Speaker sp) (// uygulama detayları))

Ayrıca, bir yöntem tanımlarsak açıkHoparlör () korumalı olarak, AudioPlayer dışındaki herhangi bir sınıftan erişilebilir olmayacaktır. Herkese açık olarak tanımlarsak, herkesin kullanımına açık hale gelecektir. Ancak amacımız bu yöntemi yalnızca alt sınıfa göstermektir, bu yüzden korumalı değiştiriciyi kullandık.

Erişim denetimi ve devralma kuralları

Java'da aşağıdaki kurallar, devralınan yöntemler için geçerlidir:

  • Bir üst sınıfta public olarak tanımlanan metotlar, tüm alt sınıflarda da public olmalıdır.
  • Bir üst sınıfta korumalı olarak bildirilen yöntemler, korumalı veya alt sınıflarında genel olmalıdır; özel olamazlar.
  • Private olarak tanımlanan metotlar herkes için kalıtsal değildir, dolayısıyla onlar için bir kural yoktur.

Erişim için kullanılmayan sınıf, yöntem, değişken ve akış değiştiricileri

Java, erişim için değil, diğer birçok işlevi uygulamak için bir dizi değiştirici sağlar:

  • değiştirici statik yöntemler ve sınıf değişkenleri oluşturmak için kullanılır;
  • değiştirici son sınıfların, yöntemlerin ve değişkenlerin uygulanmasını tamamlamak için kullanılır;
  • değiştirici Öz soyut sınıflar ve yöntemler oluşturmak için gerekli;
  • değiştiriciler senkronize ve uçucu Java'da akışlar için kullanılır.

Statik değiştirici

Statik değiştirici- yöntemler ve sınıf değişkenleri oluşturmak için kullanılır.

Statik değişkenler

Statik anahtar kelime, sınıf için oluşturulan tüm örneklerden bağımsız olarak var olacak değişkenler oluşturmak için kullanılır. Sınıfın örneklerinin sayısından bağımsız olarak Java'da statik bir değişkenin yalnızca bir kopyası vardır.

Statik değişkenler, sınıf değişkenleri olarak da bilinir. Java'da yerel değişkenler statik olarak bildirilemez.

Statik yöntemler

Statik anahtar sözcük, sınıf için oluşturulan tüm örneklerden bağımsız olarak var olacak yöntemler oluşturmak için kullanılır.

Java'da statik yöntemler veya statik yöntemler, herhangi bir sınıf nesnesinin örnek değişkenlerini kullanmaz, bunlar tanımlanır. Statik yöntemler parametrelerden tüm verileri alır ve bu parametrelerin bazıları değişkenlere referans olmadan değerlendirilir.

Bir sınıfın değişkenlerine ve yöntemlerine, ardından bir nokta gelen sınıf adı ve değişken veya yöntemin adı kullanılarak erişilebilir.

Örnek

Java'daki statik değiştirici, aşağıdaki örnekte gösterildiği gibi sınıf yöntemleri ve değişkenleri oluşturmak için kullanılır:

Genel sınıf InstanceCounter (özel static int numInstances = 0; korumalı statik int getCount () (dönüş numInstances;) özel static void addInstance () (numInstances ++;) InstanceCounter () (InstanceCounter.addInstance ();) genel statik void ana ( Dize argümanları ) (System.out.println ("Başlangıçta" + InstanceCounter.getCount () + "örnek"); for (int i = 0; i

Aşağıdaki çıktıyı alacaksınız:

0 örnekten başlayarak 500 örnek oluşturuldu

Son değiştirici

Son değiştirici- sınıfların, yöntemlerin ve değişkenlerin uygulanmasını tamamlamak için kullanılır.

Son değişkenler

Son bir değişken yalnızca bir kez başlatılabilir. Final olarak bildirilen bir referans değişkeni, başka bir nesneye atıfta bulunmak için asla atanamaz.

Ancak, nesnenin içindeki veriler değiştirilebilir. Böylece nesnenin durumu değiştirilebilir, ancak referans değiştirilemez.

Java'daki değişkenlerle, son değiştirici genellikle bir sınıf değişkenini sabit yapmak için statik ile birlikte kullanılır.

Örnek

public class Test (son int değeri = 10; // Aşağıda sabit bildirim örnekleri verilmiştir: public static final int BOXWIDTH = 6; static final String TITLE = "(! LANG: Yönetici"; public void changeValue(){ value = 12; //будет получена ошибка } } !}

Son yöntemler

Son yöntem herhangi bir alt sınıf tarafından geçersiz kılınamaz. Daha önce belirtildiği gibi, Java'da son değiştirici, bir yöntemin alt sınıfta değiştirilmesini engeller.

Yöntemi nihai hale getirmekteki temel amaç, yöntemin içeriğinin yan tarafa değiştirilmemesidir.

Örnek

Bir sınıf bildiriminde son değiştiriciyi kullanan bir yöntemin bildirimi aşağıdaki örnekte gösterilmiştir:

Genel sınıf Testi (public final void changeName () (// yöntem gövdesi))

son sınıf

Java'da final olarak bildirilen bir sınıfı kullanmanın temel amacı, sınıfın alt sınıflanmasını önlemektir. Bir sınıf final olarak işaretlenmişse, hiçbir sınıf son sınıftan herhangi bir işlevi miras alamaz.

Örnek

public final class Testi (// class body)

Soyut değiştirici

Soyut değiştirici- soyut sınıflar ve yöntemler oluşturmak için kullanılır.

soyut sınıf

Soyut sınıf somutlaştıramaz. Bir sınıf soyut olarak bildirilirse, tek amacı genişletmektir.

Bir sınıf hem soyut hem de final olamaz, çünkü bir final sınıfı genişletilemez. Sınıf soyut yöntemler içeriyorsa, soyut olarak bildirilmelidir. Aksi takdirde derleme hatası oluşacaktır.

Soyut bir sınıf, hem soyut yöntemleri hem de sıradan yöntemleri içerebilir.

Örnek

soyut sınıf Caravan (özel çift fiyat; özel Dize modeli; özel Dize yılı; genel soyut void goFast (); // soyut yöntem, genel soyut void changeColor ();)

soyut yöntem

Soyut bir yöntem, herhangi bir uygulama ile bildirilen bir yöntemdir. Yöntemin gövdesi (uygulama) alt sınıf tarafından sağlanır. Soyut yöntemler asla nihai veya katı olamaz.

Soyut bir sınıfı genişleten herhangi bir sınıf, alt sınıf soyut bir sınıf olmadığı sürece, üst sınıfın tüm soyut yöntemlerini uygulamalıdır.

Java'daki bir sınıf bir veya daha fazla soyut yöntem içeriyorsa, sınıf soyut olarak bildirilmelidir. Soyut bir sınıfın soyut yöntemler içermesi gerekmez.

Soyut bir yöntem noktalı virgülle biter. Örnek: genel soyut örnek ();

Örnek

genel soyut sınıf SüperSınıf (soyut geçersiz m (); // soyut yöntem) sınıfı AltSınıf SüperSınıf'ı genişletir (// void m soyut yöntemini uygular () (.........))

Senkronize değiştirici

Senkronize değiştirici

synchronized anahtar sözcüğü, bir yönteme aynı anda yalnızca bir iş parçacığı tarafından erişilebileceğini belirtmek için kullanılır. Java'da, senkronize değiştirici, dört erişim seviyesi değiştiricisinden herhangi biri ile uygulanabilir.

Örnek

public synchronized void showDetails () (.......)

geçici değiştirici

Geçici olarak işaretlenen bir örnek değişkeni, Java sanal makinesine (JVM) onu içeren nesneyi serileştirirken belirtilen değişkeni atlamasını söyler.

Bu değiştirici, önceki sınıfın bir değişkenini veya değişkenin veri türünü oluşturan ifadeye dahil edilir.

Örnek

genel geçici int limiti = 55; // public int b; // devam edecek

uçucu değiştirici

uçucu değiştirici- Java'da akışlar için kullanılır.

Java'da volatile değiştiricisi, JVM'nin değişken erişim iş parçacığının her zaman değişkenin kendi kopyasını bellekteki ana kopyayla birleştirmesi gerektiğini bilmesini sağlamak için kullanılır.

Geçici bir değişkene erişmek, bellekteki tüm önbelleğe alınmış kopyalanmış değişkenleri senkronize eder. Uçucu, yalnızca nesne veya özel türündeki örnek değişkenlere uygulanabilir. Uçucu bir nesneye yapılan başvuru boş olabilir.

Örnek

genel sınıf MyRunnable, Runnable'ı uygular (özel geçici boolean etkin; genel geçersiz çalıştırma () (etkin = doğru; while (etkin) (// satır 1 // burada bazı kodlar)) genel geçersiz durdurma () (etkin = yanlış; // satır 2))

Tipik olarak, run () bir iş parçacığında çağrılır (ilk kez Java'da Runnable kullanılarak) ve stop () başka bir iş parçacığından çağrılır. 1. satır önbelleğe alınmış bir aktif değer kullanıyorsa, 2. satırda aktif false olarak ayarlayana kadar döngü duramaz.

Bir sonraki derste Java dilinde kullanılan temel operatörleri tartışacağız. Bu bölüm, uygulama geliştirme sırasında bunları nasıl kullanabileceğinize ilişkin bir genel bakış sağlayacaktır.

Programın hangi bölümlerinin sınıf üyelerine erişebileceğini kontrol etmek mümkündür. Erişim denetimi, kötüye kullanımın önlenmesine yardımcı olur. Yalnızca sınıfın kendi içinde çalışması gereken tek bir değişkene veya sınıf yöntemine erişim her zaman istenmez.

Erişim yöntemi belirlenir erişim değiştirici, bildirilirken eklenir. Bunlardan dördü var:

  • özel
  • halka açık (açık)
  • korumalı
  • değiştirici olmadığında varsayılan erişim

Değiştirici bildirim örnekleri (her zaman önce gelmelidir):

Genel int i; özel çift j, k; özel int createMethod (int a) (...); genel sınıf Kedi ()

Gördüğünüz gibi, değiştirici bir değişkene, yönteme, sınıfa uygulanabilir.

halka açık

Anahtar kelimeyi kullanırken halka açık aşağıdaki sınıf üyesi bildiriminin projenizdeki diğer herhangi bir koddan herkes tarafından kullanılabileceğini bildirirsiniz.

Diyelim ki sınıf olarak ilan edildi halka açık, ve iki yöntemi vardır. Bir özel, ikinci - halka açık... Sınıfa erişiminiz olacak ve ikinci yöntemi, ancak sınıfın kendisi açık olmasına rağmen birincisine değil.

özel

anahtar kelime özel bir sınıfın bir üyesine erişimin, o sınıfın yöntemleri dışında hiç kimseye verilmediği anlamına gelir. Aynı paketteki diğer sınıflar da özel üyelere erişemez.

Tüm sınıf yardımcı yöntemleri şu şekilde bildirilmelidir: özel pakette yanlışlıkla çağrılmalarını önlemek için. Aynısı bir sınıf içindeki özel alanlar için de geçerlidir.

korumalı

anahtar kelime korumalı orijinal uygulama değişmeden kalırken, zaten var olan (temel) bir sınıfa yeni üyelerin eklendiği kalıtım kavramıyla ilgilidir. Halihazırda var olan sınıf üyelerinin davranışını da değiştirebilirsiniz. Mevcut bir sınıfa dayalı yeni bir sınıf oluşturmak için anahtar kelimeyi kullanın. uzanır.

Yeni bir paket oluştururken başka bir paketteki bir sınıftan devralma kullanılıyorsa, yeni sınıf yalnızca orijinal paketten genel üyelere erişim kazanır. Bazen bir temel sınıfın yaratıcısının, türetilmiş sınıflara belirli bir yönteme erişim vermesi, ancak onu herkesten kapatması gerekir. Bu durumlarda, anahtar kelime kullanılır korumalı... belirleyici korumalı ayrıca paket içinde erişim sağlar, yani. Bu belirticiye sahip üyeler, aynı paketteki diğer sınıflar tarafından kullanılabilir.

Varsayılan olarak, herhangi bir değiştirici yoksa, bir sınıf üyesi kendi paketi içinde genel kabul edilir, ancak bu paketin dışında kod yazamaz. Projenizdeki tüm sınıflar aynı paketteyse, özünde değiştiricisiz değişken geneldir ( halka açık).

Kurgusal bir sınıf düşünün aptal sensör

Genel sınıf SillySensor (özel int sensorData; genel SillySensor () (sensorData = 0;) özel void calibrate (int iSeed) (// kalibrasyon kodu) protected void seedCalibration (int iSeed) (calibrate (iSeed);) public int getSensorData ( ) (// Sensörü buradan kontrol edin, sensorData döndürün;))

Sınıf olarak ilan edilir halka açık ve diğer sınıflarda mevcuttur. Sınıfın bir değişkeni var sensorData, yalnızca kendi sınıfında (özel) mevcuttur. Yapıcı diğer sınıflarda mevcuttur ( halka açık). Yöntem kalibre () sadece sınıf içinde çalışır ( özel). Yöntem tohumKalibrasyon () kendi sınıfında veya alt sınıfında mevcuttur ( korumalı). Yöntem getSensorData () diğer sınıflarda mevcuttur ( halka açık).

değiştirici sınıfı
Değiştirici sınıfı, tüm değiştiricileri kodlar,
tip bildirimlerinde kullanılır, formda
sabitler:
ÖZET, NİHAİ, ARAYÜZ, YERLİ,
ÖZEL, KORUMALI, KAMU, STATİK,
KATI, SEMBRONİZE, TRANSIDENT,
UÇUCU.
Sabitlerin her biri, formun bir istek yöntemine sahiptir.
isMod (int değiştirici) ​​(burada Mod yukarıdakilerden biridir
verilen isimler, örneğin isPublic),
değiştirici ise true döndürür
mod, tür bildiriminde bulunur.

Bir örneğe bakalım. Olsun
alan beyanı
public static final int s = 10;
daha sonra yöntem tarafından döndürülen değer
karşılık gelen nesnenin getModifiers
Field sınıfı şöyle görünecek
Modifier.PUBLIC | Değiştirici.STATİK |
Değiştirici.SONUÇ
strictfp değiştirici tanıtıldı
sabit KATI.
Yöntemler - sorgular şurada kullanılabilir:
aşağıdaki formu

Modifier.isPrivate (field.getModifiers());
bu, aşağıdaki koşula eşdeğerdir
(field.getModifiers () & Değiştirici.ÖZEL)! = 0
alan sınıfı
Field sınıfının bir parçası olarak yöntemler uygulanır,
hakkında bilgi talep etme imkanı
alan türü, ayrıca okuyun ve ayarlayın
anlam.
Field sınıfının bazı yöntemlerini ele alalım
1.getType () - bir sınıf nesnesi döndürür
Geçerli alanın türüne karşılık gelen sınıf.
Örneğin, int türünde bir alan için şunu elde ederiz:
int.sınıf.

2. Yöntemler belirlenir ve alınır - okumanıza izin verir
alanın geçerli değeri ve ayrıca yeni bir tane ayarlayın.
Bir örnek düşünelim:
public static void printField (Object o,
Dize adı) atar
NoSuchFieldException,
IllegalAccessException (
Alan alanı = o.getClass () GetField (isim);
Kısa değer = (Kısa) field.get (o);
System.out.println (değer);
}
Onlar. get yöntemi, hangi değeri döndürür
karşılık gelen alan veya nesneyi ifade eder
sınıf - kabuk.
set yöntemini kullanmanın bir örneği şöyle görünür:

public static void setField (Nesne o, Dize adı,
kısa nv) atar
NoSuchFieldException,
IllegalAccessException (
Alan alanı = o.getClass () GetField (isim);
field.set (o, yeni Kısa (nv));
}
nv'yi belirli bir nesnenin alanında saklamak için
sarmalayıcı sınıfları kullanmalısınız.
Forma sahip yöntemler de vardır.
getPrimitiveType (getInt gibi) ve
setPrimitiveType. Bu yöntemler
bir sınıftaki alanları değiştirmek için kullanın,
ilkel bir tipe sahip. Örneğin,
field.setShort (o, nv);

yöntem sınıfı
Method sınıfının araçları - almanıza izin verir
ilgili tam bilgi
belirli bir sınıfın yöntem bildirimleri,
ve bu yöntemleri çağırın
verilen nesnelerin bağlamı.
Method sınıfının yöntemlerini düşünün.
1.public Class getReturnType () - döner
türe karşılık gelen Class nesnesi
geçerli yöntem tarafından döndürülen değer.
Eğer dönüş türü yerine
yöntem bildirimi bir hizmeti belirtir
kelime geçersiz, söz konusu yöntem geri dönecek
void.class nesnesi.

2.public Class getParameterTypes () - döndürür

beyannamede belirtilen parametreler
mevcut yöntem. Nesneler bir diziye şu adreste girilir:
parametrelerin listelendiği sırada
yöntem beyanı. Eğer yöntem yoksa
parametreler, boş bir dizi döndürülür.
3.public Class getExceptionTypes () - döner
türlere karşılık gelen bir Class nesnesi dizisi
cümlede belirtilen istisnalar
geçerli yöntemin bildirimini atar. nesneler
sırayla diziye girilir
istisna türlerinin adları şurada listelenmiştir:
yöntem beyanı.

4.public Object invoke (Object onThis, Object argümanları)
IllegalAccessException'ı atar,
IllegalArgumentİstisna,
InvocationTargetException
Geçerli nesne tarafından tanımlanan yöntemi çağırır
Yöntem, atamalı bir onThis nesnesi bağlamında
args dizisi tarafından iletilen bağımsız değişkenlerin değerleri.
Statik olmayan yöntemler için uygulama seçimi
gerçek tip temelinde gerçekleştirilir
onThis parametresi tarafından tanımlanan nesne. İçin
statik yöntemler üzerindeBu kabul edilmez
dikkat ve boş olabilir.
args dizisinin uzunluğu bir sayı ile aynı olmalıdır
yöntem bildirimindeki parametreler ve dizi öğelerinin nesne türleri atanabilir olmalıdır
karşılık gelen yöntem parametreleri türleri -
aksi takdirde bir istisna atılacaktır
IIlegalArgumentException.

10.

Nesnenin bileşimi belirlenirse
onThis, tip yok, üye
mevcut yöntem hangisi,
bir istisna atılır
IllegalArgumentException.
onThis boşsa ve yöntem değilse
statik, bir tür istisnası atılır
NullPointerException.
Çağrılan yöntemin yürütülmesi ise
anormal şekilde sona erer, atılır
InvocationTargetException türünün bir istisnası.

11.

Bir örneğe bakalım. yoluyla arayalım
yansıma yöntemi dönüş str.indexOf (".", 8)
o zaman bizde
denemek (
Sınıf strClass = str.getClass ();
Yöntem indexM = strClass.getMethod ("indexOf",
yeni Sınıf (string.class, int.class));
Nesne sonucu = indexM.invoke (str, yeni nesne (
".", yeni tamsayı (8));
dönüş ((Tamsayı) sonucu) .intValue();
}
yakalamak (NoSuchMethodException e) (…… ..)
catch (invocationTargetException e) (…… ..)
catch (illegalAccessException e) (……)

12.

yapıcı sınıfı
Yeni örnekler (nesneler) oluşturmak için
tip yöntemi kullanılabilir
Class nesnesinin yeni durumu,
bu türe karşılık gelir.
Yöntem, yapıcıyı argüman olmadan çağırır,
türe ait ve bir referans döndürür
Object sınıfının yeni oluşturulan bir nesnesine,
açıkça dönüştürülmesi gereken
gerekli tip.
Bir örneğe bakalım.

13.

statik çift testData = (0.3,1.3e-2, 7.9, 3.17);

denemek (
for (int arg = 0; arg< args.length; arg++){
Dize adı = bağımsız değişkenler;
Class classFor = Class.forName (isim);
SortÇift sıralayıcı =
(SortDouble) classFor.newInstance();
SortMetrics metrikleri = sorter.sort (testData);
System.out.println (ad + ":" + metrikler);
for (int ben = 0; ben< testData.length; i++)
System.out.println (“" + testData [i]);))
yakalama (İstisna e) (System.err.println (e);))

14.

Yanlış olduğunda Newlnstance yöntemi
uygulama büyük atma yeteneğine sahiptir
çeşitli istisna nesnelerinin sayısı
türleri.
InstantiationException - eğer sınıf, nesne
yaratılması gereken sahip değil
bağımsız değişkeni olmayan bir kurucu veya
soyut olarak tanımlanan veya
gerçekten bir arayüz,
veya oluşturma prosedürünü gerçekleştirmek
nesne başka herhangi bir nedenle kesintiye uğradı
sebepler.
IllegalAccessException - eğer sınıf onun
bağımsız değişken yapıcısı mevcut değil.

15.

SecurityException - eğer geçerli bir politikaysa
güvenlik, yeni nesnelerin oluşturulmasını yasaklar
ExceptionInInitializerError - Ne zaman atılır
sınıfı başlatıyor.
Diğer yöntemler Constructor sınıfında tanımlanmıştır.
public Сlass getParameterTypes ()

parametre türlerine karşılık gelen
geçerli yapıcı bildiriminde belirtilmiştir.
genel Sınıf getExceptionTypes ()
Bir dizi Class nesnesi döndürür,
istisna türlerine karşılık gelen
bildirimin fırlatma yan tümcesinde ayarlayın
geçerli kurucu.

16.

public Object newlnstance (Nesne argümanları)
InstantiationException'ı atar,
YasadışıErişimİstisna,
IllegalArgumentİstisna,
InvocationTargetException
Geçerli tarafından sağlanan yapıcıyı kullanır
oluşturmak ve başlatmak için bir Yapıcı nesnesi
yapıcının içinde bulunduğu sınıfın yeni bir örneği
verilen argümanları ileterek bildirdi.
Yeni oluşturulan ve
başlatılmış bir nesne. bağımsız değişken uzunluğu
parametre sayısı ile eşleşmelidir.
bir yapıcı bildirimi ve dizi öğelerinin nesne türleri atanabilir olmalıdır
karşılık gelen yapıcı parametreleri türleri -
aksi takdirde bir istisna atılacaktır
IllegalArgumentException.

17.

Bir örnek düşünelim:
sınıf Sınıfım (
özel int a;
genel Sınıfım (int k) (a = k;)
public int func (int a, int b) (dönüş a + b;)
}
genel sınıf Ana (
public static void main (String args) (
denemek (
Dize adı = "Sınıfım";
Sınıf mycl = Class.forName (isim);
Sınıf d = (int.sınıf);
Oluşturucu c = mycl.getConstructor (d);
Sınıfım ob = (Sınıfım) c.newInstance (yeni Nesne (
yeni Tamsayı (10)));
System.out.println (ob.func (3,5)); )
yakalama (İstisna e) ();
}}

18.

AccessibleObject sınıfı
Field, Constructor ve Method sınıfları
AccessibleObject sınıfından türetilmiş,
çözmeyi mümkün kılan veya
seviye erişim işaretlerini kontrol etmeyi yasakla
kamu ve özel gibi diller.
AccessibleObject sınıfının yöntemleri vardır
1.public void setAccessible (boole bayrağı)
Nesne erişim bayrağını şu şekilde ayarlar:
argümanın değerine göre: true
nesnenin artık uymadığı anlamına gelir
düzeyde belirlenen erişim kuralları
dil (ve her zaman mevcut olacak), yanlış
nesneyi verileni korumaya zorlar
erişim seviyesi.
Erişim bayrağını değiştirme yetkisi varsa
yeterli değil, bir tür istisnası atıldı
Güvenlik İstisnası

19.

2. genel statik
void setAccessible (AccessibleObject dizisi,
boole bayrağı)
Erişim bayrağını şu şekilde ayarlamanıza izin verir:
bir dizi olarak geçirilen nesneler.
Bir sonraki işlem sırasında ise
nesne bir tür istisnası atar
SecurityException Nesneleri Bulundu
dizide daha önce, yeni seti saklayın
erişim düzeyi değerleri ve diğerleri
nesneler aynı durumda kalır.
3.public boolean Erişilebilir ()
Erişim bayrağının geçerli değerini döndürür
nesneye

20.

dizi sınıfı
Dizi sınıfı, dizi oluşturmak için kullanılır.
yansıma yoluyla.
Diziler oluşturmak için kullanılan yöntemin iki biçimi vardır.
yeniÖrnek.
public Object newlnstance (Sınıf compType, int uzunluk)
compType türünde yeni bir diziye başvuru döndürür
uzunluk uzunluğu verilmiştir.
public Object newInstance (Sınıf compType, int loş)
Yeni bir çok boyutlu tür dizisine başvuru döndürür
Boyutları değerlerle verilen compType
parametre dizisinin öğeleri dim.
dim boşsa veya daha uzunsa
izin verilen boyut sayısı (genellikle 255),

llegalArgumentException.

21.

Bazı örneklere bakalım.
Örnek 1. bayt türünde bir dizi oluşturalım
bayt ba = (bayt)
Array.newlnstance (byte.class, 13);
Bu aynı
bayt ba = yeni bayt;
Örnek 2.
int karartır = (4, 4);
çift ​​matris = (çift)
Array.newlnstance (çift.sınıf, karartır);
Bu aynı
çift ​​matris = yeni çift;

22.

Array sınıfının get ve set yöntemleri vardır.
int türünde bir xa değerleri dizisi verilsin; sonra
xa [i] ifadesi şu şekilde eşleşir:
Tamsayı n = Array.get (xa, i)
Bir dizi öğesine aşağıdaki gibi bir değer atayabilirsiniz:
xa [i] = 23; aynıdır
Array.set (xa, i, yeni Tamsayı (23));
Paket sınıfı
Class sınıfının getPackage yöntemini çağırmak,
içeren bir sınıf Paketi nesnesi alın
içeren paketin açıklaması
class (Paket sınıfının kendisi pakette bulunur
java.lang).
Paket nesnesinin getName () yöntemi döndürülür
geçerli paketin tam adı.

23.

proxy sınıfı
Proxy sınıfı, dinamik olarak oluşturmanıza olanak tanır.
bir veya daha fazlasını uygulayan sınıflar
arayüzler.
Diyelim ki bir A sınıfı var,
bazı arayüzlerin uygulanması.
Java makinesi çalışma zamanında
verilen için proxy sınıfı oluştur
A sınıfı, yani bir sınıf ki
A sınıfının tüm arabirimlerini uygular, ancak
bunların tüm yöntemlerini çağırmanın yerini alır
invoke yöntemini çağırmak için arayüzler,
InvocationHandler arabirimi,
sizin tanımlayabileceğiniz
uygulama.

24.

Bir yöntem çağrısı kullanarak bir proxy sınıfı oluşturur
Bir ClassLoader kabul eden Proxy.getProxyClass ve
bir dizi arabirim ve bir nesne döndürür
ile yüklenen sınıf java.lang.Class
ClassLoader'da geçirilen ve dizide geçirilenleri uygular
arayüzler.
İletilen parametrelerde bir takım kısıtlamalar vardır:
1. Interfaces dizisindeki tüm nesneler
arayüzler. Sınıf olamazlar veya
ilkeller.
2. Interfaces dizisinde iki özdeş arayüz olamaz.
nesneler.
3. Arayüzler dizisindeki tüm arayüzler
yönteme iletilen ClassLoader tarafından yüklenir
getProxyClass.
4. Herkese açık olmayan tüm arayüzler tanımlanmalıdır
aynı pakette, aksi takdirde oluşturulan proxy sınıfı
hepsini uygulayamayacak.

25.

5. İki arayüz içeremez
aynı isimdeki yöntem ve
parametre imzası, ancak farklı
dönüş türleri.
6. Arayüzler dizisinin uzunluğu sınırlıdır
65535 arayüzler. Java sınıfı yok
65535'ten fazlasını uygulayamaz
arayüzler.

26.

Dinamik proxy sınıfı özellikleri
1. Proxy sınıfı, aşağıdakiler sağlanıyorsa, herkese açıktır.
nihaidir ve soyut değildir.
2. Varsayılan proxy sınıfı adı
tanımlanmış, ancak Proxy'de başlar. Her şey
Proxy ile başlayan ad alanı
proxy sınıfları için ayrılmış
(Bu, Java'nın son sürümlerinde gerekli değildir.)
3. Proxy sınıfı,
java.lang.reflect.Proxy.
4. Proxy sınıfı tüm arayüzleri uygular,
aktarım sırasına göre, yaratılışta aktarılır.

27.

5. Proxy sınıfı, genel olmayan bir
arayüz, daha sonra pakette oluşturulacak
bu çok halka açık olmayan
arayüz. Genel olarak, içinde bulunduğu bir paket
proxy sınıfı tanımsız olarak oluşturulacaktır.
6. Proxy.isProxyClass yöntemi, şunun için true değerini döndürür:
ile oluşturulan sınıflar
Proxy.getProxyClass ve nesne sınıfları için,
Proxy.newProxyInstance ile oluşturuldu ve
aksi halde yanlış.
Bu yöntem alt sistem tarafından kullanılır.
Java güvenliği ve bunu anlamanız gerekir.
sadece miras alınan bir sınıf
java.lang.reflect.Proxy false döndürür.

28.

Proxy sınıfının oluşturulan örneğinin özellikleri aşağıdaki gibidir:
1. Proxy sınıfının nesnesi tüm arayüzlere gönderilir,
interfaces dizisinde geçirilir. IDemo şunlardan biriyse
geçirilen arayüzlerin, ardından işlemin proxy örneği
IDemo her zaman true değerini döndürür ve (IDEmo) proxy işlemi
doğru tamamlayacaktır.
2. Statik yöntem Proxy.getInvocationHandler
oluşturma sırasında geçirilen çağrı işleyicisini döndürür
proxy sınıfının bir örneği. Verilene aktarılırsa
yöntem nesnesi bir proxy sınıfının bir örneği değil, o zaman
bir IllegalArgumentException istisnası atılacak.
3. Çağrı işleyici sınıfı, arabirimi uygular
Invoke yönteminin tanımlandığı InvocationHandler,
aşağıdaki imzaya sahip:
genel Nesne çağırma (Nesne proxy'si, Yöntem yöntemi,
Nesne argümanları) Fırlatılabilir fırlatır

29.

Bir örnek düşünelim:
paket javaapplication3;
arayüz Hesabı (
çift ​​getBalance();
void changeBalance (int toplam);
geçersiz yüzdeler (başına çift);)
sınıfı MyAccount, Hesabı uygular (
özel çift bakiye;
herkese açık Hesabım () (bakiye = 0.0;)
public double getBalance () (dönüş bakiyesi;)
public void changeBalance (int toplam) (
bakiye + = toplam;)
genel boşluk yüzdeleri (her bir çift için) (
bakiye + = bakiye * / 100 başına; ); )

30.

sınıf MyAccountProxy uygular
Çağrı İşleyicisi (
özel Hesap ac;
genel MyAccountProxy (Hesap hesabı) (ac = hesap;)
genel statik Hesap yeniÖrnek (Hesap da) (
dönüş (Hesap) Proxy.newProxyInstance (
da.getClass().getClassLoader(),
da.getClass().getInterfaces(),
yeni MyAccountProxy (da));
}

31.

genel Nesne çağırma (Nesne proxy'si,
Yöntem yöntemi, Nesne argümanları)
Fırlatılabilir (
if (method.getName () == "yüzdeler") (
double d = ((Double) argümanlar) .doubleValue ();
eğer (d<0) d=0;
(d> 30) d = 30 ise;
args = yeni Çift (d);

Başka (
dönüş method.invoke (ac, args); )
}
}

32.

genel sınıf Ana (
public static void main (String args) (
Hesabım ana = yeni Hesabım ();
Hesap
a = (Hesap) MyAccountProxy.newInstance (ma);
a.changeBalance (150);

a.yüzdeler (20);
System.out.println (a.getBalance());
a.yüzdeler (35);
System.out.println (a.getBalance ());))

33.

Sınıflar yükleniyor
Çalışma zamanı sistemi, sınıfları şu şekilde yükler:
onlara olan ihtiyacın ortaya çıkması.
Önyükleme prosedürlerinin işlevsel özellikleri
sınıflar esasen bağlıdır
Java sanal makinelerinin uygulamaları, ancak
çoğu durumda sınıfları bulmak için,
uygulama tarafından adreslenmiş ancak yüklenmemiş
yürütme sistemi tarafından, mekanizma uygulanır
sınıf arama yolunu görüntüleyin.
yapabilen bir uygulama oluşturmak için
sınıfları başka yollarla yüklemek
varsayılan olarak sağlanır,
ClassLoader sınıfının bir nesnesini kullanın,
istenenin uygulanması için bayt kodunu alabilir
sınıf ve çalışma zamanı ortamına yükleyin
sistemler.

34.

ClassLoader sınıfı soyut bir sınıftır.
Kendi sınıf yükleyicinizi oluşturmak için,
miras alan bir sınıf oluşturmak gereklidir.
ClassLoader ve geçersiz kılma yöntemi
korumalı Sınıf findClass (Dize adı) atar
ClassNotFoundException
Verilen sınıfın bayt kodunu bulan
adlandırılmış ad ve verileri ortama yükler
bir Class nesnesi döndürerek sanal makine,
bulunan sınıfı temsil eder.
Yükleyici nesnesi yetki verebilir
sınıfları "ebeveyn"e yükleme yetkisi
ana sınıf yükleyici.
"Üst" sınıf yükleyici olabilir
sınıf kurucusuna argüman olarak verilir
Sınıf Yükleyici.

35.

korumalı ClassLoader ()
Örtük olarak bir ClassLoader nesnesi oluşturur
"ebeveyn" olarak kullanmak
sınıf yükleyici sistem yükleyici
(hangi tarafından elde edilebilir
getSystemClassLoader yöntemini çağırın).
korumalı ClassLoader (ClassLoader ebeveyni)
kullanarak bir ClassLoader nesnesi oluşturur.
belirtilen "üst" sınıf yükleyici.
ClassLoader sınıfının ana kısmı
loadClass yöntemidir

36.

public Sınıf loadClass (Dize adı) atar
ClassNotFoundException
verilen sınıf için Class nesnesini döndürür
name ve isteğe bağlı olarak bunu yükler
Sınıf. Sınıf yüklenemiyorsa,
bir tür istisnası atılır
ClassNotFoundException.
Yöntemin sunduğu sınıf yükleme şeması
loadClass varsayılandır ve genellikle değil
geçersiz kılınan şuna benzer:
1. bir yöntemi çağırarak kontrol edin
ClassLoader sınıfından findLoadedClass, değil
belirtilen sınıfın daha önce yüklenip yüklenmediği; bir parçası olarak
ClassLoader bir nesne tablosu sağlar
Araçlarla yüklenen tüm sınıflar için sınıf
mevcut sınıf yükleyici; sınıf olsaydı
daha önce yüklendi, findLoadedClass yöntemi
mevcut bir Class nesnesine bir başvuru döndürür;

37.

2.sınıf yüklenmemişse denir
"Üst" yükleyicinin loadClass
sınıflar; mevcut önyükleyici değilse
bir "ebeveyn"e sahiptir, kullanılır
sistem sınıfı yükleyici;
3.sınıf hala yüklenmemişse,
findClass yöntemine yapıyor denir
bir sınıf arama ve yükleme.
Bu nedenle, uygulanması gerekli
aşağıdaki yöntemlerin yerel sürümleri
Sınıf Yükleyici:

38.

korumalı senkronize Sınıf
loadClass (Dize adı, boole çözümü)

korumalı Sınıf findClass (Dize adı)
ClassNotFoundException'ı atar
korumalı java.net.URL findResource (Dize adı)
korumalı java.util.Enumeration
findResources (Dize adı) IOException'ı atar
(Soyut ClassLoader sınıfı temsil eder
yalnızca loadClass yönteminin uygulanması
korumalı yöntemlerde - findLoadedClass ve findClass).

39.

Bir örneğe bakalım.
class PlayerLoader, ClassLoader'ı genişletir (
public Class findClass (Dize adı) atar
ClassNotFoundException (
denemek (
bayt arabelleği = bytesForClass (isim);
dönüş defineClass (isim, arabellek, 0, arabellek.uzunluk);
}
yakalamak (IOException e) (
yeni ClassNotFoundException (e.toString ());
}
}
// ... yöntem bildirimleri bytesForClass ve diğerleri
yöntemler
}

40.

findClass yöntemi genellikle iki
fonksiyonlar.
İlk olarak, bayt kodunu algılaması gerekir.
verilen sınıfın ve bir dizide saklayın
bayt türü - örnekte bu görev
bytesForСlass yöntemine atanır.
İkincisi, uygulanan yöntemi kullanır
fiili yürütmek için tanımlı sınıf
bayt kodu tarafından tanımlanan sınıfın yüklenmesi.
defineSlass yöntemi şu şekildedir:

41.

korumalı son Sınıf defineClass (Dize adı,
bayt verisi, int ofset, int uzunluk) atar
SınıfFormatHatası
Belirtilen ada sahip sınıf için Class nesnesini döndürür
isim; sınıfın ikili temsili iletilir
dizi verisi olarak
Sınıfı yüklemek için yalnızca bayt kullanılır,
indeksli veri dizisinin elemanlarında bulunur
ofset + uzunluk. Belirtilen baytlardan ise
boşluk gerekli formatla eşleşmiyor
sınıf açıklaması, istisna nesnesi atılır
ClassFormatError türünde.
Yöntem, nesneye yapılan referansın korunmasından sorumludur.
Yüklenen tabloda yüklenen sınıf için sınıf
findLoadedClass yöntemi tarafından görüntülenen sınıflar.

42.

bytesForClass yöntemini düşünün.
korumalı bayt bytesForClass (Dize adı) atar
lOException, ClassNotFoundException (
FileInputStream = null;
denemek (


if (uzunluk == 0) yeni ClassNotFoundException (ad) atın;
bayt tamponu = yeni bayt;

dönüş tamponu;
}
nihayet (
if (in! = null) in.close();
}
}

43.

Böylece, tam kod şöyle görünür:
java.lang.reflect'i içe aktar *;
java.io'yu içe aktar *;
class MyClassLoader, ClassLoader'ı genişletir (
Kamusal sınıffindClass (Dize adı) atar
ClassNotFoundException (
bayt arabelleği = ReadFromBuffer (ad);
if (name.equals ("MyInterface1")) (

) else if (tampon == null) (
findSystemClass (ad) döndür;
) Başka (
dönüş defineClass (isim, arabellek, 0, arabellek.uzunluk);
}
}

44.

korumalı bayt ReadFromBuffer (Dize adı) atar
ClassNotFoundException (
FileInputStream = null;
denemek (
in = new FileInputStream (ad + ".class");
int uzunluk = in.mevcut(); // kullanılabilir bayt sayısı
if (uzunluk == 0) atmak
yeni ClassNotFoundException (ad);
bayt tamponu = yeni bayt;
in.read (tampon); // baytları oku
dönüş tamponu;
}
catch (FileNotFoundException e) (boş döndür;)
catch (IOException e) (boş döndür;)
nihayet (
deneyin (if (in! = null) in.close ();)
yakalamak (IOException e) ()
}
}

45.

korumalı senkronize Sınıf
loadClass (Dize adı, boolean çözme) atar
ClassNotFoundException (
Sınıf sonucu = findClass (isim);
if (çöz) çözSınıfı (sonuç);
dönüş sonucu;
}
}

46.

genel sınıf Main1 (
public static void main (String args) (
denemek (
Dize adı = "Sınıfım";
ClassLoader ld = yeni MyClassLoader();
Class cl = Class.forName (ad, doğru, ld);
Yapıcı s = cl.getConstructor (int.class);
MyInterface1
ob = (MyInterface1) s.newInstance (
yeni Tamsayı (8));
System.out.println (ob.func (3,5));
) yakalama (İstisna e) ();
}
}

47.

genel arayüz MyInterface1 (
public int işlevi (int a, int b);
}
genel sınıf Myclass, MyInterface1'i uygular (
özel int a;
genel Sınıfım (int k) (a = k;)
public int func (int a, int b) (dönüş a + b;)