Javaインタフェースと継承ノート
7604 ワード
1.Objectクラスはすべてのクラスの親です.クラスを宣言する場合、デフォルトではObjectが継承されます.
2.ObjectクラスはtoStringメソッドを提供しているので、すべてのクラスにtoStringメソッドがあります.
3. finalize()
4. equals()
equals()は、2つのオブジェクトの内容が同じかどうかを判断するために使用されます.
2人の英雄のhpが同じとき、私たちはこの2人の英雄が同じだと思っています.
public class Hero {
public String name;
protected float hp;
public boolean equals(Object o){
if(o instanceof Hero){
Hero h = (Hero) o;
return this.hp == h.hp;
}
return false;
}
public static void main(String[] args) {
Hero h1= new Hero();
h1.hp = 300;
Hero h2= new Hero();
h2.hp = 400;
Hero h3= new Hero();
h3.hp = 300;
System.out.println(h1.equals(h2)); //false
System.out.println(h1.equals(h3)); //true
}
}
5.==とhashCode()
これはObjectのメソッドではありませんが、2つのオブジェクトが同じかどうかを判断するために使用されます.
より正確には、2つの参照が同じオブジェクトを指しているかどうかを判断するために使用されます.
hashCodeメソッドは、オブジェクトのハッシュ値を返します.デフォルトでは、ObjectクラスのhashCore()メソッドは、そのオブジェクトのアドレスに基づいて計算されます.
しかし、多くのクラスはObjectクラスのhashCode()メソッドを書き換え、アドレスに基づいてhashCode()メソッド値を計算しない.
public class Hero {
public String name;
protected float hp;
public boolean equals(Object o){
if(o instanceof Hero){
Hero h = (Hero) o;
return this.hp == h.hp;
}
return false;
}
public static void main(String[] args) {
Hero h1= new Hero();
h1.hp = 300;
Hero h2= new Hero();
h2.hp = 400;
Hero h3= new Hero();
h3.hp = 300;
Hero h4 = h1;
System.out.println(h1==h2); //false
System.out.println(h1==h3); //false
System.out.println(h1==h4); //true
System.out.println("h1.hashCode:"+h1.hashCode()); //h1.hashCode:2018699554
System.out.println("h2.hashCode:"+h2.hashCode()); //h2.hashCode:1311053135
System.out.println("h3.hashCode:"+h3.hashCode()); //h3.hashCode:118352462
System.out.println("h4.hashCode:"+h4.hashCode()); //h4.hashCode:2018699554
}
}
final
final修飾クラス、メソッド、基本タイプ変数、引用時にそれぞれ異なる意味があります.
1.final修飾クラス
Heroがfinalに修飾されると、Heroが継承できないことを示す.
2.final修飾方法
HeroのuseItemメソッドがfinalに修飾されるとgiantメソッドはADHeroでは書き換えられない.
3.final修飾基本変数
finalは基本変数を修飾し、この変数が1回の付与機会しかないことを示す.
4.final修飾参照
この参照がオブジェクトを指す機会が1回しかないことを示します.
抽象クラス
クラスにメソッドを宣言します.このメソッドは実装体ではなく、「空」メソッドです.
このような方法を抽象的な方法と呼び,修飾子「abstract」を用いる.
クラスに抽象メソッドがある場合は、クラスを抽象クラスとして宣言する必要があります.
1.抽象クラス
Heroに抽象メソッドattackを追加し,Heroをabstractと宣言した.
APHero,ADHero,ADAPHeroはHeroのサブクラスであり,Heroの属性と方法を継承している.
しかし、それぞれの合計手段は異なり、Heroクラスを継承すると、これらのサブクラスは異なるattackメソッドを提供して実現しなければならない.
2.抽象クラスは抽象的な方法がなくてもよい
Heroクラスは抽象メソッドを提供しない前提で抽象クラスとして宣言することができる.
クラスが抽象クラスとして宣言されると、直接インスタンス化することはできません.
package charactor;
public abstract class Hero {
String name;
float hp;
float armor;
int moveSpeed;
public static void main(String[] args) {
// , ,
Hero h= new Hero(); //error
}
}
3.抽象クラスとインタフェースの違い
区別1:
違い2:
内部クラス
内部クラスは4つに分けられます.
非静的内部類BattleScore「戦闘成績」
非静的内部クラスは、1つのクラスで直接定義できます.例:
public class Hero {
private String name; //
float hp; //
float armor; //
int moveSpeed; //
// , ,
//
class BattleScore {
int kill;
int die;
int assit;
public void legendary() {
if (kill >= 8)
System.out.println(name + " !");
else
System.out.println(name + " !");
}
}
public static void main(String[] args) {
Hero garen = new Hero();
garen.name = " ";
//
// BattleScore
//
BattleScore score = garen.new BattleScore();
score.kill = 9;
score.legendary();
}
}
2.静的内部クラス
1つのクラスに静的内部クラスが宣言されます
public class Hero {
public String name;
protected float hp;
private static void battleWin(){
System.out.println("battle win");
}
//
static class EnemyCrystal{
int hp=5000;
// 0,
public void checkIfVictory(){
if(hp==0){
Hero.battleWin();
//
System.out.println(name + " win this game"); //error
}
}
}
public static void main(String[] args) {
//
Hero.EnemyCrystal crystal = new Hero.EnemyCrystal();
crystal.checkIfVictory();
}
}
3.匿名クラス
匿名クラスとは、クラスを宣言しながらインスタンス化し、コードをより簡潔に精製することです.
このようなクラスを匿名クラスと呼ぶ.
public abstract class Hero {
String name; //
float hp; //
float armor; //
int moveSpeed; //
public abstract void attack();
public static void main(String[] args) {
ADHero adh = new ADHero();
// adh, adh ADHero
adh.attack();
System.out.println(adh);
Hero h = new Hero() {
// attack
public void attack() {
System.out.println(" ");
}
};
h.attack();
// h, h Hero$1
System.out.println(h);
}
}
4.ローカルクラス
public abstract class Hero {
String name; //
float hp; //
float armor; //
int moveSpeed; //
public abstract void attack();
public static void main(String[] args) {
// ,
class SomeHero extends Hero{
public void attack() {
System.out.println( name+ " ");
}
}
SomeHero h =new SomeHero();
h.name =" ";
h.attack();
}
}