您的位置:首页 > 其它

类与对象简介/定义/认识/基本使用/对象内存分析

2018-01-21 19:10 531 查看
面向对象是一种程序设计方法,但并不表示所有的开发者都认同面向对象。因为有很多的开发者认为面向对象过于复杂,所以更多的人愿意使用函数式编程。

面向对象的前身属于面向过程,如果要想笼统的去解释这两种开发模型的区别,最好的例子:

面向过程是解决问题,面向对象是模块化的设计。对于现在的程序开发更多情况下就像是汽车组装一样,不同的工厂生产不同的配件。将所有的零件组装在一起就可以形成一辆汽车,并且当某一个零件坏掉的时候还可以进行配装。

在面向对象中实际上还有许多特点,归结起来有如下三类

封装性:内部操作对外部不可见;

继承性:在上一辈的基础上继续发展;

多态性:这是一个最为重要的环节,利用多态性才可以得到良好设计。

面向对象开发的时候也有三个阶段:OOA(面向对象分析)、 OOD(面向对象设计)、OOP(面向对象编程)。 

所有的程序的开发原则都离不开实际生活。如果从程序的开发角度来讲,面向对象给我们最大的特征:可以进行生活的抽象。

类于对象的定义

类于对象是整个面向对象设计的核心所在,也是所有概念基础。类本身属于引用数据类型所以类的使用过上前牵引到内存的分配问题.

认识类与对象
(现在可以听懂别人说话,是因为我们具备共同的特征:都是中国人,母语都是汉语。)
那么具备这些共同特征的人有很多,那么就自然是一个群体,而群体的特征就是整个类的定义概念。所谓的类描述的就是共性特征。
任何时候只是依靠共性的特征是无法进行精准描述的,那么就需要一些个性化的特点。就可以描述一个个独立的事物。
所以这样就可以推断出:所谓的类指的就是一个共性的概念,而对象指的是一个具体的可以使用的事物。
那么很明显在实际的开发工程中一定要首先产生类,然后才可以产生对象。 那么对象的所有操作的行为都一定在类中进行了完整定义。类中没有定义的功能,那么对象一定是无法使用。
类中的组成:方法(method)(操作的行为)、属性(变量,描述每一个对象的具体特点)
类于对象的基本使用
     类于对象定义及使用

如果在程序之中要进行类的定义可以使用class关键字完成,而定义的语法如下:

 class 类名称{//所有的程序都要求以“{}”作为分界符

属性 ;

属性 ;

方法(){}//此时的方法不再由主类直接调用,而是要通过对象进行调用。

}

eg:定义类



class Person{


//定义一个类,类名称每个单词首字母要求大写

String name ; 

//表示人的姓名

int age ; 

//表示年龄

public void information(){

system.out.println( "name = "+name+"、age = "+age);

}

}

再这个类中定义了两个属性和一个方法,特别要主义的是类中可以定义的属性数量及方法数量是没有限制的。而且再编写的时候,每一个方法中的代码尽量不要特别长。

类定义完成之后是不能直接去使用的,如果要想使用类,那么必须产生对象,而对象的定义分为以下两种语法形式:

1.声明并实例化对象: 类名称 对象名称 =new 类名称();

2.分布进行对象实例化

       声明对象: 类名称 对象名称 = null;

       实例化对象:对象名称= new 类名称();

引用数据类型的最大特征在于内存的分配操作,而只要出现有关键字new那么只有一个解释:开辟内存  (内存是不可能无限开辟的,,所以这个时候所谓的性能调优调整的就是内存问题)。

所有的对象只有实例化之后才可以真正使用,而对象的使用都是围绕着类进行的,此时就有两种形式,那么此时就有两种形式:

调用类种的属性:对象.属性=内容;

调用类种的方法:对象.方法();

eg1.1:声明并实例化对象

public class Test{

public static void main(String args[]){

//类名称 对象名称=new 类名称();

Person  per=new Person();

//这个时候就表示实例化了一个per对象

per.name ="张三";

//设置对象中的属性

per.age=18;

//同上

per.information();

//调用类中的方法。

}

}

对象内存分析

   

 对象的产生分析:

如果要想进行对象的产生分析,那么首先就必须清楚引用类型。引用类型指的是内存空间的操作。而对于现在的内存主要会使用两块内存空间:

 堆内存空间:保存真正的数据,堆内存保存的是对象的属性信息;

 栈内存空间:保存的堆内存的地址,堆内存操作权,如果要想简化理解,可以理解为保存的是对象名称;

所以按照之前的程序,那么现在就可以给出如下的内存参考图



但是我们对于对象的产生实际上要知道一共会有两种格式,现在使用的是声明并实例化对象的格式,那么也可以分步的方式完成:

引用eg1.1

public class Test{

pubilc static void main(String args[]){

Person per =null;

//声明一个新的对象

per =new Per son();

//实例化对象

per.name="张三";//设置对象中的属性

per.age= 18;//设置对象中的属性

per.information(); //调用类中的方法;

}}

接下来给出此程序的堆栈内存分配过程图



但是千万要记住一点,对象(所有而的引用数据类型)必须再其开辟空间之后才可以使用

如果使用了未开辟内存空间的引用数据类型,则将出现NullPointerException

"NullPointerException" 是在整个的开发人生之中会一直陪伴到最后的一个异常。

只有引用数据类型(数组,类,接口)才会产生此类异常。

以后出现了就根据错误的位置观察该对象是否实例化



  引用传递初次分析

所有初学者最难的部分就是引用传递的分析。以后的开发之中都是引用传递。

引用传递的本质就在于别名,而这个别名只不过是放在了栈内存之中,

即:一块堆内存可以被多个栈内存所指向。

范例:观察引用传递

引用eg1.1

public class Test{

public static void main(String args[]){

Person per1= new Person();

per1.name="小于子";

per1.age= 30;

//此步骤就是引用传递的操作

Person per2= per1;

per2.name="狗剩";

per1.information();

}

}

此时需要通过内存关系图来进行程序的执行观察



范例:观察引用传递 

引用eg1.1

public class Test{
public static void main(String args[]){
Person per1= new Person();
Person per2= new Person():
per1.name="小于子";
per1.age= 30;
per2.name="张三";
per2.age=20;
//此步骤就是引用传递的操作
per2= per1;
per2.name="狗剩";
per1.information();
}
管擦此时的内存分析图:
先提下per2= per1; 我们知道栈内存保存的是一个数值 同一个栈内存只能保存一个内容 

此时把per1的内容给了per2,

per2本身就有内容所以它必须先断开当前指向后,然后指向与per1相同的堆内存地址

那么原先的per2断开的堆内容就成了垃圾内存图:

然后上图:



在程序开发过程之中,所谓的垃圾空间指的就是没有任何栈内存指向的堆内存空间,所有的垃圾空间将不定期被java中的垃圾收集器(GC、garbage Collector)进行回收以实现内存空间的释放,不过从实际开发来讲,虽然java提供有gc,但是gc也会造成程序性能的下降,所以开发过程之中一定要控制好对象的产生数量,即:无用的对象尽可能少产生。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐