オブジェクト指向の概要は、オブジェクトを作成し、メモリ内の操作:Javaの

オブジェクト指向の考え方

単一、または単純な需要は、我々が行くとステップ動作によるステップは問題ありません、そして効率も高価です。
需要が変更できるとともに増加の機能は、すべてのステップに多くの問題に直面することがわかりました。続いて、考えるようになった
さまざまな機能に応じてパッケージ、異なるパッケージには、同様の機能を一緒にパッケージする場合、することができますこれらの手順や機能のカプセル化へ。
このような構造は、多くのことをクリアします。それに対応するクラスを見つけるために使用する場合。これは、オブジェクト指向の考え方です。
オブジェクト指向の思考は、物事の一種オブジェクトである
すべてのものは、クラスメソッドを作成するために、別のクラスにパッケージ化されたJavaで、オブジェクトを呼び出す、でも例外やエラーがプログラムで発生したように、それぞれの出現としてパッケージ化されています問題は、バックは、私たちが持つ単純なスタートスタートで開始していることこれらの繰り返しオブジェクトです
:冷蔵庫に象をオフに持参する方法
の手順:
1.オープン冷蔵庫のドア
2のぬいぐるみ象
近い3.冷蔵庫のドア
これはプロセス指向であります考えは、実際には、日常生活の中で、従来の考え方は、プロセス指向であり、我々はそれを思考からシフトする必要がある
、我々は今、クラス、オブジェクトとしての私たちの家の冷蔵庫として冷蔵庫ですが、冷蔵庫の機能はプラグがされています象
たちがいる限り、我々は冷蔵庫に象を知っているように、冷蔵庫は自動的に象になります、象をプラグインする方法を検討していない
奇妙な音が、これは理解を容易にする唯一の例であり、引用した
この例で我々は、オペレータが司令官、我々は物事をやりたいオブジェクトのコマンドになりたいことを知っている
今、私たちが命じていること、それはスーツになります 機会の例
会社では、上司が取締役であり、そして私たちの上司は、コードをノックであることをオペレータに、提携して、下位のオブジェクトであります
今、このプロジェクトは、上司として我々だけでタスクを完了するために部下に、ちょうどすることができますタスク機能を完了するために、部下を知っている必要があるか、各子会社が完了したことにより、仕事に部下(オブジェクト)は、あなたの上司は、知っているしないように、割り当てに行く必要があり、タスクは、プロジェクトの最終完成は、の詳細があり、このような協力の2つの以上の子会社かもしれないが、上司はおよそ、上司はまだ完了したプロジェクトを気にしようとしている気にする必要はありません
、あまりにも、およびプログラムすべてのクラス、自分のタスクアウトすべてのオブジェクトのキャリーは、彼らはまた、(つまり、オブジェクトのクラス他のクラスでの呼び出し、または他の方法でメソッドを呼び出します)互いに協力が存在し、そして最終的に私たちの実行が成功し、これは私たちです目的
の使用で、コードの再利用性を向上させることができるときが、1つの違い、Javaはオブジェクト指向言語ですが、それでもプロセス指向のコードの機能を実現依存しているが、我々は、プロセス指向のコードをカプセル化します、メイク・コールまた、私たちの仕事を簡素化する
オブジェクト指向機能を:
1.シール 手段
2.継承
3.多型

クラスとオブジェクト

クラスは、物事の現実を説明する、クラスのメンバ変数とメンバメソッドがあり、抽象的な概念であり
、物事の現実と同等のメンバ変数のプロパティは、関数やメソッドのメンバーが本当のものの動作に相当し、
オブジェクトは、そのようなものの具体的な症状である
私たちは、これらの概念は、学生のクラスによって理解されるべきです

/*
学生类
属性:姓名,年龄,学号...
行为:学习,吃饭,睡觉
*/
class Student
{
    public String name;//姓名
    public int age;     //年龄
    public String number;//学号
    public void study()		//学习行为
    {
        System.out.println("学习...");
    }
    public void eat()		//吃饭行为
    {
        System.out.println("吃饭...");
    }
    public void sleep()		//睡觉行为
    {
        System.out.println("睡觉...");
    }
}

クラスの使用

/*
我们还需要写一个测试类来使用学生类
*/
public class StudentTest
{
	public static void main(String[] args)
	{
		Student s=new Student();
		System.out.println(s.name);
        System.out.println(s.age);
        System.out.println(s.number);
        s.study();
        s.sleep();
        s.eat();
	}
}
/*
运行结果:
null
0
null
学习...
睡觉...
吃饭...
*/

操作オブジェクトの作成メモリ

学生S =新学生();

手順:
1.ロードメモリStudentTest.class Student.classにファイルおよび
スタックメモリの主な方法で2のオープンスペース
3.学生のためのヒープメモリの被験者におけるオープンスペース、およびアドレス値に割り当てる
4.生徒をオブジェクトのメンバ変数のデフォルトの初期化
5.学生オブジェクトの初期化が完了すると、ターゲットアドレスは、変数sに代入されます

class Student {
	public String name;
	public int age;
	public void show(){
		System.out.println( name + "---" + age );
	}
}

オブジェクトのメモリ操作
Student s = new Student();
System.out.println( s.name);
System.out.println( s.age);
s.name="小强";
s.age=20;
System.out.println( s.name);
System.out.println( s.age);

メモリマップ:
ここに画像を挿入説明
分析:

  1. 首先在将Test.class和Student.class加载进方法区
  2. 在栈内存中的main方法中开辟一块空间变量存储Student类变量s
  3. 在堆内存中通过new开辟一块空间存储Student对象,并为其分配一个地址值0x001,该对象的name初始化值为null,age为0,并把这个地址值赋值给s,s指向该对象
  4. 输出s指向的对象的name和age
  5. 将"小强"赋值给s指向的对象的name,null被"小强"覆盖,同样将20赋值给该对象的age,0被20覆盖
  6. 再次输出s指向的对象的name和age
两个不同对象的内存操作
Student s1 = new Student();
Student s2 = new Student();
s1.name="小丽";
s1.age=18;
s2.name="小明";
s2.age=20;
s1.show();
s2.show();

s1.age=21;
s2.name="小亮";
s1.show();
s2.show();

内存图:
ここに画像を挿入説明
分析:

  1. 首先在将Test.class和Student.class加载进方法区
  2. 在栈内存中的main方法中开辟一块空间变量存储Student类变量s1
  3. 在堆内存中通过new开辟一块空间存储Student对象,并为其分配一个地址值0x001,该对象的name初始化值为null,age为0,然后把这个地址值赋值给s1,s1指向该对象
  4. 将"小丽"赋值给s1指向的对象的name,null被"小丽"覆盖,同样将18赋值给该对象的age,0被18覆盖
  5. 在栈内存中的main方法中开辟一块变量存储Student类变量s2
  6. 在堆内存中通过new开辟一块空间存储Student对象,并为其分配一个地址值0x002,该对象的name初始化值为null,age为0,然后把这个地址值赋值给s2,s2指向该对象
  7. 将"小明"赋值给s2指向的对象的name,null被"小明"覆盖,同样将20赋值给该对象的age,0被20覆盖
  8. 通过s1指向的对象调用show方法,通过s2指向的调用show方法
  9. 将21赋值给s1指向的对象的age,18被21覆盖,将"小亮"赋值给s2指向的对象的name,小明被小亮覆盖
  10. 通过s1指向的对象调用show方法,通过s2指向的调用show方法
三个引用两个对象的内存操作
Student s1 = new Student();
Student s2 = new Student();
s1.name="小丽";
s1.age=18;
s2.name="小明";
s2.age=20;
Student s3 = s1;
s3.age=20;
s1.show();
s2.show();
s3.show();

内存图:
ここに画像を挿入説明
分析:

  1. 首先在将Test.class和Student.class加载进方法区
  2. 在栈内存中的main方法中开辟一块空间变量存储Student类变量s1
  3. 在堆内存中通过new开辟一块空间存储Student对象,并为其分配一个地址值0x001,该对象的name初始化值为null,age为0,然后把这个地址值赋值给s1,s1指向该对象
  4. 将"小丽"赋值给s1指向的对象的name,null被"小丽"覆盖,同样将18赋值给该对象的age,0被18覆盖
  5. 在栈内存中的main方法中开辟一块变量存储Student类变量s2
  6. 在堆内存中通过new开辟一块空间存储Student对象,并为其分配一个地址值0x002,该对象的name初始化值为null,age为0,然后把这个地址值赋值给s2,s2指向该对象
  7. 将"小明"赋值给s2指向的对象的name,null被"小名"覆盖,同样将20赋值给该对象的age,0被20覆盖
  8. 再栈内存main方法中开辟一块空间存储Student类型变量s3,把s1的值赋给s3,s3和s1指向同一个对象
  9. 将20赋值给s3指向的对象的age,18被20覆盖
  10. 通过s1指向的对象调用show方法,通过s2指向的调用show方法,通过s3指向的调用show方法

局部变量和成员变量

局部变量是定义在方法内部或者方法上的变量,它随着方法的调用而产生,随着方法的调用结束而结束
成员变量是定义再类中方法外的变量,是类中的属性,随着对象的创建而产生,随着对象消失而消失
辨析:
1.在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
2.在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
3.生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4.初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注:局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则

public class Demo {
	int num=3;
   	public static void main(String[] args) {
       	int num=2;
       	System.out.println(num);
   	}
}
/*
输出结果为2
如果本方法中存在该变量就使用本方法内中的变量
如果本方法中不存在改变了,就去方法外寻找,如果有使用方法外的变量
如果没有报错
*/

引用类型作为形参问题

如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。

class Student{
    String name="张三";
    int age=23;
    public void show(){
        System.out.println(name); 
        System.out.println(age); 
    }
}
public static void main(String[] args) {
        int num=20;
        String name="哈哈";
        Student student = new Student();
        test(num,name,student);
        System.out.println(student.name);	 
        System.out.println(student.age); 
        student.show();
        System.out.println(num);
    }
    public static void test(int a, String b, Student student){
        student.name=b;
        student.age=a;
    }
    public static void test(int num)
    {
    	num=5;
    }
}
/*
运行结果:
哈哈
20
哈哈
20
20
*/
/*
test(int a, String b, Student student)
在该方法中,内存中的操作:
1.在栈内存test方法中开辟一块空间存储student变量,把main方法中的student变量的值传给引用类型形参student
2.test方法中的变量student指向了堆内存中的Student对象,和main方法中的student变量指向相同
3.将该对象的name和age的值用"哈哈"和20
所以当再次输出该对象的name和age时,它们的值已经改变
test(int num)
注意该方法没有返回值
num=5只是将5赋值给test方法中的num变量,和main方法中的num变量无关
*/

匿名对象

匿名对象就是没有名字的对象
使用场景:调用方法,仅仅只调用一次的时候。

class Student
{
	public String name;
	public void study()		//学习行为
    {
        System.out.println("学习...");
    }
    public void eat(Student s)
    {
    	System.out.println("和"+s.name+"一起吃饭");
    }
}
class StudentTest
{
	public static void main(String[] args)
	{
		Student s1=new Student();
		new Student().study();
		s1.eat(new Student());
	}
}
/*
注意:前后两句中的new Student()不是同一个对象,是两个不同的对象
在方法调用完毕后,匿名对象将变成垃圾
*/
公開された26元の記事 ウォンの賞賛1 ビュー371

おすすめ

転載: blog.csdn.net/weixin_45919908/article/details/103448684