サブクラスはプライベートフィールドを継承しますか?


245

これはインタビューの質問です。

サブクラスはプライベートフィールドを継承しますか?

「通常のOOP方法」ではアクセスできないため、「いいえ」と答えました。しかし、インタビュアーはそれらが継承されていると考えています。これは、そのようなフィールドに間接的にまたはリフレクションを使用してアクセスでき、それらはまだオブジェクトに存在しているためです。

私が戻ってきた後、私はjavadocで次の引用を見つけました:

スーパークラスのプライベートメンバー

サブクラスは、親クラスのプライベートメンバーを継承しません。

インタビュアーの意見について何か議論はありますか?


33
私はかつて同じような状況にありましたが、面接担当者が私よりもJavaについてあまり知らない会社で働きたいとは思っていませんでした。:)
biziclop 2011年

48
面接官は、あなたが正しいと知っていても、あなたに反対することがあります。優れた面接担当者は、技術的な知識よりもあなたについて多くのことを学ぼうとします。
Andy Thomas

4
@DigitalRoss Java言語仕様も不適切に記述されていますか?RD01の答えを参照してください。stackoverflow.com/questions/4716040/...
OscarRyz

9
@Andy Thomas-Cramer私の反応をテストするために故意に嘘をついている人々と一緒に働きたくありません。
biziclop 2011年

4
まず、Javaの「継承」の意味を理解する必要があります。サブクラスにはプライベートフィールドがなく、サブクラスにはプライベートフィールドがありますが、それにアクセスすることはできません。Javaでの継承の正確な意味はどれですか。
MengT 2014年

回答:


238

ここでの質問/回答の混乱のほとんどは、継承の定義を取り囲んでいます。

@DigitalRossが説明するように、サブクラスのOBJECTにはスーパークラスのプライベートフィールドが含まれている必要があります。彼が述べているように、プライベートメンバーへのアクセスがないことはそこに存在しないことを意味しません。

しかしながら。これは、クラスの継承の概念とは異なります。セマンティクスの問題があるJavaの世界の場合と同様に、アービターはJava言語仕様(現在は第3版)です。

JLSが述べるように(https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2):

プライベートとして宣言されたクラスのメンバーは、そのクラスのサブクラスによって継承されません。保護またはパブリックとして宣言されたクラスのメンバーのみが、クラスが宣言されているもの以外のパッケージで宣言されたサブクラスによって継承されます。

このアドレスは、正確な質問は、インタビュアーが提起:「サブんクラスは、プライベートフィールドを継承します」。(私が追加した強調)

答えは「いいえ」です。サブクラスのOBJECTSには、スーパークラスのプライベートフィールドが含まれています。サブクラス自体には、そのスーパークラスのプライベートフィールドはありません。

それは知識人の本質の意味論ですか?はい。面接で役立つ質問ですか?おそらく違います。しかし、JLSはJavaの世界の定義を確立し、(この場合は)明確に定義します。

編集済み(Bjarne Stroustrupからの並列引用を削除しました。これは、JavaとC ++の違いにより、おそらく混乱を増すだけです。私はJLSに答えを任せます:)


3
@デジタルなぜため息。私はあなたがあなたが正しいと信じていることを理解しています。オブジェクトの継承はほとんどのプログラマーが教えられている/考えていることだと私はあなたに同意しません。ただし、JLSの定義は元の質問に直接適用されます。それは、イエスの意味ですが、JLSはないあなたまたはI、定義を決定
robert_x44

4
これらすべてを調整する1つの方法は、「継承」という単語が、少なくともJavaの世界で、派生クラスと親クラスの関係を表す2つのまったく異なる方法で使用されていることを単に認識することです。はい、JSLは信頼できます。はい、残念ながらその方法で「継承」を使用できることを意味します。しかし、サブクラスが親クラスのプライベートフィールド(今は単語がないため)がフラグルすることは依然として明白です。
DigitalRoss 2011年

1
@digital彼らはクラスのオブジェクトです。クラス自体ではありません。Simulaはそれらを連結オブジェクトと呼びました。サブクラスのオブジェクトが作成されたとき、それは連結された「プレフィックスオブジェクト」で構成されていました。スーパークラスオブジェクトは、それ自体が他のプレフィックスオブジェクトを含むことができるプレフィックスオブジェクトでした。JLSには「明らかに悪い言葉遣い」があると言うのは傲慢だと思います。もちろん、私たちが使う言葉は、相続です。少しあいまいな用語を使用しても何も問題はありません。それはいつも起こります。しかし、それは正確な定義がないという意味ではありません。
robert_x44

1
@デジタル言葉がさまざまな方法で使用されていることは確かに同意できます。:)あいまいな用語に依存するインタビューの質問はおそらく良いものではないことにも同意できます。
robert_x44

2
「サブクラスのオブジェクトにはスーパークラスのプライベートフィールドが含まれている」というJava / Oracleからの参照がありますか?私はこれに同意しますが、それを述べている公式文書を見つけることができません。
MengT 2014年

78

はい

クラス 2つありますが、オブジェクトは1つしかないことを理解することが重要です。

つまり、もちろん、プライベートフィールドを継承しています。これらは、おそらく適切なオブジェクト機能に不可欠であり、親クラスのオブジェクトは派生クラスのオブジェクトではありませんが、派生クラスのインスタンスはほとんどの場合、親クラスのインスタンスです。すべてのフィールドがなければ、それは非常によくありません。

いいえ、直接アクセスすることはできません。はい、継承されます。彼らする必要があります。

いい質問ですね!


更新:

エラー、「いいえ」

まあ、私たちはみんな何かを学んだと思います。以来JLSは、正確な文言「継承されていない」を発信し、答えるために正しい「ノー」。サブクラスはプライベートフィールドにアクセスまたは変更できないため、言い換えると、継承されません。しかし、実際に1つのオブジェクトしかなく、実際にプライベートフィールドが含まれているため、誰かがJLSとチュートリアルで間違った言い方をした場合、OOP、Javaオブジェクト、そして実際に何が起こっているのかを理解するのは非常に困難です。

更新して更新:

ここでの論争には根本的な曖昧さが含まれています。正確に何が議論されているのですか?オブジェクト? それとも、クラス自体について何らかの意味で話しているのですか? オブジェクトとは対照的に、クラスを記述する場合は、かなりの自由度が許されます。したがって、サブクラスはプライベートフィールドを継承しませんが、サブクラスのインスタンスであるオブジェクトにはプライベートフィールド含まれています。


2
@ Ma99uS。もちろんそれらは再利用されます。それが継承のすべてのポイントです。それらがないと、派生型は親型のインスタンスになりませんし、できません。OOPは無意味です。多相型は機能しなくなります。オブジェクトが1つだけあり、親タイプのインスタンスであることを理解することは、OOPを理解する上で重要です。この問題を完全に理解するには、この問題を乗り越える必要があります。
DigitalRoss 2011年

2
親クラスがまだ存在し、そのフィールドを持っている間にフィールドを継承できるため、父親の例が非常に良いかどうかはわかりません。相続がそのように機能した場合、父が生きている間に父のお金を相続することができ、父も同じお金を保つことができます。私の子供たちはそれぞれ彼のお金と私のお金を持っているでしょう。
Peter Lawrey、2011年

2
@ピーター・ローリーは何も議論していませんが、私が思うのはここです。親が持っていたcar、彼privateは子供がそれの鍵ではないロッカーにそれを保った。あなたは確かに継承しますcarが、それはあなたにとって役に立たないのです。したがって、実際には、継承によるメリットはありません。
Nishant

1
@DigitalRoss。私はあなたの要点を理解します。Mhh、継承されいない親定義もロードされているため、値が存在すると言えます。:)私は、JVMの仕様が持っていると思う正しい我々が探しているこの「NO WORD」のための答えを。 java.sun.com/docs/books/jvms
OscarRyz

5
-1、Java言語仕様は、継承されていないことを明記しています。イフもノーもない。彼らは単にそうではありません。Javaのコンテキストでは、他の継承の定義は間違っています。
biziclop 2011年

21

いいえ。プライベートフィールドは継承されません...そのため、Protectedが発明されました。仕様によるものです。これは保護された修飾子の存在を正当化したと思います。


今コンテキストに来ています。継承とはどういう意味ですか?派生クラスから作成されたオブジェクトにある場合はどうでしょうか。はい、そうです。

もし意味があれば、派生クラスに役立つかもしれません。うーん、ダメ。

さて、関数型プログラミングになると、スーパークラスのプライベートフィールドは、サブクラスにとって意味のある方法で継承されません。サブクラスの場合、スーパークラスのプライベートフィールドは他のクラスのプライベートフィールドと同じです。

機能的には継承されません。しかし、理想的にはそうです。


OK、Javaチュートリアルを調べたところ、次のように引用されています。

スーパークラスのプライベートメンバー

サブクラスは、親クラスのプライベートメンバーを継承しません。ただし、スーパークラスにプライベートフィールドにアクセスするためのパブリックメソッドまたは保護メソッドがある場合、これらもサブクラスで使用できます。

参照:http : //download.oracle.com/javase/tutorial/java/IandI/subclasses.html

私はその分野がそこにあることに同意します。ただし、サブクラスはそのプライベートフィールドに対する権限を取得しません。サブクラスにとって、プライベートフィールドは他のクラスのプライベートフィールドと同じです。

純粋に視点の問題だと思います。あなたはどちらの側でも議論を形作ることができます。それは両方の方法を正当化する方が良いです。

 


2
これは正しくありません。それらにアクセスすることはできません、それは正しいです。しかし、私が説明したように、それら継承されなければなりません。
DigitalRoss 2011年

1
素晴らしい答え!!! +1 I believe it's purely matter of point-of-view.およびjustified the existence of protected modifier.
Ravi

14

「継承」の定義に依存します。サブクラスにはまだメモリ内のフィールドがありますか?間違いなく。それらに直接アクセスできますか?いいえ。定義の微妙な問題です。ポイントは、実際に何が起こっているのかを理解することです。


正しい。しかし、私はそのような基本的な質問には共通の答えがあるはずだと思います)
スタン・クリリン

継承のJava定義だと思います。
OscarRyz、2011年

または、「フィールド」の定義に依存します。整数フィールド "foo"を定義するには、整数サイズのストレージロッカーをレンタルして、それに "foo"記号を付けます。フィールドがプライベートとして宣言されている場合、派生クラスはラベルのない整数サイズのストレージロッカーを継承します。派生クラスが「フィールド」を継承するかどうかは、ラベルのないストレージロッカーを「フィールド」と呼ぶかどうかによって異なります。
スーパーキャット2012

10

コードで概念を示します。サブクラスは実際にはスーパークラスのプライベート変数を継承します。唯一の問題は、スーパークラスのプライベート変数にパブリックゲッターとセッターを提供しない限り、子オブジェクトにアクセスできないことです。

パッケージDumpの2つのクラスを考えます。子は親を拡張します。

私の記憶が正しければ、メモリ内の子オブジェクトは2つの領域で構成されます。1つは親パーツのみで、もう1つは子パーツのみです。子は、親のパブリックメソッドを介してのみ、親のコードのプライベートセクションにアクセスできます。

このように考えてください。ボラットの父親であるボルトクには、10万ドルの金庫があります。彼は「プライベート」変数を安全に共有したくありません。したがって、彼は金庫の鍵を提供しません。ボラットは金庫を相続します。しかし、彼がそれを開くことさえできないならば、それはどんなに良いことですか?彼のお父さんだけが鍵を提供していたなら。

親-

package Dump;

public class Parent {

    private String reallyHidden;
    private String notReallyHidden;

    public String getNotReallyHidden() {
        return notReallyHidden;
    }

    public void setNotReallyHidden(String notReallyHidden) {
        this.notReallyHidden = notReallyHidden;
    }

}//Parent

子 -

package Dump;

public class Child extends Parent {

    private String childOnly;

    public String getChildOnly() {
        return childOnly;
    }

    public void setChildOnly(String childOnly) {
        this.childOnly = childOnly;
    }

    public static void main(String [] args){

        System.out.println("Testing...");
        Child c1 = new Child();
        c1.setChildOnly("childOnly");
        c1.setNotReallyHidden("notReallyHidden");

        //Attempting to access parent's reallyHidden
            c1.reallyHidden;//Does not even compile

    }//main

}//Child

10

いいえ、継承しません。

他のクラスがそれを間接的に使用するという事実は、継承については何も言わず、カプセル化についてです。

例えば:

class Some { 
   private int count; 
   public void increment() { 
      count++;
   }
   public String toString() { 
       return Integer.toString( count );
   }
}

class UseIt { 
    void useIt() { 
        Some s = new Some();
        s.increment();
        s.increment();
        s.increment();
        int v = Integer.parseInt( s.toString() );
        // hey, can you say you inherit it?
     }
}

また、リフレクションによってcount内部の値を取得することもできますUseIt。それは意味しません、あなたはそれを継承します。

更新

値は存在しますが、サブクラスには継承されません。

たとえば、次のように定義されたサブクラス:

class SomeOther extends Some { 
    private int count = 1000;
    @Override
    public void increment() { 
        super.increment();
        count *= 10000;
    }
}

class UseIt { 
    public static void main( String ... args ) { 
        s = new SomeOther();
        s.increment();
        s.increment();
        s.increment();
        v = Integer.parseInt( s.toString() );
        // what is the value of v?           
     }
}

これは最初の例とまったく同じ状況です。属性countは非表示になり、サブクラスにはまったく継承されません。それでも、DigitalRossが指摘するように、価値はありますが、継承に関するものではありません。

このようにしてください。もしあなたの父親が裕福でクレジットカードを渡したとしても、あなたは彼のお金で物を買うことができますが、あなたがそのすべてのお金を相続したということではありませんか?

その他のアップデート

ただし、属性が存在する理由を知ることは非常に興味深いことです。

率直に言って、正確な用語はありませんが、「継承されていない」親定義もロードするのはJVMとその動作方法です。

実際に親を変更しても、サブクラスは引き続き機能します。

例えば

//A.java
class A {
   private int i;
   public String toString() { return ""+ i; }
}
// B.java
class B extends A {}
// Main.java
class Main {
   public static void main( String [] args ) {
      System.out.println( new B().toString() );
    }
}
// Compile all the files
javac A.java B.java Main.java
// Run Main
java Main
// Outout is 0 as expected as B is using the A 'toString' definition
0

// Change A.java
class A {
   public String toString() {
      return "Nothing here";
   }
}
// Recompile ONLY A.java
javac A.java
java Main
// B wasn't modified and yet it shows a different behaviour, this is not due to 
// inheritance but the way Java loads the class
Output: Nothing here

正確な用語はここにあると思います: JavaTM仮想マシン仕様


あなたは、あなたのインタビュアー説明する機会かかることがあります:)次回は、彼/彼女は)明らかにあなたが外交正しい方法でこれを行う必要があり、間違って、これはあなたに余分なポイントを与える可能性があります。
OscarRyz 2011年

1
ポリモーフィック型が何らかの意味を持つために、それら継承する必要があります。私の説明を見てください。あなたが彼らをいじることはできないのは本当ですが、彼らはそこにいます。彼らする必要があります。
DigitalRoss 2011年

コードに継承(拡張/実装)キーワードがないため、継承の例ではありません。
fmucar '17年

1
ええと、彼らがいるとしたら、どうやってそこに着いたのですか?サブクラスがそれらを定義したので?いいえ。継承されたので、うーん、うーん、えー、継承されたのですか?
DigitalRoss、2011年

1
encapsulationvsの素晴らしいポイントinheritです。この回答はもっと賛成票を投じる価値があると思います。
Eric Wang

6

まあ、インタビュアーの質問への私の答えは- プライベートメンバーはサブクラスで継承されませんが、パブリックゲッターまたはセッターメソッドまたは元のクラスのそのような適切なメソッドを介してのみサブクラスまたはサブクラスのオブジェクトにアクセスできます。通常の方法では、メンバーをプライベートに保ち、パブリックなゲッターおよびセッターメソッドを使用してメンバーにアクセスします。では、それらが扱うプライベートメンバーがオブジェクトで使用できない場合に、getterメソッドとsetterメソッドのみを継承することの意味は何でしょうか。ここで「継承された」とは、サブクラスで新しく導入されたメソッドによって遊ぶために、サブクラスで直接利用できることを単に意味します。

以下のファイルをParentClass.javaとして保存し、自分で試してください->

public class ParentClass {
  private int x;

  public int getX() {
    return x;
  }

  public void setX(int x) {
    this.x = x;
  }
}

class SubClass extends ParentClass {
  private int y;

  public int getY() {
    return y;
  }

  public void setY(int y) {
    this.y = y;
  }

  public void setXofParent(int x) {
    setX(x); 
  }
}

class Main {
  public static void main(String[] args) {
    SubClass s = new SubClass();
    s.setX(10);
    s.setY(12);
    System.out.println("X is :"+s.getX());
    System.out.println("Y is :"+s.getY());
    s.setXofParent(13);
    System.out.println("Now X is :"+s.getX());
  }
}

Output:
X is :10
Y is :12
Now X is :13

SubClassのメソッドでParentClassのプライベート変数xを使用しようとすると、変更のために直接アクセスできません(つまり、継承されません)。ただし、xは、setXofParent()メソッドで行われるように、元のクラスのsetX()メソッドを介してSubClassで変更できます。または、setX()メソッドまたは最終的にsetX()を呼び出すsetXofParent()メソッドを使用してChildClassオブジェクトを使用して変更できます したがって、ここでsetX()およびgetX()は、ParentClassのプライベートメンバーxへの一種のゲートです。

もう1つの簡単な例は、Clockスーパークラスが時間と分をプライベートメンバーとして持ち、適切なゲッターとセッターメソッドをパブリックとして持っていることです。次に、ClockのサブクラスとしてDigitalClockが登場します。ここで、DigitalClockのオブジェクトにhoursとminsのメンバーが含まれていない場合、問題が発生します。


2
Oracleドキュメントに従って-サブクラスは親クラスのプライベートメンバーを継承しません。ただし、スーパークラスにプライベートフィールドにアクセスするためのパブリックメソッドまたは保護メソッドがある場合、これらもサブクラスで使用できます。
dganesh2002、2013

4

わかりました。これは私がよく調べた非常に興味深い問題であり、スーパークラスのプライベートメンバーがサブクラスのオブジェクトで実際に使用可能(ただしアクセス不可能)であるという結論に達しました。これを証明するために、親クラスと子クラスのサンプルコードを以下に示します。子クラスオブジェクトをtxtファイルに書き込み、ファイル内の 'bhavesh'という名前のプライベートメンバーを読み取っているため、実際に子で使用できることがわかりますクラスですが、アクセス修飾子のためアクセスできません。

import java.io.Serializable;
public class ParentClass implements Serializable {
public ParentClass() {

}

public int a=32131,b,c;

private int bhavesh=5555,rr,weq,refw;
}

import java.io.*;
import java.io.Serializable;
public class ChildClass extends ParentClass{
public ChildClass() {
super();
}

public static void main(String[] args) {
ChildClass childObj = new ChildClass();
ObjectOutputStream oos;
try {
        oos = new ObjectOutputStream(new FileOutputStream("C:\\MyData1.txt"));
        oos.writeObject(childObj); //Writing child class object and not parent class object
        System.out.println("Writing complete !");
    } catch (IOException e) {
    }


}
}

MyData1.txtを開き、「bhavesh」というプライベートメンバーを検索します。皆さんの考えを教えてください。


3

サブクラスはプライベートフィールドを継承しているように見えます。これは、これらのフィールドがサブクラスの内部動作(哲学的に言えば)で使用されるためです。サブクラスは、そのコンストラクターでスーパークラスコンストラクターを呼び出します。スーパークラスコンストラクターがこれらのフィールドをコンストラクターで初期化した場合、スーパークラスプライベートフィールドは、スーパークラスコンストラクターを呼び出すサブクラスによって明らかに継承されます。これは単なる例です。しかしもちろん、アクセサメソッドがないと、サブクラスはスーパークラスのプライベートフィールドにアクセスできません(iPhoneのバックパネルをポップしてバッテリーを取り出して電話をリセットできないようなものですが、バッテリーはまだ残っています)。

PS私が遭遇した継承の多くの定義の1つ:「継承-派生クラスが基本クラスの機能を拡張し、そのSTATE(強調は私のもの)と動作をすべて継承できるようにするプログラミング手法。」

プライベートフィールドは、サブクラスからアクセスできない場合でも、スーパークラスの継承された状態です。


1

Javaのプライベートフィールド継承されると私は答える必要があります。実演させてください:

public class Foo {

    private int x; // This is the private field.

    public Foo() {
        x = 0; // Sets int x to 0.
    }

    //The following methods are declared "final" so that they can't be overridden.
    public final void update() { x++; } // Increments x by 1.
    public final int getX() { return x; } // Returns the x value.

}


public class Bar extends Foo {

    public Bar() {

        super(); // Because this extends a class with a constructor, it is required to run before anything else.

        update(); //Runs the inherited update() method twice
        update();
        System.out.println(getX()); // Prints the inherited "x" int.

    }

}

プログラムBar bar = new Bar();で実行すると、出力ボックスに常に「2」という数字が表示されます。整数「x」はメソッドupdate()getX()でカプセル化されているため、整数が継承されていることが証明できます。

混乱は、整数 "x"に直接アクセスできないため、それは継承されないと主張することです。ただし、フィールドやメソッドなど、クラスの静的でないものはすべて継承されます。


3
「含む」は「継承」を意味するものではありません;)
スタンクリリン

1

継承に対するJavaのメモリレイアウト

ここに画像の説明を入力してください

ビット/アライメントの埋め込み、およびVTABLEへのオブジェクトクラスの組み込みは考慮されません。したがって、サブクラスのオブジェクトには、スーパークラスのプライベートメンバーのための場所があります。ただし、サブクラスのオブジェクトからはアクセスできません...


1

いいえ、プライベートフィールドは継承されません。唯一の理由は、サブクラスがそれらに直接アクセスできないことです。


0

答えは、質問された質問に完全に依存していると思います。つまり、質問が

サブクラスからスーパークラスのプライベートフィールドに直接アクセスできますか?

次に、答えは「いいえ」です。アクセス指定子の詳細を確認すると、プライベートメンバーはクラス自体の内部でのみアクセスできます。

しかし、質問が

サブクラスからスーパークラスのプライベートフィールドにアクセスできますか?

つまり、プライベートメンバーにアクセスするために何をするかは問題ではありません。その場合、スーパークラスでパブリックメソッドを作成し、プライベートメンバーにアクセスできます。したがって、この場合は、プライベートメンバーにアクセスするための1つのインターフェイス/ブリッジを作成しています。

C ++のような他のOOP言語には、friend function他のクラスのプライベートメンバーにアクセスできるという概念があります。


0

スーパークラスが継承されると、スーパークラスのプライベートメンバーは実際にはサブクラスのプライベートメンバーになり、さらに継承できないか、サブクラスのオブジェクトにアクセスできないと簡単に言えます。



-1

サブクラスは、親クラスのプライベートメンバーを継承しません。ただし、スーパークラスにプライベートフィールドにアクセスするためのパブリックメソッドまたは保護メソッドがある場合、これらもサブクラスで使用できます。


-2

プライベートメンバー(状態と動作)は継承されます。これらは、クラスによってインスタンス化されたオブジェクトの動作とサイズに影響を与えることができます。言うまでもなく、これらは、利用可能なすべてのカプセル化解除メカニズムを介して、または実装者が想定できるサブクラスから非常によく見えます。

継承には「事実上の」定義がありますが、「いいえ」の回答によって想定される「可視性」の側面へのリンクはありません。

したがって、外交的である必要はありません。この時点でJLSは間違っています。

それらが「継承」されていないという想定は、安全でなく危険です。

したがって、2つの事実上の(部分的に)矛盾する定義(私は繰り返さない)のうち、従う必要があるのは、より安全な(または安全な)定義のみです。


1
-1。JLS 言語を定義します。JLSが「間違っている」ことは不可能です。また、カプセル化を解除するメカニズムがある場合でも、フィールドが継承されるわけではありません。カプセル化を破壊するメカニズムがあるというだけです。
SLバース-2012

定義自体、いくつかの点でそれ自体が間違っている可能性があります。これについてさらに議論することは私の意図ではありません。ここでの議論は、カプセル化を解除するメカニズム(神または悪いかもしれない)に関するものではなく、フィールド/メソッドが存在するという事実に関するものであり、サブクラスの動作と状態に影響を与えます。つまり、「継承」されます。100kbのプライベートバイト配列をクラスで使用して、彼の(ジャンボ)子孫がそれを継承しないと仮定することができます。ポイントをお見逃しなく、これを良いまたは悪い習慣として判断してください(誇張はポイントを作るのに役立ちます)。これは予見された、正当な行動です。プライベートメンバーは「継承」されます。
gkakas 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.