类与对象是整个面向对象设计的核心所在,也是所有概念的基础。类本身属于引用数据类型,所以类的使用上会牵扯到内存分配问题。
目录
1.认识类与对象
现在大家可以听懂本人说话,我们具备共同特征:我们都是中国人,母语都是汉语。那么具备这些特征的人很多,那么就自然是一个群体,而群体的特征就是整个类的定义概念。所谓的类描述的就是共性特征。
任何时候只是依靠共性的特征是无法进行精准描述的,那么就需要一些个性化的特点。就可以描述一个个独立的事物。所以这样就可以推断出:所谓类指的就是一个共性的概念,而我们的对象指的是一个具体的可以使用的事物。
那么很明显在实际的开发过程中,一定需要首先产生类才可以产生对象。那么对象的所有操作的行为都一定在类中进行了完整定义。类中没有定义的功能,那么对象一定是无法使用。
类中的组成:方法(操作的行为),属性(变量,描述每一个对象的具体特点)
1.1类的概念
类是一个模板,一个蓝本,或者说是合约,用来描述对象的行为和状态。
1.2对象的概念
对象是类的一个实例,有状态与行为。
一个对象的状态(或特征,属性)是由具有当前值的数据域来表示。
一个对象的行为(动作)是由方法来定义的。调用对象的一个方法就是要求对象完成一个动作。
2.类与对象的定义与使用
2.1类的定义
类必须先定义才能使用。类是创建对象的模板,创建对象也叫 类的实例化 。
如果程序之中要进行 类的定义 可以使用 class 关键字完成,而我们定义的语法如下:
//所有的程序都以{}为分界符
class 类名称{
属性;
属性;
方法(){}
}
此时的方法不再由主类直接调用,而是要通过对象进行调用。
范例:定义类
定义一个类,类名称每个单词首字母要求大写 Person 类
class Person{
String name;
int age;
public void info(){
System.out.println(“name=”+name+",age="+age);
}
}
在这个类中只定义了两个属性和一个方法,特别需要注意的是,类中可以定义的属性数量以及方法数量是没有限制的,而且在编写的时候,每一个方法的代码尽量不要特别长。
2.2对象的定义(创建对象)
对象是类的一个实例,创建对象的过程也叫类的实例化。对象是以类为模板来创建的。
类定义完成之后是不能直接去使用的,如果要想使用类那么必须产生对象,
而 对象的定义 分为以下两种语法形式:
- 声明并实例化对象:
类名称 对象名称 = new 类名称();
- 分布进行对象实例化:
2.1声明对象:
类名称 对象名称 = null;
2.2 实例化对象:
对象名称 = new 类名称();
2.3对象的使用(访问类的成员变量和方法)
引用数据类型的最大特征在于 内存的分配操作 ,而只要出现有关键字new 那么就只有一个解释: 开辟新内存(内存是不可能无限开辟,所以这时候所谓的性能调优调整的就是内存问题)
所有的对象只有实例化之后才可以真正使用,而对象的使用都是围绕的类进行的,那么此时就有两种形式:
- 调用类中的属性:
对象.属性 = 内容;- 调用类中的方法:
对象.方法();
范例: 声明并实例化对象
public class Test{
public static void main(String[] args){
Person person = new Person(); 这段表示实例化对象
person.name = "张三"; 设置对象中的属性
person.age = 18;
person.info(); 调用对象中的方法
}
}
3.对象的内存分析
如果要进行对象的产生分析,那么首先必须要清楚 引用类型。引用类型指的是内存空间的操作。而对于现在的内存主要会使用两块内存空间:
- 堆内存空间:保存真正的数据,堆内存保存的是对象的属性信息;
- 栈内存空间:保存的堆内存的i地址,堆内存操作权,如果要想简化理解,可以理解为保存的是对象名称;
所以按照之前的程序,那么现在就可以给出如下的内存参考图:
class Person{
String name;
int age;
public void info(){
System.out.println("name="+name+",age="+age);
}
}
public class Test{
public static void main(String[] args){
Person per = new Person();
per.name = "张三";
per.age = 18;
per.info();
}
}
但是对于对象的产生实际要知道一共会有两种格式,现在使用的是 声明并实例化对象的格式,那么也可以 分布的方式完成。
public class Test{
public static void main(String[] args){
Person per = null; 声明一个对象
per = new Person(); 实例化对象
per.name = "张三"; 设置对象中的属性
per.age = 18;
per.info(); 调用类中的方法
}
}
内存图:
但是千万要记住一点,对象(所有的引用数据类型)必须在其开辟空间之后才可以使用,如果使用了未开辟的内存空间的引用数据类型,则将出现" NullPointerException:"
这个时候只声明了对象而并没有为其开辟堆内存空间,而本程序在编译的时候不会产生任何的语法错误,但是在执行的时候会出现如下的错误提示:
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:11)
“NullPointerException:” 只有引用数据类型才会产生此类异常,以后出现了就根据错误的位置观察对象是否实例化。
4.引用传递初次分析
所有初学者最难的部分就是引用传递分析,以后的开发中都是引用传递。
引用的本质 就在于别名,而这个别名只不过是放在了栈内存之中,即:一块堆内存可以被多个栈内存所指向。
范例:观察引用传递。
代码 1:
public class Test{
public static void main(String[] args){
Person per1 = new Person();
per1.name = "小于子";
per1.age = 30;
}
}
代码 改:
public class Test{
public static void main(String[] args){
Person per1 = new Person();
per1.name = "小于子";
per1.age = 30;
此步骤就是引用传递操作
Person per2 = per1;
per2.name="狗剩";
per2.info();
}
}
此时需要通过内存关系图来进行程序的执行观察。
范例2: 观察引用传递。
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="狗剩";
per2.info();
}
}
观察此时的内存分析图:
在程序开发过程之中,所谓的 垃圾空间 指的就是没有任何栈内存指向的堆内存空间,所有的垃圾空间将会不定期被 垃圾收集器 (GC ,Garbage Collector),进行回收以实现内存空间的释放,不过从实际开发来讲,虽然Java提供有gc,但是gc也会造成程序性能的下降,
所以开发过程中一定要控制好你对象的产生数量,即无用的对象尽可能少产生。