SE_21_Lesson_12: Abstraction, Abstract class, Interface

-> Abstract class. Athlete misali uzarinde problem ve problemin abstract class ishletmekle helli

package org.example3;

public class Athlete {
public void run() {
System.out.println("Athletes run");
}

public void grapple() {
System.out.println("Athletes grapple");
}

public void swim() {
System.out.println("Athletes swim");
}
}
package org.example3;

public class Runner extends Athlete{

public void run() {
System.out.println("Runners run");
}
}
package org.example3;

public class Grappler extends Athlete{

public void grapple() {
System.out.println("Grapplers grapple");
}
}
package org.example3;

public class Swimmer extends Athlete{

public void swim() {
System.out.println("Swimmers swim");
}
}

Burada birinci problem ondan ibaretdir ki, biz yeni mes. Footballer klasi initialize edende ola bilerki yadimizdan cixar Athlete klasindan extend elemek, bu zaman biz ierarxiyani itireceyik.

todo: duzelish et


Lakin abstract klass yaradanda ise bu problem qismen aradan qalxir:

package org.example3;

public abstract class Athlete {
public abstract void run();

public abstract void grapple();

public abstract void swim();
}

package org.example3;

public class Grappler extends Athlete{

@Override
public void run() {
System.out.println("Grappler runs");
}

@Override
public void grapple() {
System.out.println("Grappler grapples");
}

@Override
public void swim() {
System.out.println("Grappler swimms");
}
}

package org.example3;

public class Runner extends Athlete{


@Override
public void run() {
System.out.println("Runner runs");
}

@Override
public void grapple() {
System.out.println("Runner grapples");
}

@Override
public void swim() {
System.out.println("Runner swims");
}
}

package org.example3;

public class Swimmer extends Athlete{


@Override
public void run() {
System.out.println("Swimmer runs");
}

@Override
public void grapple() {
System.out.println("Swimmer grapples");
}

@Override
public void swim() {
System.out.println("Swimmer swims");
}
}

Burada problemi qismen aradan qaldirdiq, lakin gelecekde goreceyikki bundan da yaxshi solutionlar var.


->Abstract klasdan extend etdikde metodlarinin implement (Override) etmemek olarmi?

Xeyr olmaz. Cunki bu zaman abstract klasin tipine onun subklasini menimsetsek ve implement etmediyimiz metodu cagirsaq bu zaman ne olacaq? Bu da cavab.


-> Abstract klasda konkret metodlar yazmaq

package org.example3;

public abstract class Athlete {
public abstract void run();

public abstract void grapple();

public abstract void swim();

public void runThenGrappleThenSwim() {
run();
grapple();
swim();
}

public void concreteMethod() {
System.out.println("This is concrete(normal) method in abstract class");
}
}
package org.example3;

public class Main {
public static void main(String[] args) {
Athlete athlete = new Swimmer();
athlete.runThenGrappleThenSwim();
}

} 


-> Abstract klasin obyektini yaratmaq

Bu zaman arxa planda anonim klass yaranir ve hemin JVM terefinden yaranmish klass abstrack klassdan extend edir.


-> Interface anlayishi. Default olaraq body-siz metodlar public abstract-dir. Deyisheni ise default olaraq public static final-dir.

package org.example3;

public interface CanRun {
public static final int a = 3;
public abstract void run();
}

Interface-ler neye gore onemlidir: mes. biz yeni bir Student clasi yaratsaq ve istesek ki onun run metodu olsun, Athlete abstract kasindan extend evezine CanRun interfacesinden implement elemeyi daha dogrudur, hem ierarxiya baximdan hem de burada Single Responsibility prinsipini qorumush oluruq.


-> Neye gore Interface-lere default metodlar gelib?

Ona gore ki, bir muddet sonra Interface-ye yeni metod elave etsek butun ondan implement edek klaslar mecbur wekilde metodu implement etmelidir. Lakin default metodla bunu aradan qaldirmaq olar.

Bawqa bir numune ise: Java 8 versiyada Stream API geldi:


List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.stream().forEach(System.out::println);


-> Interface-lerde casting problemi

package org.example5;

public class Person {
}
package org.example5;

public interface Runnable {

void run();
}
package org.example5;

public class Runner implements Runnable{
@Override
public void run() {
System.out.println("Runner runs faster than usual person");
}
}
package org.example5;

public class Swimmer {
}
package org.example5;

public class Main {
public static void main(String[] args) {
Runner runner = new Runner();
Runnable runnable = runner;

Swimmer swimmer = new Swimmer();
Runnable runnable1 = (Runnable) swimmer;

// Lakin
Swimmer swimmer1 = new Swimmer();
Runner runner1 = (Runner) swimmer1;
}
}

Niye bele bash verir? Cunki compiler birbasha extend-i gore bilir lakin imlementi sanki gore bilmir. Compiler ehtiyat gudur ki, ola bilsinki senin downcast etdiyin klasin superclas-i interface implement edib:





package org.example5;

public class Swimmer extends Person{
}
package org.example5;

public class Person implements Runnable {
@Override
public void run() {
System.out.println("Person runs");
}
}


Bawqa bir numune:

package org.example5;

public class A {
}
package org.example5;

public class C {
}
package org.example5;

public interface B {
}
package org.example5;

public class Main {
public static void main(String[] args) {
B b = (B) new A();
C c = (C) new A();
}
}

Aritq aciq aydin gorsenir!



-> Marker Interface nedir?

Mes: Serializable interface-si

Birde marker interface-ler filter rolunu oynayir. Sade bir misal:

package org.example5;

public class Main {
public static void main(String[] args) {
Object[] objects = {new A(), new C()};
}

public static void foo(Object[] objects) {
for(Object o : objects) {
if(o instanceof B) {
// do something
}
}
}
}


-> Interface-in esas ustunluklerinden biri, bir klas bir nece Interfaceni imlement ede biler eger diamond problemi yoxdursa. Gozel numune: Bir klas Thread klasindan extend ede biler, veya Runnable interface-ni implement ede biler. Tebi ki, ustun tutulan implementdir.









Комментарии

Популярные сообщения из этого блога

IoC:ApplicationContext, BeanFactory. Bean

Lesson1: JDK, JVM, JRE

Lesson_2: Operations in Java