Java'da dört tür erişim belirleyicisi (access modifier) bulunur:
Private: private anahtar kelimesiyle belirlenen öğeler, sadece tanımlandıkları sınıfın içinde erişilebilir. Yani, başka bir sınıftan veya paketten bu öğelere erişim mümkün olmaz. Genellikle, sınıfın dahili durumunu saklamak ve kapsüllemeyi sağlamak için kullanılır.
Default (package-private): Hiçbir anahtar kelime belirtilmediğinde, öğeye ait erişim belirleyicisi "default" veya "package-private" olarak kabul edilir. Bu durumda, öğe aynı paketin içindeki diğer tüm sınıflardan erişilebilir hale gelir, fakat paketin dışından erişilemez.
Protected: protected anahtar kelimesiyle belirlenen öğeler, aynı paketin içindeki tüm sınıflar ve bu sınıfı kalıtan diğer tüm sınıflar tarafından erişilebilir hale gelir. Bu, paketin dışından bile olsa, kalıtım yoluyla bu öğelere erişim sağlanabilmesini mümkün kılar.
Public: public anahtar kelimesiyle belirlenen öğeler, her yerden erişilebilir hale gelir. Bu, bu öğelere başka sınıfların, başka paketlerin ve hatta başka modüllerin bile erişebileceği anlamına gelir.
Erişim belirleyicileri, Java'nın Nesne Yönelimli Programlama (OOP) özelliklerinin bir parçasıdır ve sınıflar, metotlar, değişkenler ve yapılandırıcılar (constructors) üzerinde kullanılır. Bunlar, bir sınıfın iç yapısını ve durumunu saklamak, kodun okunabilirliğini ve bakımını kolaylaştırmak ve potansiyel hataları önlemek için önemlidir.
Private: private anahtar kelimesiyle işaretlenmiş bir özellik veya metot, sadece o sınıfın içinde kullanılabilir. Bu, genellikle bazı verilerin veya işlemlerin sınıfın dışına açılmaması gerektiği durumlarda kullanılır. Örneğin:
java
Copy code
public class MyClass {
private int secretData;
public int getSecretData() {
return secretData;
}
}
Bu örnekte, secretData değişkenine doğrudan erişim sağlanamaz. Ancak getSecretData() metodu üzerinden bu veriye dolaylı olarak ulaşabiliriz.
Default (package-private): Hiçbir erişim belirleyicisi belirtilmemişse, öğenin erişim belirleyicisi varsayılan olarak default olur. Bu, öğenin tanımlandığı paketin içindeki diğer sınıflar tarafından erişilebilir olduğu anlamına gelir. Ancak, paketin dışındaki sınıflar bu öğeye erişemez.
Protected: protected anahtar kelimesiyle belirtilen bir özellik veya metot, aynı paketin içindeki tüm sınıflar ve alt sınıflar (subclass) tarafından erişilebilir hale gelir, hangi pakette olduklarına bakılmaksızın. Örneğin:
java
Copy code
public class ParentClass {
protected int protectedData;
}
public class ChildClass extends ParentClass {
public void accessData() {
System.out.println(protectedData);
}
}
Bu örnekte, ChildClass sınıfı ParentClass'ı kalıttığı için protectedData'ya erişebilir.
Public: public anahtar kelimesiyle belirtilen özellikler ve metotlar, herhangi bir sınıf tarafından erişilebilir. Bu, genellikle bir sınıfın dış dünya ile iletişim kurması gereken durumlarda kullanılır. Örneğin:
java
Copy code
public class MyClass {
public int publicData;
}
public class AnotherClass {
public void accessData() {
MyClass mc = new MyClass();
mc.publicData = 10;
System.out.println(mc.publicData);
}
}
Bu örnekte, AnotherClass sınıfı MyClass'ın publicData özelliğine erişebiliyor ve bu özelliği değiştirebiliyor.
Erişim belirleyicileri, bir sınıfın iç yapısını korurken aynı zamanda dış dünya ile iletişim kurmasını sağlar. Bu, özellikle büyük projelerde ve takım çalışmalarında önemlidir, çünkü bir sınıfın iç yapısını bilmeden veya değiştirmeden sınıfın ne yaptığını kontrol etmek ve kullanmak mümkün hale gelir.
Konuyla ilgili örnek OCP soruları ve cevapları
Ancak, daha genel bir bilgi olarak, OCP sınavları genellikle Java dilini ve özelliklerini, nesne yönelimli programlamayı, Java Core API'lerini, veri tabanı işlemlerini, Java dilindeki hata işleme ve daha pek çok konuyu kapsar. Bu bağlamda, erişim belirleyicileri (access modifiers) ile ilgili bir örnek soru ve cevap şöyle olabilir:
Soru: Hangi erişim belirleyicisi (access modifier) aşağıdaki özelliklerden hangisini/hangilerini sağlar?
Bir sınıfın aynı paketindeki diğer sınıflar tarafından erişilebilir.
Alt sınıflar tarafından erişilebilir, paketten bağımsız olarak.
Başka bir paketteki sınıflar tarafından doğrudan erişilemez.
A) Private
B) Default
C) Protected
D) Public
Cevap: C) Protected. 'Protected' erişim belirleyicisi, bir öğenin aynı paketteki diğer sınıflar ve alt sınıflar tarafından erişilebilir olduğunu, fakat başka bir paketteki sınıflar tarafından doğrudan erişilemez olduğunu belirtir.
Soru: Aşağıdaki Java kodunda bir hata olduğunu düşünüyor musunuz? Eğer varsa, hatanın nerede olduğunu ve neden olduğunu açıklayın.
java
Copy code
// File: com/example/Fruit.java
package com.example;
class Fruit {
protected int weight;
public String color;
}
// File: com/example/Test.java
package com.example;
import com.example.Fruit;
public class Test {
public static void main(String[] args) {
Fruit apple = new Fruit();
apple.weight = 150;
System.out.println("The weight of the apple is: " + apple.weight + " grams");
}
}
Cevap: Hayır, burada bir hata yoktur. Fruit sınıfı ve Test sınıfı aynı paket içinde yer alıyor (com.example), bu yüzden Test sınıfı, Fruit sınıfının protected ve public özelliklerine erişebilir. weight özelliği protected olarak belirlenmiştir, bu da aynı paketteki diğer sınıflar tarafından erişilebilir olduğunu belirtir. Dolayısıyla, Test sınıfının weight özelliğine erişmesi ve değer ataması yapması hataya neden olmaz.
Erişim belirleyicileri, sınıf özelliklerinin ve metodlarının hangi sınıflar tarafından erişilebileceğini belirler. Bu, kodun daha düzenli ve anlaşılır olmasını sağlar, ayrıca yanlış kullanımı önler ve kod güvenliğini artırır. Bu nedenle, Java'daki erişim belirleyicilerinin anlaşılması ve doğru kullanımı çok önemlidir.
Soru: Aşağıdaki Java kodunda bir hata olduğunu düşünüyor musunuz? Eğer varsa, hatanın nerede olduğunu ve neden olduğunu açıklayın.
java
Copy code
// File: com/example/Vehicle.java
package com.example;
public class Vehicle {
private int speed;
public Vehicle(int speed){
this.speed = speed;
}
public int getSpeed() {
return this.speed;
}
}
// File: com/example/Test.java
package com.example;
import com.example.Vehicle;
public class Test {
public static void main(String[] args) {
Vehicle car = new Vehicle(60);
System.out.println("The speed of the car is: " + car.speed + " km/h");
}
}
Cevap: Evet, burada bir hata vardır. speed özelliği Vehicle sınıfında private olarak belirlenmiştir, bu yüzden yalnızca Vehicle sınıfının içinde erişilebilir. Test sınıfı, Vehicle sınıfının speed özelliğine doğrudan erişmeye çalışıyor, bu da bir hata oluşturacaktır. Bu hatayı çözmek için Test sınıfının, Vehicle sınıfının getSpeed() metodunu kullanması gerekmektedir. Bu metod, public olarak belirlenmiştir ve dolayısıyla her sınıf tarafından erişilebilir. Aşağıdaki gibi bir düzeltme yapılabilir:
java
Copy code
System.out.println("The speed of the car is: " + car.getSpeed() + " km/h");
Bu örnekte, getSpeed() metodu Vehicle sınıfının speed özelliğine erişim sağlayan bir "getter" metodu olarak kullanılır. Bu tür metodlar genellikle bir sınıfın private özelliklerine güvenli ve kontrollü bir şekilde erişim sağlamak için kullanılır. Bu da Java'da "kapsülleme" (encapsulation) denen bir OOP ilkesinin bir örneğidir. Kapsülleme, bir sınıfın iç verilerini ve işleyişini dış dünyadan saklama ve sınıfın dışında neyin görüleceğini ve neyin görülemeyeceğini kontrol etme yeteneğidir.
Soru: Aşağıdaki Java kodunda bir hata olduğunu düşünüyor musunuz? Eğer varsa, hatanın nerede olduğunu ve neden olduğunu açıklayın.
java
Copy code
// File: com/example/Shape.java
package com.example;
public class Shape {
String name;
public Shape(String name){
this.name = name;
}
String getName() {
return this.name;
}
}
// File: com/example/Test.java
package com.example;
import com.example.Shape;
public class Test {
public static void main(String[] args) {
Shape circle = new Shape("Circle");
System.out.println("The name of the shape is: " + circle.getName());
}
}
Cevap: Hayır, burada bir hata yoktur. getName() metodu Shape sınıfında default (erisim belirleyicisi belirtilmemis) olarak belirlenmiştir. Bu durum, getName() metodunun aynı paketteki tüm sınıflar tarafından erişilebilir olduğu anlamına gelir. Bu durumda Test sınıfı da Shape sınıfı ile aynı pakette (com.example) bulunmaktadır, bu nedenle getName() metoduna erişim sağlayabilir. Yani, Test sınıfının getName() metodunu çağırması ve çıktıya yazdırması hata oluşturmaz.
Yani, default erişim belirleyicisi, bir özelliğin ya da metodun aynı paketteki diğer sınıflar tarafından erişilebilir olduğunu belirtir. Bu, paket içinde sınıflar arasında veri paylaşımı gerektiğinde yararlıdır. Ancak default erişim belirleyicisi, verinin paket dışından erişilemez olmasını garanti eder, bu da bir dereceye kadar veri gizliliği sağlar. Bu nedenle, bir özelliğin ya da metodun kapsamının gerektiği kadar sınırlı olmasını sağlamak için uygun erişim belirleyicinin seçilmesi önemlidir.
Soru: Aşağıdaki Java kodunda bir hata olduğunu düşünüyor musunuz? Eğer varsa, hatanın nerede olduğunu ve neden olduğunu açıklayın.
java
Copy code
// File: com/example/Book.java
package com.example;
public class Book {
public String title;
private String author;
public Book(String title, String author){
this.title = title;
this.author = author;
}
private String getAuthor() {
return this.author;
}
public String getTitle() {
return this.title;
}
}
// File: com/example/Test.java
package com.example;
import com.example.Book;
public class Test {
public static void main(String[] args) {
Book book = new Book("1984", "George Orwell");
System.out.println("The author of the book is: " + book.getAuthor());
}
}
Cevap: Evet, burada bir hata vardır. getAuthor() metodu Book sınıfında private olarak belirlenmiştir ve bu yüzden yalnızca Book sınıfının içinde erişilebilir. Test sınıfı, Book sınıfının getAuthor() metoduna doğrudan erişmeye çalışıyor ve bu bir hata oluşturacaktır. Bu hatayı çözmek için, getAuthor() metodunu public veya protected yapabiliriz veya Test sınıfında Book sınıfının getAuthor() metoduna erişim yerine, Book sınıfındaki public erişime sahip olan title özelliğini kullanabiliriz. Yani, aşağıdaki gibi bir düzeltme yapabiliriz:
java
Copy code
System.out.println("The title of the book is: " + book.getTitle());
Bu örnek, Java'da erişim belirleyicilerin önemini vurgulamaktadır. Erişim belirleyicileri, sınıfın içindeki verilere ve metotlara hangi diğer sınıfların erişebileceğini kontrol etmek için kullanılır. Bu, verilerin yanlışlıkla veya kötü niyetle değiştirilmesini önlemek için önemli bir güvenlik önlemidir. Aynı zamanda, bir sınıfın nasıl ve ne zaman kullanılacağını belirleme yeteneği sağlar, bu da kodun düzenlenmesini ve bakımını daha kolay hale getirir.
Soru: Aşağıdaki Java kodunda bir hata olduğunu düşünüyor musunuz? Eğer varsa, hatanın nerede olduğunu ve neden olduğunu açıklayın.
java
Copy code
// File: com/example/Person.java
package com.example;
public class Person {
public String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
private int getAge() {
return this.age;
}
public String getName() {
return this.name;
}
}
// File: com/example/Test.java
package com.example;
import com.example.Person;
public class Test {
public static void main(String[] args) {
Person person = new Person("John Doe", 30);
System.out.println("The age of the person is: " + person.getAge());
}
}
Cevap: Evet, burada bir hata vardır. getAge() metodu Person sınıfında private olarak belirlenmiştir ve bu yüzden yalnızca Person sınıfının içinde erişilebilir. Test sınıfı, Person sınıfının getAge() metoduna doğrudan erişmeye çalışıyor, bu da bir hata oluşturacaktır. Bu hatayı çözmek için getAge() metodunun erişim belirleyicisini public veya protected olarak değiştirebiliriz, böylece Test sınıfı bu metoda erişebilir. İşte düzeltme:
java
Copy code
// File: com/example/Person.java
public int getAge() { // change the access modifier to public
return this.age;
}
Bu örnekte, getAge() metodu Person sınıfının age özelliğine erişim sağlayan bir "getter" metodu olarak kullanılır. Bu tür metodlar genellikle bir sınıfın private özelliklerine güvenli ve kontrollü bir şekilde erişim sağlamak için kullanılır. Bu, verinin yanlışlıkla veya kötü niyetle değiştirilmesini önlemek için önemli bir güvenlik önlemidir. Ayrıca, bir sınıfın nasıl ve ne zaman kullanılacağını belirleme yeteneği sağlar, bu da kodun düzenlenmesini ve bakımını daha kolay hale getirir. Bu yüzden, Java'daki erişim belirleyicilerinin anlaşılması ve doğru kullanımı çok önemlidir.
Başka bir pakette yer alan bir sub class extend ettiği classın protected alanına erişemiyorsa Default (package-private) dan bir farkı kalmıyor. Sence hata yapmadın mı?
Özür dilerim, hatayı belirttiğiniz için teşekkür ederim. Gerçekten de yanıltıcı bir bilgi vermiş olabilirim. Aslında, Java'da protected ve default (package-private) erişim belirleyicileri arasında önemli bir fark vardır:
default (package-private): Erişim belirleyicisi belirtilmemiş bir üye (field ya da method) aynı paket içerisindeki tüm sınıflardan erişilebilir hale gelir, ancak paketin dışındaki sınıflar tarafından erişilemez.
protected: Bir üye protected olarak işaretlendiğinde, bu üyeye aynı paketin tüm sınıfları ve ayrıca bu sınıfı extend eden farklı paketlerdeki tüm alt sınıflar (subclass) erişebilir.
Bu nedenle, protected erişim belirleyicisi, default (package-private) erişim belirleyicisinden daha geniş bir erişim sağlar çünkü protected erişim belirleyicisi aynı zamanda alt sınıfların farklı paketlerde bile olsa protected üyeye erişimine izin verir.
Bu durumla ilgili olarak soru ve cevapla ilerleyecek olursak:
Soru: Aşağıdaki Java kodunda bir hata olduğunu düşünüyor musunuz? Eğer varsa, hatanın nerede olduğunu ve neden olduğunu açıklayın.
java
Copy code
// File: com/example/Animal.java
package com.example;
public class Animal {
protected String type;
public Animal(String type){
this.type = type;
}
protected String getType() {
return this.type;
}
}
// File: com/other/Zebra.java
package com.other;
import com.example.Animal;
public class Zebra extends Animal {
public Zebra(String type){
super(type);
}
public void printType() {
System.out.println("The type of the animal is: " + getType());
}
}
// File: com/other/Test.java
package com.other;
import com.other.Zebra;
public class Test {
public static void main(String[] args) {
Zebra zebra = new Zebra("Mammal");
zebra.printType();
}
}
Cevap: Hayır, burada bir hata yoktur. Zebra sınıfı, Animal sınıfını extend eder ve getType() metodunu çağırabilir çünkü getType() metodu protected olarak belirlenmiştir. Bu, Zebra sınıfının getType() metoduna erişim sağlamasına ve printType() metodu içinde kullanmasına izin verir. Bu nedenle, Test sınıfının Zebra sınıfının printType() metodunu çağırması ve çıktıya yazdırması hata oluşturmaz.
Daha advanced access modifiers OCP soruları sor ve cevap ver
Elbette, Java OCP sertifikası için erişim belirleyicileri hakkında daha ileri düzeyde bazı sorular sunabilirim:
Soru 1:
Aşağıdaki kod parçasına bakın:
java
Copy code
// File: com/example/Parent.java
package com.example;
public class Parent {
protected int x = 5;
}
Daha advanced access modifiers OCP soruları sor ve çözümleri ver
Tabii ki, Java OCP sertifikası için erişim belirleyicileri hakkında daha ileri düzeyde birkaç soru ve çözümlerini sunabilirim:
Soru 1:
Aşağıdaki kod parçasına bakın:
java
Copy code
// File: com/example/Foo.java
package com.example;
public class Foo {
int a = 10;
protected int b = 20;
private int c = 30;
public int d = 40;
}
// File: com/example/Bar.java
package com.example;
public class Bar extends Foo {
public void print() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
Bar sınıfının print metodu çağrıldığında ne olur?
A) 10, 20, 30 ve 40 çıktısını alırız.
B) 10, 20 ve 40 çıktısını alırız.
C) Derleme hatası alırız.
D) Çalışma zamanında bir hata oluşur.
Soru 2:
Aşağıdaki kod parçasına bakın:
java
Copy code
// File: com/example/Foo.java
package com.example;
public class Foo {
private int a = 10;
public class Bar {
public int getA() {
return a;
}
}
}
// File: com/example/Test.java
package com.example;
public class Test {
public static void main(String[] args) {
Foo foo = new Foo();
Foo.Bar bar = foo.new Bar();
System.out.println(bar.getA());
}
}
Bu kod çalıştırıldığında ne olur?
A) "10" çıktısını alırız.
B) Bar sınıfı a'yı bulamaz ve derleme hatası alırız.
C) Test sınıfı getA() metodunu bulamaz ve derleme hatası alırız.
D) Çalışma zamanında bir hata oluşur.
Soru 1 Çözümü:
Doğru yanıt C seçeneğidir.
Bar sınıfı, Foo sınıfını genişletir ve Foo sınıfındaki a, b ve d alanlarına erişebilir çünkü a (package-private), b (protected) ve d (public) erişim belirleyicilerine sahip. Ancak Foo sınıfındaki c alanına private olduğu için erişemez. Bu yüzden System.out.println(c); satırı bir derleme hatası verecektir.
Soru 2 Çözümü:
Doğru yanıt A seçeneğidir. "10" çıktısını alırız.
Bar bir iç sınıf olduğu için Foo sınıfının tüm üyelerine (halka açık, korunan, paket özel veya özel) erişebilir. Bu, Bar'ın Foo'nun a alanına erişimine ve bu değeri çıktıya yazmasına olanak sağlar.
// File: com/other/Child.java
package com.other;
import com.example.Parent;
public class Child extends Parent {
public void printX() {
System.out.println(x);
}
}
// File: com/other/Test.java
package com.other;
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.printX();
}
}
Bu kod çalıştırıldığında ne olur?
A) "5" çıktısını alırız
B) Child sınıfı x'i bulamaz ve derleme hatası alırız
C) Test sınıfı x'i bulamaz ve derleme hatası alırız
D) Çalışma zamanında bir hata oluşur
Soru 2:
Aşağıdaki kod parçasına bakın:
java
Copy code
// File: com/example/Base.java
package com.example;
public class Base {
private String secret = "Shh!";
protected String getSecret() {
return secret;
}
}
// File: com/other/Derived.java
package com.other;
import com.example.Base;
public class Derived extends Base {
public void spill() {
System.out.println(getSecret());
}
}
// File: com/other/Test.java
package com.other;
public class Test {
public static void main(String[] args) {
Derived derived = new Derived();
derived.spill();
}
}
Bu kod çalıştırıldığında ne olur?
A) "Shh!" çıktısını alırız
B) Derived sınıfı getSecret() metodunu bulamaz ve derleme hatası alırız
C) Test sınıfı getSecret() metodunu bulamaz ve derleme hatası alırız
D) Çalışma zamanında bir hata oluşur
Tabii ki, soruların çözümlerini aşağıda bulabilirsiniz:
Soru 1 Çözümü:
Doğru yanıt A seçeneğidir. "5" çıktısını alırız.
Child sınıfı, Parent sınıfını extend eder ve Parent sınıfındaki protected alan x'e erişebilir. Bu durum, protected alanların aynı paket içindeki veya farklı bir paketteki alt sınıflar tarafından erişilebilir olduğunu gösterir.
Soru 2 Çözümü:
Doğru yanıt A seçeneğidir. "Shh!" çıktısını alırız.
Derived sınıfı, Base sınıfını extend eder ve getSecret() metodu protected olduğu için Derived sınıfından erişilebilir hale gelir. Bu, Derived sınıfının getSecret() metodunu çağırarak secret değerini çıktıya yazdırmasına olanak sağlar. Erişim belirleyicileri ve kalıtım hakkındaki bu bilgi, Java Sertifikasyonu (Java OCP) için önemli bir konudur. Bu örnek, protected alanların veya metodların, onları extend eden alt sınıflar tarafından nasıl kullanılabileceğini göstermektedir.
Soru:Farklı bir pakette yer alan child class'ın metodunda parent class'ın bir instance'nı oluştursak bu objenin protected alanına erişebilir miyiz? Örnek bir kodla açıklar mısın?
Erişemez. aşağıda örnek bir kod verilmiştir.
package package1;
public class ParentClass {
public void testPublic() {
}
protected void testProtected() {
}
}
package package2;
import package1.ParentClass;
public class ChildClass extends ParentClass {
void test() {
ParentClass par = new ParentClass();
par.testProtected(); // Line 1 : ERROR: testProtected() has protected access in ParentClass
testProtected(); // Line 2 : No error
ChildClass ch = new ChildClass();
ch.testProtected(); // Line 3 : No ERROR
testProtected(); // Line 4 : No error
}
}