ディレクトリ
集中計画 - オブジェクト指向のJavaの(g)の入門
0.5オブジェクト指向の概念
オブジェクト指向およびプロセス指向0.1
オブジェクト指向のソフトウェア開発は、物事、レッツ・プログラミングモデルの現実から抽象化することが可能なアプローチです。
それは特定を通じて問題を解決するために、私たちを必要とし、また、ソフトウェア開発のプロセス指向のアプローチであり、プロセス指向の方法
アナロジーは、我々は今、食事を食べたいです。
- 私たちは、食べた後、調理のスープを調理する料理、肉や野菜の洗浄米を、買う皿を洗うために持っているので、多分私達は、自分のために料理ます。これは呼ばれるプロセス指向します
- 多分、我々は唯一のために必要な、ホテルに行くよ、その後、他のものが出てくる、食べて、その後、休暇を支払います。我々は、彼らが皿洗いずに食べて、食べ物を行う方法である気にしない、料理は購入するところからです無視します。これが呼び出され、オブジェクト指向します
プログラムそれの別の例として、
C言語は典型的なプロセス指向言語で、私たちはプログラムは、私たちのメインプログラムの主な機能に書き込まれる書き込み、さらには他のファイルの機能として、他の関数を呼び出すことができます。
#include <stdio.h> //使用C语言生成正方形 int main(){ printRect(3); } void printRect(int size){ for(int i = 0;i<size;i++){ for(int j = 0;j<size;j++){ printf("*"); } printf("\n"); } }
使用してJava オブジェクト指向プログラミングのため、すべての私達のプログラミングクラスは、周りの持っています。私たちは、メソッドを呼び出すことはできませんが、最初のインスタンスを作成する必要があり、その後、その後、メソッドのインスタンスを呼び出します。
public class Test(){ public static void main(String[] args){ RectUtil rectUtil = new RectUtil(); rectUtil.printRect(); } } ==============下面是另一个类====================== //一个与矩形有关的工具类 public class RectUtil(){ //有一个生成矩形的方法 public void printRect(int size){ for(int i = 0;i<size;i++){ for(int j = 0;j<size;j++){ printf("*"); } printf("\n"); } } }
0.2プロパティとメソッド
- 実際には、オブジェクトは、1つの特定の事を指します。プロセスでは、私たちのオブジェクトは、私たちの書き込みシステムの一の構成要素を指します。
- オブジェクトは2つの要素のための1つ含まれているデータを 1である、アクション。オブジェクトだけで操作することはできませんが、また、操作の結果を記録すること。栗のために、あなたが食べるようになる、と食べることは重くなります。お食事は、重量データであるアクション、です。
- 我々は、すべてのオブジェクトクラスがから抽象化されてから、知っているように、それは言うことができます。クラスが同じ特性と動作を持つ抽象オブジェクトです。したがって、クラスコンクリート(またはインスタンス化)オブジェクトは、オブジェクトクラスが抽象です。
- クラスが持つ属性を、私たちのクラス特性によって説明する属性。
- クラスが持つメソッドを私たちはクラスを説明した方法により、業務の一部を、我々は呼び出すことができる機能を。
- 場合クラスをとしてインスタンス化されるオブジェクト、クラス属性は、のオブジェクトに割り当てることができるデータメソッド、クラスが対象として呼び出すことができる操作、または操作。
- このクラスは、データ型として使用することができます。
- たとえば:文字列、日付はクラスであり、そして彼らはまた、データ列の時間を表すことができます。
- 上からのこの記事では、我々は、クラスのプロパティは他のクラスであってもよいことクリアすることができます。
- 例えば:コンピュータクラス、その特性は同じ抽象クラスであってもよいCPU、グラフィックカード、ディスプレイ画面とすることができるが、それらはまた、クラス・コンピュータの特性の一つです。
1.オブジェクト指向機能
1.1オブジェクトのみ
- 各オブジェクトは、一意のアドレス格納されたオブジェクトを持って、クラス・オブジェクトがインスタンス化される場合、変数のアドレスを格納し、C言語でポインタとして一意の識別子が存在することになる、ユニークです。
1.2抽象化
- これは、クラスに同じ特性および挙動を有する物体を指します。
1.3三つの特徴 - 継承、カプセル化、ポリモーフィズム
1.3.1継承
- 継承は、このようにコードの重複を減らすこと、そのプロパティおよびメソッドへの既存のクラスからの継承を意味します。
- 親クラス:継承されたクラスを参照します
- サブクラスは:親クラス継承したクラスを指します。
- Javaでは、すべてのクラスがあるオブジェクト、継承するオブジェクトであるすべてのクラスの親を
- Javaでは、それだけを目的としたクラス継承可能高すぎることによって引き起こされる多重継承の結合を低減します
- 私たちは、複数のインターフェース、機能クラスの拡張を介しすることができます。
1.3.2パッケージング
人生は物事を包んだパッケージを指し、
- 例えば、パッケージ内部のコンピュータ筐体要素は、我々は、シャーシ、スタートボタンを使用することができ、素子内部を見ることができないことがわかります。
プログラミングでは、我々は、特定の実装の詳細を提供する必要なしに、インターフェイスメソッドを提供するだけで済み、クラスをカプセル化することができます。
- 例えば:私たちは、単語クラスの翻訳を実現し、我々はいくつかのことを行う必要があります
- 単語のリストを書く方法を読みます
- 私たちは、単語リスト内の単語の翻訳を見つけるために、メソッドを書きたいです
- - >ターゲットを探す - >戻るの結果に単語のリストを読み込む:ビジネスロジックを実装し、二つの方法の上に統合する方法を書きます
- これらでは、我々は第三の方法は、単語を翻訳達成することができますのみ必要です。他の2つの方法が露出することはできませんが、そう私たちのコードより強固なもの。
- 例えば:私たちは、単語クラスの翻訳を実現し、我々はいくつかのことを行う必要があります
4つの修飾子とともにパッケージ化
レンジ/修飾子 インナークラス パッケージ内部 任意の場所 適用できます リマーク 公衆 √ √ √ 修飾されたクラスのメンバーのプロパティ、メンバ・メソッド、内部クラス 保護されました √ √ メンバープロパティ、メンバー・メソッド、内部クラスの変更 クラスを変更することはできません デフォルトでは書き込みません。 √ √ 修飾されたクラスのメンバーのプロパティ、メンバ・メソッド、内部クラス 民間 √ メンバープロパティ、メンバー・メソッド、内部クラスの変更 プライベートメソッドは継承できません 原則パッケージ
- コンテンツが隠されている外部提供する必要はありません、プロパティはその方法(通常ゲットする、一連の設定)へのパブリックアクセスを提供するために隠されています
カプセル化の結果は目に見える存在ではなく、
1.3.3多型
同じ名前の異なる方法
メソッドサブクラスのオブジェクトは親クラス変数に割り当てられ、サブクラスのメソッドの呼び出します。従って、同じ方法で同じタイプのオブジェクトは、実行されると、動作特性の多様性を示すことができ
- 例:QQグループ管理者とグループメンバー。また、Administratorsグループのメンバーは、グループのメンバーがサブクラスの管理者であると言うことができます。
- 私はノートを変更する機能を使用する場合、グループメンバーは、自分のノートを編集することができ、および管理者が他の人のコメントを変更することができます。
- 同様に、メイングループは、グループのメンバーから継承されたが、主なグループは、より多くの権限を持っています。
あなたが親クラスのメソッドを呼び出したい場合は、この時点で、あなたは使用することができ、スーパーキーワードを。
親クラスは次のように宣言されている静的、最終メソッドをオーバーライドすることができず、最終的にクラスが上書きされたことが許されていないとして、すべてのメソッドは宣言しました。
オーバーロードされたメソッド
- オーバーロードされたメソッドの多型を達成するための別の方法であり、それは同じ名前のメソッドで定義されたクラスを指し、これらの方法は、パラメータの異なるタイプがあり、パラメータの数は、多型を達成することが可能です。
- この方法を使用する場合、我々は方法の種類に対応するデータ型を埋める際に、メソッドが呼び出されます。
test(int i){} test(String str){} test(int i,String str){} 当我调用test(1)时,会自动的调用到第一个方法,而调用test("1")时,会自动调用到第二个方法。
2.継承
2.1抽象クラス
- 抽象クラスを定義する抽象クラスのキーワードを使用しています
- 完全に離れて抽象的でないクラスのインスタンスに加えて、通常の書き込みがない別のクラス
- 抽象クラスにのみ使用することができ、それはデザインで一般的に継承されるインスタンス化できませんが、抽象クラスを使用するかどうかを決定します
public abstract class AStudent{
private String id;
private String name;
private String dept;
public void study(){
System.out.println("我在学习!");
}
}
public class GoodStudent extends AStudent{
public void study(){
super().study();
System.out.println("敲代码,进大厂!");
}
}
public class BadStudent extends AStudent{
public void study(){
System.out.println("什么时候可以下课,我要去食堂抢位置了!");
}
}
2.2インタフェース
インターフェイスインターフェイスキーワード宣言するには
- インターフェースであって実装するクラス、プロパティおよびメソッドを含むクラス、およびインタフェース・クラスではありません
- インターフェイスは、それだけで実装することができ、インスタンス化することはできません
- 実現
- インタフェースのメソッドは、唯一のメソッド名、メソッドのない内容であること、実装されていません。
- 私たちは、これは空白の卍グリッドであることを理解することができ、アルファベットは、書き込み漢字の下に、上に書かれていますが、ピンインを書くためにどのような、漢字はあなたが所有するものによって決定することができると語りました。
public interface Teacher [extends 这里可以继承其他接口,但是我不做示范]{
public void teaching([这里可以写变量,但是我不做示范]);
}
public class TeacherImpl implements Teacher{
//如果你实现了接口,那么类中必须有接口里所有的方法的实现
public void teaching(){
[代码内容]
}
}
3.多型の関連
3.1コンストラクタ
- コンストラクタは、新しいオブジェクトを初期化するために使用される方法の特殊なタイプです。
- 我々は、書き込みインスタンス化する場合:新しい学生()このようなアプローチをなぜ学生ブラケット、コンストラクタを呼び出すので、ここに存在します。
- 我々はコンストラクタを書いていない場合には、(引数がパラメータを参照しませんでした)デフォルトの引数なしのコンストラクタがあるでしょう
- 我々はコンストラクタを書くとき、引数なしのコンストラクタは、この時点では、デフォルトのコンストラクタがないことを、上書きされます
- 我々はコンストラクタ引数を記述するときにコンストラクタメソッドを呼び出したくない場合はそのため、あなたは、引数なしで空白のコンストラクタを書くことができます
public class test{
//构造方法与类名同名,不用定义返回值,我们可以认为返回值为这个类。
public test(){
}
//有参的构造方法
public test(int i){
}
}
それ自体は、多型の特性に合わせて、方法であるため、多型の性質によって、我々は知ることができ、コンストラクタは、多くを持つことができます。
一般的な方法が異なっていると、それは呼び出されたときにインスタンス化されるクラスです。
- 書き込み独自のコンストラクタ、引数なしのデフォルトコンストラクタが存在しない場合には
- コンストラクタメソッドを記述する場合は、引数なしのデフォルトのコンストラクタがありません。
我々は、複数のプロパティの割り当てのために必要なときにそれを適用することができます。
//如果没有构造方法 Student student = new Student(); student.id = "123456"; student.name = "小明"; //如果有构造方法 Student student = new Student("123456","小明"); student = new Student();//如果没有写无参的构造方法,此时这样写会报错
放課後の練習
オブジェクト指向プログラミングのアイデアを使用してみてください、少し話を
例えば:
農家とライオンズの愛
ライオンは、農家が結婚で彼女の手を要求し、農家の娘と恋に落ちました。獣の心でもないの農家の娘は、私が拒否していないあえて、彼らは方法を考え出す
「私はあなたの娘と結婚するつもりだが、私は恐れて自分の娘の牙だ:農家を促すためにライオンが彼に言ったとき、爪、と私はこれらがあなたの爪を切って、あなたの歯を挽くことができれば、私はすぐに彼の娘は、あなたと結婚しましょう彼女を傷つけることを心配。「
レオはとても幸せだったと言いました:」長い間、彼女は私が約束したどのような条件、結婚できるように、私はあなたが何を意味するかやる!」
ライオンカット後に戻って彼の鋭い爪、鋭い歯を砥石で研磨しました。彼は花嫁と結婚するための新しい、農家の家を着ました。しかし、農家への扉が、農家は明らかに悪意、近づいて、スティックの手を発見しました。平方用心深くオフライオンズ。
案の定雨が倒れるように、農家はカオススティックのバーストが、ライオンは彼の爪と歯ため、完全に任意の電源なしで、反撃することができませんでした。
最後にライオンは、メイクが悪化重要、無牙、爪を逃げた、ライオンはもはや最終的に飢餓で死亡、獲物を捕獲することはできません。
クラスの役割
package domain;
/**
* @author Jennyism
* @date 2020/1/27 0027 21:47
*/
public abstract class Role {
private String name;
public void say(String words) {
System.out.println(getName() + ":" + words);
}
public void think(String feel) {
System.out.println(getName() + "觉得" + feel);
}
public void attack(Role role) {
System.out.println(getName() + "对" + role.getName() + "发起攻击");
}
public void doSomething(String some) {
System.out.println(getName() + some);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ライオンズカテゴリ
package domain;
/**
* @author Jennyism
* @date 2020/1/27 0027 21:52
*/
public class Lion extends Role {
private boolean claw;
private boolean canineTeeth;
public Lion(String roleName) {
setName(roleName);
System.out.println("我是一只狮子,我的名字叫" + getName() + ",我爱上了农夫的女儿");
}
public void wantMarry(Role role) {
System.out.println(getName() + "想娶" + role.getName());
}
public boolean hasClaw() {
return claw;
}
public void setClaw(boolean claw) {
if (!claw){
System.out.println(getName()+"剪掉了自己尖利的爪子!");
}
this.claw = claw;
}
public boolean hasCanineTeeth() {
return canineTeeth;
}
public void setCanineTeeth(boolean canineTeeth) {
if (!claw){
System.out.println(getName()+"在磨石上磨平了尖锐的牙齿。");
}
this.canineTeeth = canineTeeth;
}
}
ファーマークラス
package domain;
/**
* @author Jennyism
* @date 2020/1/27 0027 22:01
*/
public class Farmer extends Role {
public Farmer(String roleName){
setName(roleName);
System.out.println("我是农夫,我的名字叫"+getName()+",狮子要娶我的女儿,可我不敢拒绝。");
System.out.println("于是我想到了一个办法。");
}
}
娘のクラス
package domain;
/**
* @author Jennyism
* @date 2020/1/27 0027 22:06
*/
public class Daughter extends Role {
public Daughter(String roleName){
setName(roleName);
}
}
物語はおよそです
package client;
import domain.Daughter;
import domain.Farmer;
import domain.Lion;
import domain.Role;
/**
* @author Administrator
*/
public class MyFirstClient {
public static void main(String[] args) {
//狮子有自己的方法,需要赋值到Lion类
Lion lion = new Lion("Lion Steve");
//女儿没有再添加新的方法,可以直接赋值给Role类
Role daughter = new Daughter("Daughter Fuck");
lion.wantMarry(daughter);
lion.say("农夫,你能把你的女儿嫁给我吗。");
Role farmer = new Farmer("Farmer Fuck");
System.out.println("=============第一段结束==========");
lion.say("农夫,你要怎样才能把女儿嫁给我!");
farmer.say("我愿意把女儿嫁给你,可是我的女儿害怕你的尖牙和利爪,而且我也担心这些会伤害到她。如果你能剪掉你的利爪,并且磨平你的牙齿,我就立刻让女儿与你成婚。");
lion.think("高兴极了");
lion.say("只要能娶到她,什么条件我都答应,我马上按照你的意思去做!");
System.out.println("=============第二段结束==========");
lion.setClaw(false);
lion.setCanineTeeth(false);
lion.doSomething("打扮一新,前去迎娶新娘");
farmer.doSomething("提着木棒走来!");
farmer.attack(lion);
lion.attack(farmer);
lion.doSomething("落败逃走,没有了尖牙、利爪,狮子再也无法捕捉到猎物,最后饿得奄奄一息。");
System.out.println("=============全剧终==========");
}
}