类与对象简介/定义/认识/基本使用/对象内存分析
面向对象是一种程序设计方法,但并不表示所有的开发者都认同面向对象。因为有很多的开发者认为面向对象过于复杂,所以更多的人愿意使用函数式编程。
面向对象的前身属于面向过程,如果要想笼统的去解释这两种开发模型的区别,最好的例子:
面向过程是解决问题,面向对象是模块化的设计。对于现在的程序开发更多情况下就像是汽车组装一样,不同的工厂生产不同的配件。将所有的零件组装在一起就可以形成一辆汽车,并且当某一个零件坏掉的时候还可以进行配装。
在面向对象中实际上还有许多特点,归结起来有如下三类面向对象开发的时候也有三个阶段: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也会造成程序性能的下降,所以开发过程之中一定要控制好对象的产生数量,即:无用的对象尽可能少产生。