第9章:オブジェクトとクラス
1.オブジェクトのクラスを定義します
- クラスは、オブジェクトのプロパティと動作を定義します。クラスは、テンプレート、青写真、または契約です。
- オブジェクトはクラスのインスタンスです。クラスは複数のインスタンスを作成できます。インスタンスを作成するプロセスは、インスタンス化とも呼ばれます。
- コンストラクターは、オブジェクトのデータフィールドの初期化など、初期化アクションを完了するために使用されます
- Javaは変数を使用してデータフィールドを定義し、メソッドを使用してアクションを定義します
- 統合モデリング言語(UML)は、クラス図とも呼ばれます
2.クラスを定義し、オブジェクトを作成します
クラスはオブジェクトの定義であり、オブジェクトはクラスから作成されます
引数なしの構築は、プライベートメンバー変数よりも優先されます
public class TestCircle{
public static void main(String[] args){
Circle circle=new Circle();
//可以通过两种方式修改circle的半径
//circle.radius=4;
//circle.setRadius(4);
System.out.println(circle.radius);//2.0
}
}
class Circle{
double radius=1.0;
Circle(){
radius=2.0;
}
void setRadius(double r) {
radius=r;
}
}
1つのフォルダに2つのクラスを配置できますが、パブリッククラスは1つしか存在できず、パブリッククラスはファイル名と同じ名前である必要があり、コンパイル中に2つのクラスファイルが生成されます。
パラメータ構造とメンバー変数に初期値が割り当てられていない場合、デフォルトは0であることに注意してください。
オブジェクト参照変数サークルを作成し、オブジェクトを作成して、このオブジェクトへの参照をこの変数に割り当てます
Circle circle=new Circle();
// 类型 对象引用 创建一个对象
3.コンストラクターを使用してオブジェクトを作成します
new演算子を使用してオブジェクトを作成すると、コンストラクターが呼び出されます。
工法の特殊性:
- クラス名と同じである必要があります
- 戻り値タイプなし
- 役割はオブジェクトを初期化することです
異なる初期値を持つオブジェクトの構築を容易にするために、異なる署名を持つ複数の構築方法が存在する可能性があります
クラスで構築メソッドを定義する必要はありません。デフォルトでは、メソッド本体が空のパラメータなしの構築が暗黙指定されます。構築メソッドが
クラスで明確に定義されていない場合にのみ、自動的に提供されます。その理由は、クラスにすでに構築メソッドがあるためです。デフォルトの引数なしの構成は呼び出されなくなります
4.参照変数を介してオブジェクトにアクセスする
1.オブジェクトのデータとメソッドには、ドット演算子を使用してアクセスします
2.上記のデータドメイン半径は、特定のインスタンスに依存するため、インスタンス変数です。
3.インスタンスを作成せずにMath.pow()メソッドが直接呼び出される理由は、Mathクラスのメソッドが静的であるためです。
4.オブジェクトは、作成後に参照する必要がない場合があります。これは、匿名オブジェクトと呼ばれます
。5 。参照タイプのデータフィールドは、文字列タイプなど、デフォルトではnullです。
6.オブジェクトタイプの割り当ては、変数への参照と、割り当てポイントの後の2つの参照をオブジェクトに割り当てることです。
7. NullPointerException(NullPointerException)
オブジェクト参照がこの変数に割り当てられていない場合は、オブジェクトのデータフィールドとメソッドを呼び出します。これにより、nullポインター例外が発生します。
5.Javaライブラリのクラスを使用します
1.日付クラス
public static void main(String[] args) {
// TODO Auto-generated method stub
Date date = new Date();// 为当前时间创建一个date对象
Date date2 = new Date(3215245);// 从1970年1月1日以毫秒为单位计算给定时间的date对象
System.out.println(date.toString());// 返回日期和时间的字符串表示
//结果:Sat Feb 15 22:19:49 CST 2020
System.out.println(date2.toString());// 返回日期和时间的字符串表示
//结果:Thu Jan 01 08:53:35 CST 1970
System.out.println(date.getTime());// 返回从1970年1月1日至今的毫秒数
//结果:1581776389841
date.setTime(1234564);// 设置一个新的流逝时间
System.out.println(date.toString());
//结果:Thu Jan 01 08:20:34 CST 1970
}
2.ランダムクラス
Random random = new Random();// 当前时间作为种子创建Random对象
Random random2 = new Random(456432154);// 以一个特定值作为种子创建一个Random对象
System.out.println(random.nextInt());// 返回随机一个整数
System.out.println(random.nextInt(6));// 返回6以内的不包含6的随机整数
System.out.println(random.nextLong());// 随机long值
System.out.println(random.nextDouble());// 随机[0.0-1.0)
System.out.println(random.nextFloat());// 随机[0.0F-1.0F)
System.out.println(random.nextBoolean());// 随机boolean值
注意
ランダムオブジェクトを作成するときは、シードまたはデフォルトシードを指定する必要があります。シードが同じである場合、それらは同じシーケンスを生成します。これは、ソフトウェアテストで非常に重要です。
6.静的変数、定数、およびメソッド
静的変数はクラス内のすべてのオブジェクトで共有され、静的メソッドはクラス内のインスタンスメンバーにアクセスできません
静的変数はパブリックメモリアドレスに格納されます
静的メンバーと静的メソッドは、読みやすさを向上させるためにクラス名を使用して呼び出すのが最適です。
System.out.println(Circle.PI);//3.14
class Circle {
double radius = 1.0;
static final double PI = 3.14;//定义常量,常量通常是要被对象共享的,所以用static修饰
Circle(double r) {
radius = r;
}
}
注意
インスタンスメソッドは、インスタンスメンバーとインスタンスメソッドにアクセスできます
静的メソッドは、静的メンバーと静的メソッドにのみアクセスできます
セブン。可視性モディファイア
修飾子 | アクセシビリティ | クラス | 工法 | 方法 | データ | ピース |
---|---|---|---|---|---|---|
(デフォルト)修飾子なし | パッケージ内アクセス | はい | はい | はい | はい | はい |
公衆 | 無制限のアクセス | はい | はい | はい | はい | 番号 |
民間 | クラス内アクセス | 番号 | はい | はい | はい | 番号 |
保護 | パッケージ内のクラスおよび他のパッケージのサブクラスにアクセス可能 | 番号 | はい | はい | はい | 番号 |
クラスのインスタンスの作成を防ぐために、Mathクラスなどのクラス構築メソッドのプライベートな変更を使用できます。
プライベートMath()
8.データフィールドのカプセル化
データドメインをプライベート保護データとして設定し、クラスを簡単に保護できるようにします
データフィールドが直接変更されないようにするには、プライベート変更を使用してデータフィールドをプライベートとして設定します。これはデータフィールドのカプセル化と呼ばれます。
新しい値にアクセスして設定できるようにするには、get()アクセサーとset()修飾子を使用します
アクセサーとモディファイアの作成に習熟している友人は、メニューバーの[ソース]-> [Eclipseのゲッターとセッター]をクリックして、すばやく作成できます。
class Circle {
double radius = 1.0;
static final double PI = 3.14;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
double getArea() {
return radius*radius*PI;
}
}
9.オブジェクトパラメータをメソッドに渡します
オブジェクトをメソッドに渡すことは、オブジェクトの参照をオブジェクトに渡すことであり、参照されるオブジェクトと渡されるオブジェクトは同じです。
注:
次の例は浅いコピーを示しています。circleとcircle2がswapメソッドに渡されると、それらのコピーが生成されます。コピーのアドレスを変更しても、元のコピーには影響しません。
public static void main(String[] args) {
// TODO Auto-generated method stub
Circle circle = new Circle();
Circle circle2 = new Circle();
System.out.println(circle);// 交换前circle指向的地址 T_T.Circle@668bc3d5
System.out.println(circle2);// 交换前circle2指向的地址 T_T.Circle@3cda1055
swap(circle, circle2);// 进行交换
System.out.println();
System.out.println(circle);// 交换后circle指向的地址 T_T.Circle@668bc3d5
System.out.println(circle2);// 交换后circle2指向的地址 T_T.Circle@3cda1055
}
public static void swap(Circle A, Circle B) {
Circle C = A;
A = B;
B = C;
}
参照交換を伴い、参照用に作成された新しいオブジェクトの元のアドレスは変更されません
10.不変のオブジェクトとクラス
1.不変のクラスを定義して不変のオブジェクトを生成することができ、不変のオブジェクトの内容を変更することはできません
2.不変クラスの条件
- セット修飾子なし
- 変数は静的です
- DataクラスのsetTime()メソッドなど、可変データフィールドへの参照を指すアクセサー構造はありません。
11.変数の範囲
1.クラスのインスタンス変数または静的変数はクラス変数またはデータフィールドと呼ばれ、メソッドで定義された変数はローカル変数と呼ばれます。
2.クラス内のメソッドと変数は任意の順序で表示できますが、データフィールドが別のデータフィールド参照に基づいて初期化されている場合
class Circle {
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public Circle() {
}
double getArea() {
return radius * radius * PI;
}
double radius = 1.0;
static final double PI = 3.14;
}
次の例には注意が必要です
int i=2;
int j=i+2;//j的值依赖于i,所以位置不能互换
3.ローカル変数とクラス変数が同じ名前の場合、ローカル変数が優先され、同じ名前のクラス変数は非表示になります。混乱やエラーを避けるために、クラス変数と同じ名前のローカル変数を使用しないようにしてください。
4.クラスの静的{}および{}コードフィールド
Circle circle = new Circle();
Circle circle2 = new Circle();
//运行结果:
// 静态代码域,在类加载的时候调用一次,整个生命周期就只会调用一次
// 普通代码域,类的每个对象创建时都会调用
// 普通代码域,类的每个对象创建时都会调用
static {
System.out.println("静态代码域,在类加载的时候调用一次,整个生命周期就只会调用一次");
}
{
System.out.println("普通代码域,类的每个对象创建时都会调用");
}
注意
- コードドメインで定義された変数はすべてローカルであり、コードドメインでのみ使用できます
- 内部クラスの場合は、静的内部クラスを使用して静的コードブロックを定義する必要があります
- 優先順位:静的コードブロック>メインメソッド>構築コードブロック>構築メソッド
class Student {
static {
System.out.println("Student 静态代码块");
}
{
System.out.println("Student 构造代码块");
}
public Student() {
System.out.println("Student 构造方法");
}
}
class StudentTest {
static {
System.out.println("StudentTest静态代码块");
}
public static void main(String[] args) {
System.out.println("我是main方法");
Student s1 = new Student();
Student s2 = new Student();
}
}
//结果:
//StudentTest静态代码块
//我是main方法
//Student 静态代码块
//Student 构造代码块
//Student 构造方法
//Student 构造代码块
//Student 构造方法
Twelve.this引用
1.これがオブジェクト自体を参照するキーワード。構築メソッド内で他の構築メソッドを呼び出すことができます。
class Circle {
double radius;
static final double PI = 3.14;
public Circle() {
this(1.0);//调用其他构造方法
}
public Circle(double radius) {
this.radius = radius;//这个this关键字用于引用所构建的对象的隐藏数据域radius
}
}
2.参照オブジェクトのインスタンスメンバー
Circle circle = new Circle(3);//28.6
public Circle(double radius) {
this.radius = radius;
System.out.println(this.getArea());
}
3.非表示のデータフィールドを参照し、オーバーロードされたコンストラクターを呼び出す場合、この参照が必要です
4.非表示の静的変数はクラス名で実現できます。静的変数、インスタンス変数の非表示にはこれを呼び出す必要があります
注意
- Javaでは、構築メソッドで、thisステートメント(パラメーターリスト)を他のステートメントの前に置く必要があります。
- クラスに複数の構築メソッドがある場合は、これ(パラメータリスト)を使用して可能な限り実装するのが最善です。通常、パラメータがないか少ない構築メソッドは、これ(パラメータリスト)を使用して、より多くのパラメータを持つ構築メソッドを呼び出すことができます。
13.まとめ
この章の学習を通じて、クラスとオブジェクトの意味、およびそれらを定義する方法、メソッドを構築してオブジェクトを作成する方法、変数を参照してオブジェクトにアクセスする方法、および例外を学習する方法を理解しています(nullポインター例外、さらに多くの例外は後で紹介します) 、静的変数と定数を定義する方法を知っている、それらを呼び出すときにそれらを直接呼び出すためにクラスを使用するのが最善であり、データをカプセル化し、オブジェクトパラメータをメソッドに渡すことの利点を学びました、浅いコピー。不変のクラスと変数のスコープ、静的コードドメインと構造コードドメインの優先順位を作成する方法を理解し、この参照の非常に実用的な役割を学びます。