>  기사  >  Java  >  04.Java 기초 - 클래스

04.Java 기초 - 클래스

黄舟
黄舟원래의
2017-02-27 10:20:121636검색

기본 개념

객체 지향 개념에서는 모든 객체가 클래스로 표현된다는 것을 알고 있습니다.

Java에서 클래스는 class라는 키워드로 정의됩니다.

마찬가지로 Java의 클래스에는 일반 클래스, 추상 클래스, 내부 클래스 등 다양한 형태가 있습니다.

내부 클래스에는 멤버 내부 클래스, 로컬 내부 클래스, 익명 내부 클래스, 정적 내부 클래스가 포함됩니다.


보통형

이건 할 말이 없습니다.

public class Demo { }

추상 클래스

1. 기본 개념

위에서 언급했듯이 모든 객체는 클래스를 통해 전달됩니다. 설명하기 위해 모든 클래스가 객체를 설명하는 데 사용되는 것은 아닙니다.

클래스에 특정 객체를 설명하기에 충분한 정보가 포함되어 있지 않은 경우(불완전한 클래스로 이해할 수 있음) 이러한 클래스는 추상 클래스입니다.

추상 클래스는 absract 키워드로 정의됩니다. 여기에는 추상 메서드와 비추상 메서드가 포함될 수 있습니다.


2. 예시 연구

  • 추상 클래스 정의

public abstract class Parent {

    // 1.成员变量,与普通类无差别
    private  String word="aa";    // 2.非抽象方法,与普通类无差
    private void talk(){
        System.out.println("Parent is talking");
    }    // 3.抽象方法,访问权限只能是 public 和 protected 
    abstract void print();
}
  • 추상 클래스 상속

// 1.抽象类继承抽象类,抽象子类不用实现父类的方法public abstract class Son extends Parent { }
// 2.普通类继承抽象类,普通子类必须实现父类的所有抽象方法public class Grandson extends Son {
    @Override
    void print() {
        System.out.println("I am Grandson");
    }
}
  • 추상 클래스 호출

// 错误,抽象类不允许被实例化//Parent parent = new Parent();

위 코드를 통해 다음과 같은 점을 정리할 수 있습니다.

  • 추상 클래스와 추상 메서드는 private으로 수정할 수 없으며, 키워드는 abstract로 사용해야 합니다. 정의.

  • 하위 클래스가 추상 클래스가 아닌 경우 상위 클래스의 모든 추상 메소드를 구현해야 합니다.

  • 추상 클래스는 인스턴스화할 수 없습니다. 컴파일 오류입니다.

  • 추상 클래스에는 일반 메서드와 멤버 변수도 포함될 수 있습니다.


회원 내부 클래스

1. 기본 개념

클래스 내부에 위치 이 클래스를 멤버 내부 클래스라고 합니다.

멤버 내부 클래스에는 다음과 같은 특징이 있습니다. 외부 클래스의 모든 속성은 특별한 조건 없이 액세스할 수 있습니다.

2. 예시 연구

  • 멤버 내부 클래스 정의:

public class Outter {
    private int a = 10;    static int b = 20;    int c = 30;    // 内部类
    class Inner {        void print(int d) {
            System.out.println(a + "-" +b+ "-" +c+ "-" + "-" +d;
        }
    }    // 取得内部类
    Inner getInner() {        return new Inner();
    }
}
  • 멤버 내부 클래스 호출

Outter out = new Outter();// 创建内部类的两种方式:
Outter.Inner inner = out.new Inner();Outter.Inner inner2 = out.getInner();inner.print(20);

3. 원리 분석

클래스 파일을 디컴파일하면 다음과 같은 명령어가 나옵니다.

javap -v Outter

명령을 실행하면 Oututter.Class와 Oututter$Inner.Class라는 두 개의 클래스 파일이 생성됩니다.

가상머신의 경우 내부 수업은 실제로는 일반 수업과 동일하다는 설명입니다. 따라서 Inner는 여전히 Outter 클래스의 특정 필드가 아닌 독립적인 클래스로 컴파일됩니다.

그러나 멤버 내부 클래스는 외부 클래스의 멤버처럼 보이기 때문에 멤버와 동일한 액세스 권한을 가질 수 있습니다.


로컬 내부 클래스

1. 기본 개념

로컬 내부 클래스에는 두 가지 유형이 있습니다. 🎜>

  • 메서드 내의 클래스입니다.

  • 범위 내 클래스입니다.

은 메소드나 범위의 내부 지역 변수로 간주될 수 있으므로 해당 메소드나 범위에 대한 액세스 권한이 제한됩니다.

로컬 변수와 마찬가지로 public, protected, private, static 키워드로 수정할 수 없습니다.

2. 예시 학습
public class Man {
    public Object getWoman() {        // 注意:三个变量都相互不受影响
        int age = 30;        // 1.方法内的类
        class Woman {            int age = 20;
        }        // 2.作用域内的类,此时作用域为 if 
        if(true){
            class Son{                int age = 10;
            }
        }   
        return new Woman();
    }
}


익명 내부 클래스

기본 개념

익명 내부 클래스는 생성자가 없는 유일한 클래스입니다. 이 기능으로 인해 익명 내부 클래스의 사용 범위는 매우 제한적이며 대부분

인터페이스 콜백

에 사용됩니다. 다음과 같은 특징이 있습니다.

    익명 내부 클래스는 컴파일 중에 시스템에 의해 자동으로 Oututter$1.class라는 이름이 지정됩니다.
  • 익명 내부 클래스는 일반적으로 다른 클래스를 상속하거나 인터페이스를 구현하는 데 사용됩니다. 추가 메소드를 추가할 필요는 없으며 상속된 메소드만 구현하거나 다시 작성합니다.
  • 익명의 내부 클래스는 변수가 최종 유형
  • 으로 선언되지 않는 한 외부 클래스 메서드의

    로컬 변수
  • 에 액세스할 수 없습니다. 🎜>
2. 예제 연구

public class Test {
    // a 属于全局变量
    int a =100;    public static void main(String[] args) {
        Test t = new Test();
        t.test(200);
    }    // b 属于局部变量
    public void test(final int b) {        // c 属于局部变量
        final int c = 300;        //  匿名内部类
        new Thread() {            int  d = 400;            public void run() {
                System.out.println(a+"-"+b+"-"+c+"-"+d);
            };
        }.start();
    }
}

3. 원리 분석

Outter 명령을 디컴파일하면 두 개의 클래스 파일을 얻을 수 있습니다. .class 및 Oututter$1.class.

로컬 변수의 생명주기에 대하여:

메서드가 호출되면 스택에 로컬 변수가 생성됩니다. 메서드가 끝나면 스택에서 제거되고 지역 변수는 종료됩니다.
  • 내부 클래스 객체 선언 주기 정보:

익명 내부 클래스 객체를 생성하면 시스템은 객체에 메모리를 할당합니다. 변수는 GC에 의해 처리되기 전에 객체에 할당된 메모리에 대한 지점을 참조합니다.
  • 그래서 다음과 같은 상황이 발생했습니다.

멤버 메서드가 끝까지 호출되어 지역 변수가 죽었으나 개체가 익명의 내부 클래스는 아직 살아있습니다.
  • 그래서 Java에서는 문제를 해결하기 위해 마지막 키워드 + 복사 방법을 사용합니다.
    • final 关键字:因为它的特性是一旦变量被赋值后,就不能被修改。

    • 复制:在匿名内部类中直接复制了一个与局部变量值的数,让它变成自己的局部变量。

    所以当局部变量的生命周期结束后,匿名内部类照样可以访问 final 类型的局部变量,因为它自己拷贝了一份,且与原局部变量的值始终一致。

    下面针对上面的代码来分析:

    • 当 test 方法执行完毕之后,变量 b、c 的生命周期就结束了。然而 Thread 对象的生命周期很可能还没有结束。因此要将 b、c 设置为 final 。

    • a 之所以不采用 final 修饰,因为它是全局变量,生命周期是随着类的结束而结束。而类的生命周期肯定大于匿名内部类。


    静态内部类

    1.基本概念

    静态内部类也是定义在一个类里面的类,只不过在类的前面多了一个关键字static

    静态内部类和静态成员变量其实具有相同的特点:

    • 它只有类有关,与对象无关。因此可以在没有外部类对象情况下,创建静态内部类。

    • 不能访问外部类的非静态成员或方法


    2.实例探究

    • 内部静态类定义:

    public class Outter {
        int a = 5;    static int b = 500;    // 静态内部类
        static class Inner {        public Inner() {            // 只能访问外部类的静态成员
                System.out.println(b);
            }
        }
    }
    • 静态内部类调用:

    // 静态内部类的调用不依赖外部类对象Outter.Inner inner= new Outter.Inner();

    接口内部类

    1.基本概念

    接口内部类,顾名思义就是在接口内定义的类。


    2.实例探究

    • 接口内部类定义:

    public interface People{
        class Man {        public void print() {
                System.out.println("man.print()...");
            }
        }
    }
    • 接口内部类调用:

    People.Man  man = new People.Man();

     以上就是04.Java 基础 - 类的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.