程序员java面向目标概述创立目标时内存中的操作

来源:自媒体

作者:程序猿的内心独白

2019-12-13 14:08:19  阅读:7815+

原标题:程序员:java面向目标概述、创立目标时内存中的操作

面向目标思维

当需求单一,或许简略时,咱们一步一步去操作没问题,而且功率也挺高。

可跟着需求的更改,功用的增多,发现需求面临每一个进程很麻烦了。这时就开端思索,

能不能把这些进程和功用在进行封装,封装时依据不同的功用,进行不同的封装,功用相似的封装在一同。

这样结构就明晰了许多。用的时分,找到对应的类就能够了。这便是面向目标的思维。

面向目标思维是一种万物皆目标的思维

Java中把一切事物都封装成不同的类,经过类来创立办法,调用目标,甚至连程序中呈现的反常和过错都被封装成类,每次呈现的问题都是目标,这些后边再讲,咱们先从简略的开端下手

怎么把一个大象关进冰箱:

进程:

1.翻开冰箱门

2.塞进大象

3.关上冰箱门

这是面向进程的思维,事实上在日常日子中,面向进程是惯例思维,而咱们应该从这种思维进行改动

咱们现在把冰箱当作一个类,把咱们家里的冰箱当作一个目标,而冰箱有一个功用便是塞大象

咱们现在不必考虑怎么去塞大象,咱们只需知道把大象给冰箱,冰箱就会主动把大象塞进去

听起来如同很难以想象,但这仅仅为了便利了解而举的比如

经过这个比如,咱们咱们都知道咱们要从操作者变成指挥者,咱们要指挥目标干事

已然咱们是指挥者,那就再看一个切合实际的比如

在一个公司中,上司便是指挥者,而部属便是操作者,即上司便是咱们敲代码的,部属便是一个个目标

现在有一个项目,作为上司咱们只需求把使命分配下去,让部属(目标)进行作业,上司不知道部属要怎么完结使命,只需求知道部属具有完结使命的功用就能够,经过每一个部属的完结使命,终究这个项目完结了,这其间可能会存在两个或多个部属的协作之类的细节,但这些上司不需求去关怀,上司要去关怀的便是项目完结了吗

而一个程序也是这样,每一个类,每一个目标都完结自己的使命,它们也存在相互协作(即在一个类中调用其他类的目标,或许一个办法中调用其他办法),终究咱们的程序运转成功,这便是咱们的意图

可是有一点不同,虽然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;

}

}

目标创立进程中内存中的操作

Student s = new Student;

进程:

  • 1.加载Student.class和StudentTest.class文件进内存
  • 2.在栈内存的main办法中为s拓荒空间
  • 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);

内存图:

剖析:

首先在将Test.class和Student.class加载进办法区

在栈内存中的main办法中拓荒一块空间变量存储Student类变量s

在堆内存中经过new拓荒一块空间存储Student目标,并为其分配一个地址值0x001,该目标的name初始化值为null,age为0,并把这个地址值赋值给s,s指向该目标

输出s指向的目标的name和age

将"小强"赋值给s指向的目标的name,null被"小强"掩盖,相同将20赋值给该目标的age,0被20掩盖

再次输出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;

内存图:

剖析:

首先在将Test.class和Student.class加载进办法区

在栈内存中的main办法中拓荒一块空间变量存储Student类变量s1

在堆内存中经过new拓荒一块空间存储Student目标,并为其分配一个地址值0x001,该目标的name初始化值为null,age为0,然后把这个地址值赋值给s1,s1指向该目标

将"小丽"赋值给s1指向的目标的name,null被"小丽"掩盖,相同将18赋值给该目标的age,0被18掩盖

在栈内存中的main办法中拓荒一块变量存储Student类变量s2

在堆内存中经过new拓荒一块空间存储Student目标,并为其分配一个地址值0x002,该目标的name初始化值为null,age为0,然后把这个地址值赋值给s2,s2指向该目标

将"小明"赋值给s2指向的目标的name,null被"小明"掩盖,相同将20赋值给该目标的age,0被20掩盖

经过s1指向的目标调用show办法,经过s2指向的调用show办法

将21赋值给s1指向的目标的age,18被21掩盖,将"小亮"赋值给s2指向的目标的name,小明被小亮掩盖

经过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;

内存图:

剖析:

首先在将Test.class和Student.class加载进办法区

在栈内存中的main办法中拓荒一块空间变量存储Student类变量s1

在堆内存中经过new拓荒一块空间存储Student目标,并为其分配一个地址值0x001,该目标的name初始化值为null,age为0,然后把这个地址值赋值给s1,s1指向该目标

将"小丽"赋值给s1指向的目标的name,null被"小丽"掩盖,相同将18赋值给该目标的age,0被18掩盖

在栈内存中的main办法中拓荒一块变量存储Student类变量s2

在堆内存中经过new拓荒一块空间存储Student目标,并为其分配一个地址值0x002,该目标的name初始化值为null,age为0,然后把这个地址值赋值给s2,s2指向该目标

将"小明"赋值给s2指向的目标的name,null被"奶名"掩盖,相同将20赋值给该目标的age,0被20掩盖

再栈内存main办法中拓荒一块空间存储Student类型变量s3,把s1的值赋给s3,s3和s1指向同一个目标

将20赋值给s3指向的目标的age,18被20掩盖

经过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);

}

}

引证类型作为形参问题

假如你看到了一个办法的形式参数是一个类类型(引证类型),这儿其实需求的是该类的目标。

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;

}

}

匿名目标

匿名目标便是没有姓名的目标

运用场景:调用办法,仅仅只调用一次的时分。

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不是同一个目标,是两个不同的目标

在办法调用结束后,匿名目标将变成废物

责任编辑:

“如果发现本网站发布的资讯影响到您的版权,可以联系本站!同时欢迎来本站投稿!