对象的定义及使用
- 有了类,想要使用类,需要通过对象来调用,如果要产生对象,必须要实例化出一个对象,在对象中调用类(即调用对象的属性、方法)
产生对象必须使用如下语法格式来完成:
- 获取实例化对象两种方法:
- 声明并实例化对象:类名称 对象名称 = new 类名称();
- 分步骤完成:
(1)声明对象:类名称 对象名称 = null;(建议给初始值)
(2)实例化对象:对象名称 = new 类名称();
- 当获取了实例化对象之后,需要通过对象进行类中的操作调用,两种调用方式:
- 调用类中的属性:实例化对象.成员属性;
- 调用类中的方法:实例化对象.方法名称();
Com1.setBrand(“Hasee”,7499.00); //调用Com1对象的setBrand方法 - 如果对象属性内容并未设置初始值,则默认对象的属性、方法的内容的默认值。
两块最为常用的内存空间:
1.堆内存:保存的对象的具体信息,在程序之中,堆内存空间开辟是通过关键字“new”完成的。
- 开辟空间内存的最高级别
- 堆内存都有其对应的物理地址
2.栈内存:保存的是一块堆内存的地址,即:通过栈内存地址找到堆内存地址,然后得到对象的信息。
- 声明并实例化对象:只能保存一个堆内存的地址数据,如果发生更改,则之前的地址数据将从此栈内存中彻底消失。
- 注意:所有的对象在调用类中的属性和方法的时候必须要实例化完成
package Hello;
public class Hello{
public static void main(String[] args) {
//
PC Com1 = new PC(); //声明并实例化Com1对象
/*
* PC:实例化的对象属于类
* Com1:实例化的对象名称,实际上是一个物理地址(栈内存)
* new:为Com1这个对象开辟一个属性存储空间(堆内存空间)
* PC():定义堆内存的内容的空构造方法,有才是完整格式。开辟了一个该类的对象Com1并将com1中的属性、方法都设置为默认值。
*/
Com1.setBrand("Hasee",7499.00); //调用Com1对象的setBrand方法
System.out.println("品牌:" + Com1.getBrand() + "\n价格:" + Com1.getPrice());
}
}
class PC{ //创建电脑PC类
private String Brand; //定义这个类的一个属性
private Double Price; //两个属性都以private方式封装
public void setBrand(String Brand,Double Price){ //set方法设置private封装的属性的内容
this.Brand = Brand;
this.Price = Price;
}
public String getBrand() {
return this.Brand;
}
public Double getPrice() { //两个get方法是获取private封装的属性的内容
return this.Price;
}
}
内存的引用传递:
- 本质:同一块堆内存空间可以被不同的栈内存指向,也可以更换指向。
System.out.println("栈内存指向没有改变时");
Com1.Human = "李四";
Com2.Human = "张三";
System.out.println("一号购买者:" + Com1.Human + "\n二号购买者:" + Com2.Human);
System.out.println("栈内存指向改变时");
Com1.Human = Com2.Human; //将一号购买者名字记录指向二号购买者
System.out.println("一号购买者:" + Com1.Human + "\n二号购买者:" + Com2.Human);
System.out.println("品牌:" + Com1.getBrand() + "\n价格:" + Com1.getPrice());
引用与垃圾产生分析:
- 垃圾:没有任何栈内存指向的堆内存叫垃圾(或者说本来指向某一堆内存的栈内存换指向),就是没有地址了(或是说指向他的地址改变),只有内容还存在。这就叫~。垃圾将被GC(Garbage Collector,垃圾收集器),不定期进行回收,并且释放无用内存空间,但是如果垃圾过多,一定将影响到GC的处理性能,从而降低整体的程序性能,所以在实际开发中,尽量少产生垃圾,越少越好。
被JVM视为“垃圾”的情况:
- 对象(及其属性、方法中的局部变量)引用超过其范围。
{
Example e = new Example();
}
范围外 - 将对象赋值为null
{
Example e = new Example();
e = null;
} - 无指向的堆内存
说明:
1.GC只回收那些有new操作符创建的对象。某些不是通过new操作符再内存中获取存储空间的,无法被GC识别。所以在Java中,有方法:finalize(),这是Object类的方法,被声明为protected,用户可在自己的类中定义这个方法。如果类中定义的有该方法,那么垃圾回收时会首先调用一次该方法,在下一次垃圾回收动作发生时,才会真正回收被对象占用的内存。
2.垃圾回收或这个方法不一定会发生。如果java虚拟机内存耗尽,他将不会执行垃圾回收处理。
3.由于垃圾回收不受人为控制,具体时间也不确定,所以finalize()方法也就无法执行。Java提供了System.gc()方法来强制启动垃圾回收器。就像打电话给120来救病人一样。
补充上次笔记
面向对象与面向过程区别:
-
拿篮球场的例子来说,面向过程是步骤化的
篮球场上,告诉某一个队员,什么时候,站在什么位置,要拿着球或是抢断球,同时运球(需要描述怎样运球),然后怎样跑去跑过去,怎样去投篮等。但现实肯定不会这样/*简单想象篮球场为一个4*4的二维数组 *int p = 1; //假设队员为1 *球员从[0][0]的位置到[3][3]的位置为投篮成功 *这是一场加塞==假赛,位置都固定了 *a[3][3] *1 0 3 0 //0 2为过防 3为传球 *0 3 2 0 //1 *0 2 3 0 //2 *2 2 0 0 //3 *当球员从00位置依次向01 02 03 10 ... 33位置,因为知道对应位置会发生什么事, *按照设置好的程序做就好 */
-
面向对象,模块化
将球员在球场上碰到了何种情况,做出什么应对。
将各种会碰到的情况抽象出来,比如:队员,设置传球这一方法,当在不确定的球场中遇到了3情况就可以使用传球这一方法
封装
- private 对类的外部不可见,对内部可见
设置或取得属性:setter、getter ——> setXxx()、getXxx()- 设置(修改 )属性的方法:public void setName() ;
- 获取属性的方法:public String getName() ;
类中所有属性都得用private封装(绝大部分),并且属性如果要进行访问,必须提供getXxx\setXxx方法。