>  기사  >  Java  >  Java 추상 클래스와 인터페이스를 마스터하는 방법은 무엇입니까?

Java 추상 클래스와 인터페이스를 마스터하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-05-08 08:16:071099검색

    abstract

    추상 소개: 수정에 사용할 수 있음: 클래스(추상 클래스), 메소드(추상 메소드)

    추상 수정 클래스:

    ① 이 클래스는 인스턴스화할 수 없습니다(즉, 이 클래스의 객체). 생성 불가) )

    ②스스로 인스턴스화할 수는 없지만 하위 클래스는 상위 클래스의 생성자를 호출하므로 추상 클래스에 생성자가 있어야 합니다.

    추상 수정 방법

    ①추상 메소드에는 메소드 선언만 있고 메서드 본문이 없습니다. 해당 클래스가 있는 클래스는 추상 클래스여야 합니다. 클래스가 추상 클래스가 아니면 이 클래스는 객체를 생성할 수 있고, 객체를 생성할 수 있으면 호출할 수 있기 때문입니다. 반대로 추상 클래스에는 추상 메소드가 있을 수 없습니다.

    ② 하위 클래스가 상위 클래스의 모든 추상 메서드를 다시 작성하는 경우 인스턴스화할 수 있습니다. 모두 다시 작성되지 않으면 하위 클래스도 추상 클래스이므로 추상으로 수정해야 합니다.

    3Abstract는 private 메소드, static 메소드, final 키워드로 수정된 메소드, final 키워드로 수정된 클래스에는 사용할 수 없습니다.

    Final은 분명히 상속될 수 없지만 abstract는 하위 클래스 상속이 필요하므로 사용할 수 없습니다. 두 메서드가 모두 정적이면 두 메서드가 재정의되거나 재정의된 것으로 간주되지 않으므로 추상은 정적 메서드를 수정하는 데 사용되며 재정의될 수 없습니다. .

    추상적 응용

    템플릿 메소드 디자인 패턴. 소프트웨어 개발에서 알고리즘을 구현할 때 전체 단계는 매우 고정되어 있으며 일반적입니다. 이러한 단계는 상위 클래스에 작성되며 일부 불안정하고 불확실한 부분은 하위 클래스에서 구현하기 위해 추상화될 수 있습니다.

    추상 클래스의 익명 하위 클래스 객체

    public static void main(String[] args){
        //匿名对象
        eat(new son());
        //非匿名类的非匿名对象
        son John=new son();
        eat(John);
        //匿名子类对象
        father f=new father(){//抽象类造对象必须要重写方法,了解看得懂就ok了。
            @Override
            public void work() {
            }
            @Override
            public void info(father i) {
            }
        };
    }
    //普通方法
    public static void eat(father f){
        System.out.println("吃饭");
    }
    //父类
    public abstract static class father{
        String name;
        int age;
        public abstract void work();//抽象方法不能有方法体
        public abstract void info(father i);
    }
    //子类
    public class son extends father{//继承
        String name;
        int age;
        @Override
        public void work(){
            System.out.println("上学");
        }
        @Override
        public void info(father i) {
            System.out.println("name:"+i.name+" age:"+i.age);
        }
    }
    //接口的匿名对象
    非匿名的对象可以被多次调用,匿名的对象只能使用一次
    Computer com=new Computer();//创建了接口的非匿名实现类(子类)的非匿名对象,类和对象都是有名的
    Flash flash = new Flash();
    //2.创建了接口的非匿名实现类的匿名对象,对象匿名了
    com.transferData(new Printer());
    //3创建了接口的匿名实现类的非匿名对象,就是类是匿名的,就不知道是接口中的哪个实现类,所以 需要重写方法进行说明
    USB  phone = new USB{
        public void start(){
            ...
        }
    };
    //4.创建了接口的匿名实现类的匿名对象
    com.transferData(new USB(){
        public void start(){
            ...
        }  
        });

    최종 키워드

    최종 수정 클래스: 이 클래스는 String, System, StringBuffer

    와 같은 다른 클래스에서 상속될 수 없습니다. 최종 수정 메서드: 이 메서드는 더 이상 재정의될 수 없습니다. 예: Object 클래스의 getClass()

    static final은 속성을 수정하는 데 사용됩니다. 전역 상수

    최종 수정 변수: 이때 변수를 상수

    최종 수정 속성이라고 합니다. 할당: 명시적 수식 초기화, 코드 블록에서 초기화, 생성자에서 초기화

    지역 변수의 최종 수정: 특히 형식 매개변수를 final로 수정하는 경우 형식 매개변수가 상수임을 나타냅니다. 이 메서드가 호출되면 실제입니다. 매개변수는 상수 형식 매개변수에 할당됩니다. 한번 할당되면 이 형식 매개변수는 메소드 본문에서만 사용할 수 있으며 재할당은 불가능합니다

    Interface

    인터페이스는 클래스와 병렬 관계에 있는 인터페이스를 사용하여 정의됩니다

    정의 인터페이스 및 인터페이스 멤버:

    인터페이스 관련 규칙

    1. 인터페이스의 모든 메서드는 추상입니다.

    2. 인터페이스의 멤버는 공개적으로 표시되지 않더라도 공개 액세스 유형입니다.

    3. 인터페이스의 변수는 기본적으로 public static final로 표시되므로 인터페이스에 정의된 변수는 다음과 같습니다. 전역 정적 상수입니다.

    4. 새 인터페이스를 정의하고 확장을 사용하여 기존 인터페이스를 상속할 수 있습니다.

    5. 클래스를 정의하고 구현을 사용하여 인터페이스의 모든 메서드를 구현할 수 있습니다.

    6. 추상 클래스를 정의하고 구현을 사용하여 인터페이스에서 일부 메서드를 구현할 수 있습니다.

    인터페이스의 특징

    1. 인터페이스는 인스턴스화할 수 없습니다

    2. 클래스를 구현하려면 인터페이스의 모든 메서드를 구현해야 합니다.

    3. 인터페이스의 변수는 정적 상수입니다. 클래스가 인터페이스의 모든 추상 메서드를 다루더라도 인스턴스를 만들 수 있습니다. 클래스가 인터페이스의 모든 추상 메서드를 다루지 않으면 클래스는 여전히 추상 클래스입니다. Java 클래스는 다중 인터페이스 구현 가능 - 단일 상속의 단점 보완

    class AA 확장 BB 구현 CC, DD, EE

    인터페이스는 서로 상속이 가능하며 다중 상속이 가능합니다. 인터페이스의 사용은 다형성을 반영합니다. 인터페이스는 인터페이스에 대한 사양, 프로그래밍입니다.

    추상 클래스와 인터페이스의 유사점과 차이점

    유사점: 인스턴스화할 수 없으며 둘 다 추상 메서드를 포함할 수 있습니다.

    차이점:

    1 추상 클래스와 인터페이스(java7, java8)의 정의와 내부 구조를 설명하세요. 2. 클래스: 단일 상속, 인터페이스: 다중 상속.

    추상 클래스 및 인터페이스에 대한 연습

     abstract class Door {
        //开门
        public abstract void openDoor();
        //关门
        public abstract void closeDoor();
    }
     interface Lock {
        public static final int num = 200;
        //开锁
        public abstract void openLock();
        //上锁
        public abstract void closeLock();
    }
    class LockDoor extends Door implements Lock {
        public void openDoor() {
            System.out.println("开门");
        }
        public void closeDoor() {
            System.out.println("关门");
        }
        public void openLock() {
            System.out.println("开锁");
        }
        public void closeLock() {
            System.out.println("上锁");
        }
      }
    public class TestLockDoor {
        public static void main(String[] args) {
            LockDoor lockDoor = new LockDoor();
            lockDoor.openLock();
            lockDoor.openDoor();
            lockDoor.closeDoor();
            lockDoor.closeLock();
        }
    }

    인터페이스 적용

    두 가지 디자인 패턴

    -프록시 패턴

    프록시 디자인은 이 객체에 대한 액세스를 제어하기 위해 다른 객체에 프록시를 제공하는 것입니다.

    응용 시나리오: 보안 프록시, 원격 프록시, 지연 로딩

    분류: 정적 프록시, 동적 프록시

    -팩토리 패턴

    생성자와 호출자의 분리를 실현

    interface A{
        int x=0;
    }
    class B{
        int x=1;
    }
    class C extends B implements A{
        public void pX(){
            System.out.println(x);
        }
        public static void main(String[] args){
            new C().pX();
        }
    }
    //问题:编译期不知道是要输出哪个x
    System.out.println(super.x);//这个调用的是父类中的
    System.out.println(A.x);//这个调用的是接口中的

    java8

    JDK8의 새로운 인터페이스 기능: 전역 상수 및 추상 메서드 외에도 정적 메서드와 기본 메서드도 정의할 수 있습니다(기본 키워드 수정)

    public interface CompareA{  
      public static void method1(){
      //静态方法        
      System.out.println("CompareA:北京");   
       }   
        public default void method2(){
        //默认方法        
        System.out.println("CompareA:上海");   
         }
      }

    인터페이스에 정의된 정적 메서드는 인터페이스인 interface.method를 통해서만 호출할 수 있습니다.

    클래스의 객체를 구현하면 인터페이스에서 기본 메소드인 object.method를 호출할 수 있습니다.

    구현 클래스가 인터페이스의 기본 메서드를 재정의하는 경우 재정의된 메서드는 호출 시 계속 호출됩니다.

    하위 클래스(또는 구현 클래스)가 상속한 상위 클래스와 구현된 인터페이스가 동일한 이름과 동일한 이름을 선언하는 경우 매개변수 메서드, 하위 클래스가 이 메서드를 재정의하지 않으면 상위 클래스의 메서드를 호출합니다 - 클래스 우선순위 원칙

    如果实现类实现了多个接口,而这个多个接口中定义了同名同参数的默认方法,在实现类没有重写方法的情况下会报”接口冲突“错误,此时需要重写。

    如何在子类(或者实现类)调用父类、接口中被重写的方法? 接口.super.方法。

    内部类

    需要关注的问题:如何实例化成员内部类的对象:外部类Person,静态内部类Brain,非静态内部类Lungs,静态成员内部类:new 外部类.内部类()

    Person.Brain brain=new Person.Brain();

    非静态成员内部类:先造对象,对象.new 内部类()

    Person p=new Person();
    p.Lungs lungs=p.new Lungs();

    如何在成员内部类中区分调用外部类的结构

    形参直接调,所在类的用this.结构,外部类的用外部类.this.结构

    成员内部类和局部内部类在编译以后都会生成字节码文件

    成员内部类:外部类.内部类名.class

    局部内部类:外部类.数字 内部类名.class

    在局部内部类的方法中,如果调用局部内部类所在的方法中的局部变量,该局部变量必须用final关键字修饰(JAVA8之后可以不写出来,但仍然还是final的)

    public void Person(){
        int num=10;
        class AA{//局部内部类
            public void show(){//局部内部类的方法
                num=20;//试图修改会报错
                System.out.println(num);//调用局部内部类所在的方法中的局部变量
            }
        }
    }

    开发中局部内部类的使用

    常用的局部内部类:

    //方式一
    public Comparable getCompareble(){
        class MyComparable implements Comparable{//局部内部类
    
            public int compareTo(Object o){
                return 0;
            }
        }
        return new MyComparable();
    }
    //方式二
    public Comparable getCompareble(){
        return new Comparable(){
    
            public int CompareTo(Object o){
                return 0;
            }
        };
    }

    Java允许将一个类A声明在另一个类B中,A为内部类,B为外部类

    内部类的分类:成员内部类、局部内部类(方法内,代码块内,构造器内)

    成员内部类

    作为外部类的成员:可以调用外部类的结构,可以被static修饰

    作为一个类:可以定义属性、方法、构造器,可以用final、abstract修饰,可以被继承

    this.name//内部类的属性

    Person.this.name//外部类的属性

    위 내용은 Java 추상 클래스와 인터페이스를 마스터하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제