
原标题:程序员: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不是同一个目标,是两个不同的目标
在办法调用结束后,匿名目标将变成废物
责任编辑:








