对象的定义与使用

对象的定义及使用

  • 有了类,想要使用类,需要通过对象来调用,如果要产生对象,必须要实例化出一个对象,在对象中调用类(即调用对象的属性、方法)

产生对象必须使用如下语法格式来完成:

  1. 获取实例化对象两种方法:
  • 声明并实例化对象类名称 对象名称 = new 类名称();
  • 分步骤完成:
    (1)声明对象类名称 对象名称 = null;(建议给初始值)
    (2)实例化对象对象名称 = new 类名称();
  1. 当获取了实例化对象之后,需要通过对象进行类中的操作调用,两种调用方式:
  • 调用类中的属性:实例化对象.成员属性;
  • 调用类中的方法:实例化对象.方法名称();
    Com1.setBrand(“Hasee”,7499.00); //调用Com1对象的setBrand方法
  • 如果对象属性内容并未设置初始值,则默认对象的属性、方法的内容的默认值。

两块最为常用的内存空间:

1.堆内存:保存的对象的具体信息,在程序之中,堆内存空间开辟是通过关键字“new”完成的。

  1. 开辟空间内存的最高级别
  2. 堆内存都有其对应的物理地址

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());

对象的定义与使用_第1张图片

引用与垃圾产生分析:

  • 垃圾:没有任何栈内存指向的堆内存叫垃圾(或者说本来指向某一堆内存的栈内存换指向),就是没有地址了(或是说指向他的地址改变),只有内容还存在。这就叫~。垃圾将被GC(Garbage Collector,垃圾收集器),不定期进行回收,并且释放无用内存空间,但是如果垃圾过多,一定将影响到GC的处理性能,从而降低整体的程序性能,所以在实际开发中,尽量少产生垃圾,越少越好。

被JVM视为“垃圾”的情况:

  1. 对象(及其属性、方法中的局部变量)引用超过其范围。
    {
    Example e = new Example();
    }
    范围外
  2. 将对象赋值为null
    {
    Example e = new Example();
    e = null;
    }
  3. 无指向的堆内存

说明:

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()
    1. 设置(修改 )属性的方法:public void setName() ;
    2. 获取属性的方法:public String getName() ;
      类中所有属性都得用private封装(绝大部分),并且属性如果要进行访问,必须提供getXxx\setXxx方法。

你可能感兴趣的:(java)