重学java-4.面对对象基本概念

面对对象基本概念

  • 面对对象:高度实物抽象化。优点是易维护,易复用,易扩展。
  • 面对过程:自顶向下的编程。优点是性能高。

面对对象的三个特性

  • 封装:封装有两层含义:一层含义是把对象的属性和行为看成一个密不透风的整体,将这两者“封装”在一个不可分割的独立单位(即对象中);二是“信息隐蔽”,可为封装在一个整体的变量和方法规定不同级别的“可见性”或访问权限。
  • 继承:可以在已有类的基础上,扩展新的功能。增强了代码的可复用性。注意类的特点是单继承,多实现,而接口可以多继承
  • 多态:子类对象可以和父类对象进行相互转换。

堆内存与栈内存的区别

  • 堆内存(heap):堆内存需要用关键字new才可以开辟,如果一个对象没有对应的堆内存指向,将无法使用。
  • 栈内存(stack):栈内存主要存放的是基本类型数据和对象的句柄

句柄(handle):操作对象的标识符。可以理解为c++的引用或者指针。
例如:Book book = new Book();中的book就是一个句柄。

我们知道java的==对于引用数据类型,比较的是它们的地址,而基本数据类型则直接比较的是值。根据这个特性我们做一些小例子,加深对栈和内存区别的理解。

public static void main(String[] args) {
	String a = "123";//先在栈中存放a,再在栈中寻找"123",若找不到,则将"123"存入栈中,a指向"123"。
	String b = "123";//先在栈中存放b,再在栈中寻找"123",若找到,则将b指向"123"。
	String c = new String("123");//先在栈中存放c,在堆中申请内存,存放"123",并将c指向"123"。
	
	//a与b指向的都是栈中的"123"。
	if(a == b) {
		System.out.println("a==b");
	} else {
		System.out.println("a!=b");
	}
	
	//a指向栈中的"123",c指向堆中的"123"。
	if(a == c) {
		System.out.println("a==c");
	} else {
		System.out.println("a!=c");
	}
}

运行结果:
在这里插入图片描述
如果两个String都在堆中呢?

public static void main(String[] args) {
		String a = new String("123");//先在栈中存放a,在堆中申请内存,存放"123",并将a指向"123"。
		String b = new String("123");//先在栈中存放b,在堆中申请内存,存放"123",并将b指向"123"。
		
		if(a == b) {
			System.out.println("a==b");
		} else {
			System.out.println("a!=b");
		}
	}

运行结果:
在这里插入图片描述
是的,显然不一样,因为我们申请了两次内存,两次内存的地址不同,于是a!=b。这个时候,我们可能会想了,直接把a赋值给b,会怎么样?让我们试试。

public static void main(String[] args) {
		String a = new String("123");//先在栈中存放a,在堆中申请内存,存放"123",并将a指向"123"。
		String b = new String("123");//先在栈中存放b,在堆中申请内存,存放"123",并将b指向"123"。
		
		b = a;//使b指向a所指向的地址
		
		if(a == b) {
			System.out.println("a==b");
		} else {
			System.out.println("a!=b");
		}
	}

运行结果:
在这里插入图片描述
a==b,说明a与b所指向的地址相同了。
在java中,我们把上述b=a的操作成为引用传递,即一块空间可以被多个栈内存共同指向。而b原来的所指向的内存,因为没有任何句柄指向它,最终这块内存会被垃圾收集器(GC,garbage Collector)回收。

匿名对象

上面我们提到,没有栈内存指向的堆内存,最终都会被gc回收。从而我们可以引出匿名对象的概念。匿名对象就是一个没有栈内存指向堆内存。举个简单的例子。

public class test1 {
	public static void main(String[] args) {
		new Book("野草").say();
	}
	
}

class Book {
	private String name;

	public Book(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	public void say() {
		System.out.println("我不过一个影,要别你而沉没在黑暗里了。然而黑暗又会吞并我,然而光明又会使我消失。");
	}
}

运行结果:
在这里插入图片描述

由于匿名对象没有句柄,所以我们只能在把它new出来的那一刻使用它,使用一次后就将被GC回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值