ホームページ  >  記事  >  Java  >  Java オブジェクト指向について簡単に説明します

Java オブジェクト指向について簡単に説明します

WBOY
WBOY転載
2022-03-10 17:52:422230ブラウズ

この記事では、java に関する関連知識を提供します。主に、オブジェクト指向の基本的な特性、オブジェクト間の関係など、Java オブジェクト指向に関連する問題を紹介します。ヘルプ。

Java オブジェクト指向について簡単に説明します

推奨学習: 「java チュートリアル

1. Java 特殊効果

1.シンプル セックス

人々は、難解な専門トレーニングなしでプログラムでき、今日の標準的な慣行に準拠したシステムを構築したいと考えています。したがって、C は適さないと思われがちですが、Java はシステムを理解しやすくするために可能な限り C に近づけるように設計されており、C のほとんど使用されない、理解しにくい、混乱を招く機能の多くを排除しています。現時点では、これらの機能は良いことよりもはるかに多くの問題を引き起こします。

確かに、Java 構文は C 構文の「純粋な」バージョンです。ヘッダー ファイル、ポインター算術 (またはポインター構文)、構造体、共用体、演算子のオーバーロード、仮想基本クラスなどはありません。ただし、設計者は C の不適切な機能をすべて削除しようとしたわけではありません。たとえば、switch ステートメントの構文は Java では変更されていません。 C の知識がある場合は、Java 構文に簡単に変換できることがわかります。

Java がリリースされたとき、C は実際には最も一般的に使用されるプログラミング言語ではありませんでした。多くの開発者は、Visual Basic とそのドラッグ アンド ドロップ プログラミング環境を使用しています。これらの開発者は Java を簡単だとは思っていません。 Java 開発環境が追いつくまでには何年もかかりました。現在、Java 開発環境は、他のほとんどのプログラミング言語をはるかに超えて進化しています。

シンプルさのもう 1 つの側面は、小ささです。 Java の目標の 1 つは、小型マシン上で独立して実行できるソフトウェアの開発をサポートすることです。基本的なインタプリタとクラス サポートはわずか約 40 KB ですが、基本的な標準クラス ライブラリとスレッド サポート (基本的に自己完結型マイクロカーネル) を追加すると、約 175 KB が追加されます。

当時としては、これは驚くべき成果でした。もちろん、継続的な拡張により、クラス ライブラリはすでにかなり大きくなっています。現在、組み込みデバイスに適した、より小規模なクラス ライブラリを備えた別の Java Micro Edition (JavaMicroEdition) が存在します。

2. オブジェクト指向

オブジェクト指向は、新しいプログラミング手法、または新しいプログラミング仕様であり、その基本的な考え方はオブジェクトを使用することです。プログラミングには、クラス、継承、カプセル化、ポリモーフィズムが使用されます。現実世界に客観的に存在するもの(オブジェクト)を基にしてソフトウェアシステムを構築し、人間の自然な思考を可能な限り活用してシステム構築を行います。

3. 分散

ユーザーにとって、分散システムは、ユーザーが必要とするサービスを提供するサーバーに過ぎませんが、実際には、これらのサービスを構成する分散システムです。その背後には多数のサーバーが配置されているため、分散システムはスーパーコンピューターのように見えます。

4. 堅牢性

プログラムはさまざまなシステムで確実に実行される必要があるため、Web のマルチプラットフォーム環境ではプログラムに特別な要件があります。したがって、Java を設計する際には、堅牢なプログラムを作成する能力が高い優先順位を与えられました。信頼性を実現するために、Java はいくつかの重要な領域に制限を課しているため、プログラマはプログラム開発の早い段階でエラーを検出する必要があります。同時に、プログラマーは、プログラミング エラーを引き起こす最も一般的な問題の多くについて心配する必要がなくなります。 Java は厳密に型指定された言語であるため、コンパイル時にコードをチェックします。もちろん、何にせよ、コードは実行時にもチェックされます。追跡が難しいバグの多くは、実行時に再現することが困難であることが多く、Java ではこれが発生することはほとんど不可能です。なぜなら、書かれたプログラムをさまざまな動作条件下で予測可能な方法で実行できるようにすることは、Java の重要な機能の 1 つだからです。 Java がどれほど堅牢であるかをより深く理解するために、プログラム障害の 2 つの主な原因、つまりメモリ管理エラーとハンドルされない例外 (つまり、実行時エラー) を分析してみましょう。従来のプログラミング環境では、メモリ管理は困難で退屈な作業です。たとえば、C/C では、プログラマはすべての動的メモリを手動で割り当てて解放する必要があります。プログラマが以前に割り当てられたメモリを解放し忘れたり、さらに悪いことに、プログラムの他の部分でまだ使用されているメモリを解放しようとしたりするため、これにより問題が発生することがあります。 Java は、メモリの割り当てと割り当て解除を管理することで、基本的にこれらの問題を解決できます (実際、Java は使用されなくなったオブジェクトのガベージ コレクションを提供するため、メモリの解放は完全に自動的に行われます)。従来の環境における例外は、多くの場合、「ゼロ除算」または「ファイルが見つかりません」エラーによって発生し、不器用で理解しにくい構造を使用して管理する必要があります。 Java は、オブジェクト指向の例外処理機能を提供することで、この分野に役立ちます。適切に作成された Java プログラムでは、すべてのランタイム エラーはプログラムによって管理できますし、管理する必要があります。

5. セキュリティ

Java は強力だが危険なポインタをキャンセルし、参照に置き換えました。ポインタは移動操作を実行できるため、この領域が利用可能であるかどうかに関係なく、ポインタは任意のメモリ領域を指すことができますが、このメモリ アドレスには重要なデータが格納されているか、他のプログラムによって占有されている可能性があり、ポインタを使用することは危険です。配列が範囲外になりやすい。

ガベージ コレクション メカニズム: プログラマはメモリのリサイクルを直接制御する必要はなく、ガベージ コレクタはバックグラウンドで未使用のメモリを自動的に再利用します。プログラムが時間内のリサイクルを忘れてメモリ リークを引き起こすことを防ぎます。プログラムのコア クラス ライブラリのメモリをリサイクルする際のプログラム エラーによってシステム クラッシュが発生することを回避します。

例外処理メカニズム: Java 例外メカニズムは主に、try、catch、finally、throw、throws の 5 つのキーワードに依存します。

強制型変換: 強制変換は、強制変換ルールが満たされている場合にのみ成功します。

Java は、バイトコードの送信中に公開キー暗号化 (PKC) を使用します。

実行環境に 4 つのレベルのセキュリティ メカニズムを提供します: バイトコード ベリファイア - クラス ローダー - ランタイム メモリ レイアウト - ファイル アクセス制限。

6. アーキテクチャの中立性

コンパイラは、アーキテクチャに中立なオブジェクト ファイル形式を生成します。これは、Java ランタイムがある限り使用できるコンパイル済みコードです。システム。多くのプロセッサ上で実行できます。 Java コンパイラは、特定のコンピュータ アーキテクチャに依存しないバイトコード命令を生成することでこの機能を実現します。適切に設計されたバイトコードは、どのマシンでも簡単に解釈して実行できるだけでなく、ローカル マシン コードにすばやく変換することもできます。
バイトコードは構造に中立であり、コンピューターの構造とは何の関係もありません。

7. 移植性

Java 言語の最大の特徴は移植性のサポートです。いわゆる移植性とは、同じプログラムを異なるオペレーティング システムで使用できることを意味します。任意にデプロイできます。 Java で移植性の制御を実現したい場合は、主に JVM (Java Virtual Machine) に依存します。 Java 仮想マシンは、ソフトウェアとハ​​ードウェアによってシミュレートされたコンピュータであり、Java 仮想マシンでサポートされている限りすべてのプログラムを実行でき、オペレーティング システムごとに異なるバージョンの JVM が存在するため、移植性が可能です。
著作権は作者に帰属します。商業転載の場合は作者に許可を、非商業転載の場合は出典を明記してください。

8. 解釈可能性

Java はコンパイルされていると言う人もいます。すべての Java コードはコンパイルする必要があるため、コンパイルしないと .java を実行できません。 Java はインタープリターであると言う人もいます。 Java コードはコンパイル直後に実行できないため、JVM 上で解釈されて実行されます。

9. 高いパフォーマンス

ジャストインタイム コンパイラは、頻繁に実行されるコードを監視し、速度を上げるために最適化することができます。より複雑な最適化は、関数呼び出し (つまり、インライン化) を排除することです。ジャストインタイム コンパイラは、どのクラスがロードされたかを認識します。インライン化は、現在ロードされているクラスのセットに基づいて特定の関数がオーバーライドされない場合に使用できます。必要に応じて、最適化を元に戻すこともできます。

10. マルチスレッド

とは、このプログラム (プロセス) の実行中に複数のスレッドが生成されることを指します。

11. ダイナミクス

Java は本質的に静的言語であり、動的言語ではありません。動的言語の大きな特徴は、プログラムの実行中にプログラムの構造や変数の型を変更できることであり、代表的な動的言語としては、Python、ruby、javascriptなどが挙げられます。 Java は動的言語ではありませんが、Java にはある程度のダイナミクスがあり、それが次の側面に反映されています:

  1. リフレクション メカニズム;
  2. ダイナミック バイトコード操作;
  3. 動的コンパイル;
  4. 他のスクリプト コードを実行;

2. オブジェクト

オブジェクトは、システム内の客観的なものを記述するために使用されるエンティティであり、システムAの基本単位を構成します。オブジェクトは、プロパティのセットと、プロパティのセットに対して動作するサービスのセットで構成されます。

クラスのインスタンス化によりオブジェクトが生成されます。オブジェクトのライフサイクルには、生成、使用、削除の 3 つの段階が含まれます。

オブジェクトへの参照がない場合、そのオブジェクトは役に立たないオブジェクトになります。 Javaのガベージコレクタは、オブジェクトの動的メモリ領域を自動的にスキャンし、参照されていないオブジェクトをガベージとして収集し、解放します。システムでメモリが不足するか、System.gc() を呼び出してガベージ コレクションが必要になると、ガベージ コレクション スレッドがシステムと同期して実行されます。

3. クラス

クラスは、同じプロパティとメソッドを持つオブジェクトのコレクションであり、内部のプロパティとメソッドを含む、クラスに属するすべてのオブジェクトの統一された抽象的な説明を提供します。主要な部分。オブジェクト指向プログラミング言語では、クラスは独立したプログラム単位であり、クラス名があり、属性とメソッドという 2 つの主要部分が含まれている必要があります。

Java でのクラス実装は、クラス宣言とクラス本体の 2 つの部分で構成されます。

1. クラス宣言

[public][abstract|final] class className [extends superclassName] [implements interfaceNameList]{……}

このうち、修飾子 public、abstract、final はクラスの属性を記述し、className はクラス名、superclassName はクラスの属性を記述します。クラスの親クラス Name、interfaceNameList は、クラスによって実装されるインターフェイスのリストです。

2. クラス本体

class className{
    [public | protected | private ] [static] [final] [transient] [volatile] type variableName;//成员变量
    [public | protected | private ] [static] [final | abstract] [native] [synchronized] returnType methodName([paramList]) [throws exceptionList]{
        statements
    }//成员方法
}

メンバ変数修飾子の意味:

  • static: 静的変数(クラス変数)
  • final: 定数; transient: 一時変数、オブジェクトのアーカイブに使用され、オブジェクトのシリアル化に使用されます
  • volatile: 貢献変数、同時スレッドの共有に使用されます

の実装このメソッドには、メソッド宣言とメソッド本体という 2 つの部分も含まれています。

  • static: クラス メソッド。クラス名を通じて直接呼び出すことができます。
  • abstract: 抽象メソッド、メソッド body はありません。
  • final: メソッドはオーバーライドできません
  • native: 他の言語からのコードを統合する
  • synchronized: 複数の同時スレッドへのアクセスを制御

メソッド宣言には、メソッド名、戻り値の型、および外部パラメーターが含まれます。パラメーターの型は、単純データ型または複合データ型 (参照データ型とも呼ばれます) にすることができます。
単純なデータ型の場合、Java は値転送を実装します。メソッドはパラメータの値を受け取りますが、これらのパラメータの値を変更することはできません。パラメーターの値を変更する場合は、参照データ型を使用します。これは、参照データ型はメモリ内のデータのアドレスをメソッドに渡し、メソッド内のデータに対する操作によってデータの値が変更される可能性があるためです。 。

3. メソッド本体

メソッド本体はメソッドの実装であり、ローカル変数の宣言とすべての正当な Java 命令が含まれます。メソッド本体で宣言されたローカル変数のスコープはメソッド内です。ローカル変数がクラス メンバー変数と同じ名前を持つ場合、クラス メンバー変数は非表示になります。

パラメータをクラスのメンバー変数と区別するには、これを使用する必要があります。これは、現在のオブジェクトを参照するためにメソッドで使用され、その値はメソッドを呼び出したオブジェクトです。戻り値は、戻り値の型と一致しているか、まったく同じであるか、そのサブクラスである必要があります。戻り値の型がインターフェイスの場合、戻り値はインターフェイスを実装する必要があります。

4.施工方法

  • 施工方法は特殊な工法となります。 Java のすべてのクラスには、そのクラスのオブジェクトを初期化するコンストラクター メソッドがあります。
  • コンストラクターはクラス名と同じ名前を持ち、データ型を返しません。
  • オーバーロードはコンストラクターでよく使用されます。
  • コンストラクター メソッドは、new 演算子によってのみ呼び出すことができます

5. コメント

Java のコメントは、コードを説明するために使用されます。 , Javaのアノテーションは実行されないので、自由にアノテーションを追加してください。

  • When 行コメント//
  • 複数行コメント/**/

##6. 暗黙的パラメーターと明示的パラメーター

(1) 明示的なパラメータは、メソッド名の括弧内のパラメータです。

(2) 暗黙のパラメータは、クラス メソッドで呼び出されるクラスのインスタンス フィールドです。呼び出されるインスタンス フィールドは暗黙的なパラメータです。

(3) コード例

package com.nezha.javase;

public class Test1107 {
    private int score;

    /**
     * x为显式参数
     * score为隐式参数
     * @param x
     */
    public void addScore(int x){
        int temp = this.score + x;
        score += temp;
    }
}
#xx は明示的なパラメータです
  • score は暗黙的なパラメータです
  • 暗黙的な追加の場合これをパラメータの前に置くと、暗黙的なパラメータが明確になります。

この演算子は、このクラスを表すため、暗黙的なパラメーターの前に追加することをお勧めします。

7. 可変パラメータを持つメソッド

jdk5 より前では、各 Java メソッドには固定数のパラメータがありましたが、現在のバージョンでは利用可能なパラメータの変更方法が提供されています。

最も一般的に使用される sout を例に挙げます。

System.out.println("获奖编号:"+i);

println は内部で
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}

Object を呼び出します...パラメータの型は Object[] とまったく同じです。つまり...この宣言メソッドを使用して、同じ型ですが固定されていません 可変パラメータである配列のサイズ。

ここの省略記号は、このメソッドが任意の数のオブジェクトを受け取ることができることを示す Java コードの一部です。

実際には、printf メソッドは 2 つのパラメータを受け取ります。1 つはフォーマット文字列で、もう 1 つはすべてのパラメータを格納する Object[] 配列です (パラメータが基本型の場合、自動ボックス化によりオブジェクトに変換されます)。
コンパイラーは、パラメーターを配列にバインドし、必要に応じてオートボクシングを実行するために、各呼び出しを printf に変換する必要があります。

4. オブジェクト指向の基本的な特徴

1. カプセル化

カプセル化とは、オブジェクトの内部の詳細を可能な限り隠し、外部との境界を形成し、外部と対話できるのは限られたインターフェイスとメソッドだけです。カプセル化の原理は、オブジェクト以外の部分がオブジェクトの内部プロパティにアクセスして自由に操作できないようにすることにより、外界がオブジェクトの内部プロパティに損傷を与えるのを防ぐことです。

(1)可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。

  • private:类中限定为private的成员,只能被这个类本身访问。
  • default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
  • protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
  • public:类中限定为public的成员,可以被所有的类访问。

(2)封装的优点

  1. 良好的封装能够减少耦合
  2. 类内部的结构可以自由修改
  3. 可以对成员变量进行更精确的控制
  4. 隐藏信息,实现细节

(3)代码实例

  1. 将 id、name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
  2. 提供set方法进行赋值,提供get方法进行取值。
  3. 赋值方法set中的this的作用是解决显式参数与局部变量同名的问题。
package com.nezha.javase;

public class Student {
    //将 id、name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

2、继承

子类的对象拥有父类的全部属性与方法,称作子类对父类的继承。

  • Java中父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承。
  • 继承实现了代码的复用。
  • Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。
  • 子类不能继承父类中访问权限为private的成员变量和方法。
  • 子类可以重写父类的方法,即命名与父类同名的成员变量。

Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。super 的使用有三种情况:

  • 访问父类被隐藏的成员变量
  • 调用父类中被重写的方法
  • 调用父类的构造函数

3、多态

对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。

Java的多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。

  • 编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
  • 运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。

4、重载

  • 方法重载是让类以统一的方式处理不同数据类型的手段。
  • 一个类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
  • 返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准。

5、重写

  • 子类对父类的方法进行重新编写。如果在子类中的方法与其父类有相同的的方法名、返回类型和参数表,我们说该方法被重写 (Overriding)。
  • 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
  • 子类函数的访问修饰权限不能低于父类的。

五、对象间的四种关系

1、依赖

依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。 

2、关联

关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。

3. アグリゲーション

アグリゲーション (集約) 関係は、関連関係の一種であり、強い関連関係です。集合体とは、全体と個人との関係です。例えば、自動車というカテゴリーと、エンジンやタイヤなどの部品カテゴリーとの関係は、全体と個の関係です。関連関係と同様に、集約関係もインスタンス変数を通じて実装されます。ただし、関連付け関係に含まれる 2 つのクラスは同じレベルにありますが、集約関係では 2 つのクラスは等しくないレベルにあり、1 つは全体を表し、もう 1 つは部分を表します。

4. Combination

Composition (合成) 関係は、関連付け関係の一種であり、集約関係よりも強力な関係です。通常の集約関係では全体を表すオブジェクトが、そのオブジェクトの一部のライフサイクルを表す責任を負う必要があり、組み合わせ関係を共有することができない。全体を表すオブジェクトは、部分オブジェクトを存続させ、場合によっては部分を担当するオブジェクトを消滅させる責任を負う必要があります。全体を表すオブジェクトは、部分を表すオブジェクトを、このオブジェクトのライフサイクルを担当する別のオブジェクトに渡すことができます。言い換えれば、パーツを表すオブジェクトは、各瞬間に 1 つのオブジェクトとのみ組み合わせることができ、後者がライフサイクルに対して排他的に責任を負います。部品には全体と同じライフサイクルがあります。

推奨学習: 「java 学習チュートリアル

以上がJava オブジェクト指向について簡単に説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。