자바의 최종 키워드, 인터페이스, 다형성

최종 키워드

final 키워드는 최종 의미이며 수정 가능 (메서드, 변수, 클래스)

최종 수정의 특징

수정 방법 : 해당 방법이 최종 방법이며 재정의 할 수 없음을 나타냅니다.

수정 된 변수 : 변수가 상수이며 다시 할당 할 수 없음을 나타냅니다.

수정 된 클래스 : 클래스가 최종 클래스이며 상속 될 수 없음을 나타냅니다.

/ 변수는 스택에 저장됩니다.

/ 새로운 것들이 힙에 저장됩니다.

 基本数据类型变量:其值不能被更改
//常量的命名规范:如果是一个单词,所有字母大写,如果是多个单词,所有字母大写
   //但中间需要使用_分隔
   final int NAX = 10;
   final int MAX_VALUE = 20;
引用数据类型变量:内存地址不能被更改,但是可以修改对象的属性值
    final  Student stu = new Student();
        stu.setName("张三");
        stu.setName("李四");
 //final修饰成员变量 初始化时机
    //1.在创建的时候,直接给值
    //2.在构造方法结束之前,完成赋值

코드 블록 :

{}로 묶인 코드를 코드 블록이라고합니다.

부분 코드 블록 :

위치 : 방법에 정의

역할 : 변수의 수명주기를 제한하고 조기에 릴리스하며 메모리 활용도를 개선합니다.

코드 블록 구성 :

위치 : 클래스의 메서드 외부

특징 : 시공 방법이 실행될 때마다 시공 방법이 실행되기 전에 코드 블록이 실행되고 실행됩니다.

기능 : 코드의 재사용 성을 향상시키기 위해 여러 구성 방법의 동일한 코드를 구성 코드 블록으로 추출

정적 코드 블록 :

위치 : 클래스의 메서드 외부

특징 : 정적 키워드로 수정하고, 클래스 로딩과 함께로드하고, 한 번만 실행해야합니다.

기능 : 클래스가로드 될 때 데이터 초기화 작업을 수행합니다. 일반적으로 드라이버를 설치하는 데 사용됩니다.

상호 작용:

더 많이 실현

클래스의 모든 메소드가 추상 메소드 인 경우 인터페이스로 정의 할 수 있습니다.

인터페이스는 또한 참조 데이터 유형이며 추상 클래스보다 더 추상적입니다.

인터페이스 존재의 두 가지 중요한 의미

1. 규칙의 정의

2. 프로그램 확장

인터페이스의 정의 및 특성 :

인터페이스는 키워드 interface로 정의됩니다.

공용 인터페이스 인터페이스 이름 {}

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

인터페이스와 클래스 사이에 구현 관계가 있으며, 이는 implements 키워드로 표시됩니다.

공용 클래스 클래스 이름이 인터페이스 이름 {}을 (를) 구현합니다.

인터페이스 서브 클래스 (구현 클래스)

인터페이스의 모든 추상 메소드를 다시 작성하십시오.

추상 클래스

예:

public class Demo1 {
    
    
    public static void main(String[] args) {
    
    
        Cat c = new Cat();
        c.catchMouse();
        Dog d = new Dog();
        d.catchMouse();
    }
}
interface CM{
    
    
    public abstract void catchMouse();//抽象方法
}
class Cat implements CM{
    
    //接口实现

    @Override
    public void catchMouse() {
    
    //重写方法
        System.out.println("猫抓老鼠");
    }
}
class Dog implements CM{
    
    //接口实现

    @Override
    public void catchMouse() {
    
    //重写方法
        System.out.println("狗拿耗子");
    }
}

참고 : 인터페이스와 클래스 간의 구현 관계는 개별적으로 또는 여러 구현으로 구현 될 수 있습니다.

공용 클래스 클래스 이름이 인터페이스 1, 인터페이스 2 {}를 구현합니다.

public class Test1Interface {
    
    
    /*
    接口定义格式:
    public interface 接口名{}

    类实现接口的格式:
    public class 类名 implements 接口名{}
     */
    public static void main(String[] args) {
    
    
      //Inter i = new Inter();接口不允许创建对象
        InterImpl ii = new InterImpl();
        ii.study();
    }
}
public class InterImpl implements Inter,InterA{
    
    
    @Override
    public void study() {
    
    
        System.out.println("我是实现类中的study方法");
    }

    @Override
    public void print1() {
    
    

    }

    @Override
    public void print2() {
    
    

    }
}
public interface Inter {
    
    
    public abstract void study();
}
public interface InterA {
    
    
    public abstract void print1();
    public abstract void print2();
}
인터페이스의 멤버 기능 :

멤버 변수 :

接口中成员变量只能是常量
系统会默认加入三个关键字:public static final

건설 방법 :

인터페이스에 없음

회원 방법 :

회원 방법 : 추상 방법 만, 시스템은 두 개의 키워드
공개 초록 으로 기본 설정됩니다.

public class TestInterface {
    
    
    /*
    接口中成员变量只能是常量,系统会默认加入三个关键字
       public static final
     构造方法:接口中没有
     成员方法:只能是抽象方法,系统会默认给两个关键字
     public abstract
     */
    public static void main(String[] args) {
    
    
        System.out.println(Inter.NUM);
    }
}
class InterImpl extends Object implements Inter{
    
    //所有的类默认的父类是Object
    public InterImpl(){
    
    
        super();
    }
    public void method(){
    
    
        //num = 20;
        System.out.println(NUM);
    }

    @Override
    public void show() {
    
    

    }
}
interface Inter  {
    
    
    //接口中的变量是常量,默认会被final,static,public关键字修饰
    public static final int NUM = 10;
    //public Inter(){}
    public abstract void show();
}

JDK8 버전의 인터페이스 멤버 기능 :

JDK8 버전 이후 :

1. 인터페이스에서 비추 상 메소드를 정의 할 수 있지만 키워드 default로 수정해야합니다. 이러한 메소드는 기본 메소드입니다.

역할 : 인터페이스 업그레이드 문제 해결

2. 인터페이스에서 정적 정적 메서드를 정의 할 수 있습니다.

인터페이스의 기본 메소드 정의 형식 :

형식 : 공용 기본 반환 값 유형 메서드 이름 (매개 변수 목록) ()

예 : public default void show () ()

인터페이스의 기본 방법에 대한 참고 사항 :

기본 방식은 추상 방식이 아니므로 반드시 재 작성할 필요는 없지만 재 작성은 가능하며 재 작성시 기본 키워드를 제거

public은 생략 할 수 있으며 기본값은 생략 할 수 없습니다.

여러 인터페이스가 구현되고 동일한 메서드 선언이 여러 인터페이스에 존재하는 경우 하위 클래스가 메서드를 재정의해야합니다.

인터페이스의 정적 메서드에 대한 참고 사항 :

1. 정적 메서드는 구현 클래스 이름이나 개체 이름이 아닌 인터페이스 이름으로 만 호출 할 수 있습니다.

2. public은 생략 할 수 있고 static은 생략 할 수 없습니다.

클래스와 인터페이스 간의 관계 :

클래스와 클래스 간의 관계 :

상속 관계, 단일 상속 만, 다 계층 상속

클래스와 인터페이스 간의 관계 :

실현 관계는 단일 또는 다중 구현으로 구현 될 수 있으며, 클래스를 상속하는 동료에서 다중 인터페이스를 구현할 수 있습니다.

// 부모 클래스와 인터페이스에 동일한 메서드 선언이있는 경우 부모 클래스

인터페이스와 인터페이스 간의 관계 :

상속 관계는 단일 상속 또는 다중 상속 일 수 있습니다.

다형성 :

전달 매개 변수는 상위 클래스를 전달합니다.

부모 클래스 참조는 자식 클래스 개체를 가리 킵니다.

다른 순간에 다른 형태의 동일한 개체

예 : 고양이

우리는 고양이가 고양이라고 말할 수 있습니다 : cat cat = new cat ();

또한 고양이는 동물이라고 말할 수 있습니다. animal = new cat ();

여기에있는 고양이들은 다른 순간에 다른 형태를 보여줍니다. 이것은 다형성입니다.

다형성의 전제와 표현 :

상속 / 구현 관계 있음

재 작성하는 방법이 있습니다

하위 클래스 개체에 대한 부모 클래스 참조가 있습니다.

예:

public class Test1Polymorphic {
    
    
    /*
    多态的前提:
    1.要有(继承\实现)关系
    2.要有方法重写
    3.要有父类引用,指向子类对象

     */
    public static void main(String[] args) {
    
    

        //当前事物是一只猫
        Cat c = new Cat();
        //当前事物是一只动物
        Animal a = new Cat();
        a.eat();
    }
}
class Animal{
    
    
    public void eat(){
    
    
        System.out.println("动物吃饭");
    }
}
class Cat extends Animal{
    
    
    @Override
    public void eat() {
    
    
        System.out.println("猫吃鱼");
    }
}

다형성에서 멤버 액세스의 특징 :

생성 방법 : 상속과 마찬가지로 하위 클래스는 super를 통해 부모 클래스 생성 방법에 액세스합니다.

멤버 변수 : 컴파일 및 왼쪽보기 (상위 클래스), 왼쪽보기 (상위 클래스) 실행

멤버 메서드 : 컴파일 및 왼쪽 (상위 클래스)보기, 실행 및 오른쪽보기 (상위 클래스)

public class Test2Polymorphic {
    
    
    /*
    多态成员访问特点:
    成员变量:编译看左边(父类),执行看左边(父类)
    成员方法:编译看左边(父类),执行看右边(父类)
     */
    public static void main(String[] args) {
    
    
        Fu f =new Zi();
        System.out.println(f.num);//10,但必须有父类中的num
        f.method();//Zi...method   父类中必须有method()方法
    }
}
class Fu{
    
    
    int num =10;
    public  void method(){
    
    
        System.out.println("Fu...method");
    }
}
class Zi extends Fu{
    
    
    int num = 20;
    public void method(){
    
    
        System.out.println("Zi...method");
    }
}

멤버 변수와 멤버 메서드의 액세스가 다른 이유는 무엇입니까?

1. 멤버 메서드는 다시 작성되지만 멤버 변수는

다형성의 장단점 :

이점 : 코드 확장 성 향상

특정 실시 예 : 메서드를 정의 할 때 부모 유형을 매개 변수로 사용하여 메서드는이 부모 클래스의 모든 자식 개체를 허용 할 수 있습니다.

단점 : 하위 클래스 별 함수를 호출 할 수 없습니다.

예:

public class Test3Polymorphic {
    
    
    public static void main(String[] args) {
    
    
        useAnimal(new Dog());
        useAnimal(new Cat());
    }
    public  static  void useAnimal(Animal a){
    
    
        a.eat();
    }
}
abstract class Animal{
    
    
    public abstract void eat();
}
class Dog extends Animal{
    
    

    @Override
    public void eat() {
    
    
        System.out.println("狗吃肉");
    }
}
class  Cat extends Animal{
    
    

    @Override
    public void eat() {
    
    
        System.out.println("猫吃鱼");
    }
}

다형성의 변형 :

상향 변화 : 아들에서 아버지로

부모 자식 클래스 개체에 대한 참조

하향 변환 : 부모에서 자식으로

하위 클래스 개체에 대한 부모 클래스 참조

예:

public class Test4Polymorpic {
    
    
    public static void main(String[] args) {
    
    
        //1.向上转型:从子到父
        //     父类引用指向子类对象

        Fu f = new Zi();
        f.show();
        //多态的弊端 不能调用子类特有的功能
        //f.method();

        //A.直接创建子类对象
        //B.向下转型
        //2.向下转型:从父到子
        //   父类引用转为子类对象  强制转换
        Zi z = (Zi)f;
        z.method();
    }
}
class Fu{
    
    

    public  void show(){
    
    

        System.out.println("Fu...show");
    }
}
class Zi extends Fu {
    
    
    @Override
    public void show()
    {
    
    
        System.out.println("Zi...show");
    }

    public void method() {
    
    
        System.out.println("我是子类特有的方法,method");
    }
}
다형성에서 변형의 위험

변환 된 참조 유형 변수, 해당 실제 유형 및 대상 유형이 동일한 유형이 아닌 경우 변환시 이름이 ClassCastException으로 표시됩니다.

강제 전송 문제 방지

키워드 : instanceof

사용 형식 :

변수 이름 instanceof type

대중적인 이해 : 키워드 왼쪽에있는 변수가 오른쪽에있는 유형인지 확인하고 부울 유형의 결과를 반환합니다.

예:

public class Test3Polymorphic {
    
    
    public static void main(String[] args) {
    
    
        useAnimal(new Dog());
        useAnimal(new Cat());
    }
    public  static  void useAnimal(Animal a){
    
    

        a.eat();
        if(a instanceof  Dog){
    
    
            Dog dog = (Dog) a;
            dog.watchHome();//ClassCastException类型转换异常
        }
       // Dog dog = (Dog) a;
       // dog.watchHome();//ClassCastException类型转换异常
    }
}
abstract class Animal{
    
    
    public abstract void eat();
}
class Dog extends Animal{
    
    

    @Override
    public void eat() {
    
    

        System.out.println("狗吃肉");
    }
    public void watchHome() {
    
    

        System.out.println("看门");
    }

}
class  Cat extends Animal{
    
    

    @Override
    public void eat() {
    
    

        System.out.println("猫吃鱼");
    }
}

추천

출처blog.csdn.net/qq_42073385/article/details/108039626