최종 키워드
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("猫吃鱼");
}
}