ホームページ  >  記事  >  Java  >  04.Javaの基礎 - クラス

04.Javaの基礎 - クラス

黄舟
黄舟オリジナル
2017-02-27 10:20:121596ブラウズ

基本概念

オブジェクト指向の概念では、すべてのオブジェクトがクラスによって表現されることがわかっています。

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();
    }
    コードから次の点を要約できます:

抽象クラスと抽象メソッドは private によって変更できず、キーワード abstract を使用して定義する必要があります。

  • サブクラスが抽象クラスではない場合、親クラスのすべての抽象メソッドを実装する必要があります。

  • 抽象クラスはインスタンス化できません。コンパイルエラーです。

  • 抽象クラスには、通常のメソッドとメンバー変数を含めることもできます。

  • メンバー内部クラス

1. 基本概念

クラスの中にあるクラスをメンバー内部クラスと呼びます。 メンバーの内部クラスには次の特性があります: 外部クラスのすべてのプロパティには、特別な条件なしでアクセスできます。

2. 研究例

メンバー内部クラス定義:

  • // 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();

    3. 逆コンパイルによるクラスファイル、コマンドは次のように:
  • 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();
        }
    }
コマンドを実行すると、Oututter.Class と Oututter$Inner.Class の 2 つのクラス ファイルが得られます。

説明: 仮想マシンの場合、内部クラスは実際には通常のクラスと同じです。したがって、Inner は、Oututter クラスの特定のフィールドではなく、依然として独立したクラスにコンパイルされます。

しかし、メンバーの内部クラスは外部クラスのメンバーのように見えるため、メンバーと同じアクセス権を持つことができます。

部分内部クラス

1. 基本概念

ローカル内部クラスには 2 つのタイプがあります:

メソッド内のクラス。

スコープ内のクラス。
  • メソッドやスコープの内部ローカル変数とみなすことができるため、アクセス権はメソッドやスコープに限定されます。
  • ローカル変数と同様に、public、protected、private、および static キーワードによって変更することはできません。

  • 2. 学習例

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

匿名内部クラス

1. 基本概念

匿名内部クラスはコンストラクターを持たない唯一のクラスです。この機能のため、匿名内部クラスの使用範囲は非常に限定されており、そのほとんどはインターフェース コールバック

に使用されます。

以下の特徴があります:

匿名内部クラスは、コンパイル中にシステムによって自動的に Outter$1.class という名前が付けられます。

匿名内部クラスは、通常、他のクラスを継承したり、インターフェイスを実装したりするために使用されます。追加のメソッドを追加する必要はなく、継承されたメソッドを実装または書き換えるだけです。
  • 変数が最終型として宣言されていない限り、匿名の内部クラスは外部クラスのメソッド内の
  • ローカル変数
  • にアクセスできません

  • 2. サンプルスタディ

    javap -v Outter

3.編逆コンパイル コマンドは、Outter.class と Outter$1.class の 2 つのクラス ファイルを取得できます。

ローカル変数のライフサイクルについて:


メソッドが呼び出されるとき、ローカル変数はスタック上に作成されます。メソッドが終了すると、メソッドはスタックからポップされ、ローカル変数は消滅します。

内部クラスオブジェクトの宣言サイクルについて:

匿名の内部クラスオブジェクトを作成すると、システムはそのオブジェクトにメモリを割り当てます。メモリを指す参照変数がなくなるまで、GC によって処理されません。オブジェクトに割り当てられます。
  • つまり、次のような状況があります:

メンバーメソッドは最後まで呼び出され、ローカル変数は死んでいましたが、匿名内部クラスのオブジェクトはまだ生きています。
  • そこで、Java では、最後のキーワード + copy メソッドが問題を解決するために使用されます:
    • 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 までご連絡ください。