import java.util.*;
interface Sample{
//定数はインターフェースに定義できるよ
public final static int num=10;
//抽象メソッド public abstractは自動で作られる
public abstract void hoge();
}
interface Test{
//定数はインターフェースに定義できるよ
public final static int num=10;
//抽象メソッド public abstractは自動で作られる
public abstract void exe();
}
//多重実現
class SampleImp implements Sample,Test{
public void hoge(){
}
public void exe(){
}
}
class A{
public int i=10;
A(int i){
System.out.println("Aのコンストラクタ");
}
void test(){
System.out.println("void test A");
}
void test2(){
System.out.println("void test2 A");
}
}
class B extends A{
public int i=100;
B(){
super(100);
System.out.println("Bkon");
}
@Override
void test(){
System.out.println("void test B");
}
void test3(){
System.out.println("void test3 B");
}
}
public class Main {
public static void main(String[] args) throws Exception {
//キャストアップの例
// サブクラスからスーパーへキャストアップした場合、変数はより近い方10が使用され、メソッドはオーバーライドさ
//れたテスト2と出力、Bのメソッドは上書きされていないので使おうとするとエラー
//注意 フィールド変数はスーパークラス、メソッドはサブクラスが優先される、という点です。
A b= new B();
b.test();
//b.test3();
//ダウンキャストの例↓アップキャストしたものだけを戻せる 調べる方法として instanceof を使用することもできる
// アップキャスト(暗黙的)
A bb= new B();
// ダウンキャスト(明示的)
B bbb = (B)bb;
// SubClassのメソッド
bbb.test();
bbb.test3();
}
}