javaSE之面向对象编程->类与对象(上)——1 and 2

一、面向对象编程的简介
在C语言的学习中我们所有的程序风格都是面向过程的,也就是比如两个数相加这个程序段需要多次执行那么我们在C语言中只能通过代码的赋值粘贴才可以办到,但是我们在面向过程编程里面也有这样类似的思想,就是函数。在java中我们采用面向对象的方法,就是可以将代码的可重用性提高。
1.面向对象的三大特征:
(1)封装性:封装分为两个步骤。首先是抽象,所谓抽象就是对现实生活中一个比较大的概念抽象为比较具体的一个描述;比如说人类,它就属于一个抽象的类。当把类抽象出来了以后就进行封装,将这个类的一些属性和行为进行封装,封装以后将这些属性和方法可以只让一些可信的类进行访问操作,这样就提高了安全性。
(2)继承性:继承和我们人类也很相似,你和你的父母之间就有继承的关系,这样的关系使得你一出生就拥有了你自己特有的属性和方法。 对于java中的语言也是一样的,每一个类之间也可以通过继承,获得当前类的所有属性,不需要重新来编写一次这样的代码。
(3)多态性:一个类它有多个属性和行为,但是这些属性和行为需要实现那么就得通过创建这个类对应的对象来实现。一个类可以同时创建很多个对象分别是实现不同的行为和属性,所以这也也就体现了多态性。
2.名词扩展
OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象编程
面向对象最大的特征:可以进行生活的抽象
二.类与对象的定义与使用
1.类与对象的定义:首先我们来讨论讨论什么是类与对象。举个例子,用人类和人来解释类与对象;我们每个人不叫人类,但是我们属于人类,人类是一个比较抽象的概念,说人类你的脑海里面没有什么具体的描述,但是如果说某个具体的人你肯定知道他的体态特征,人就是人类的一个具体,而人类就是人的一个抽象。生活中还有许多这样的例子,比如电脑和hp笔记本电脑、女朋友和对象等等。这些例子都告诉我们对象是类的具体,类是对象的抽象。首先产生的是类(类是生产对象的蓝图),然后才可以产生对象,对象所有的行为,一定在类中进行了完整定义。
2.类的组成
方法(操作的行为)
属性(变量,描述每个对象的具体特点)
3.类与对象的定义与使用
定义一个类 :
class 类名{
属性1;
属性2;
……
方法1(){
}
方法2(){
}
……
}
例子(创建一个人类):

//属性
public class Person{
private String name;
private int age;
private String gender;
//方法
String personInfo(){
return "这个人是"+name+"年龄为"+age+"性别是"+gender;
}
//构造方法,创建对象
public Person(String name,int age,String gender){
this.name=name;
this.age=age;
this.gender=gender;
}
}

有了类我们就可以产生对象了,如下:
类名 对象名 = new 类名();

Person person 1= new Person();//创建一个对象
Person person2 = new Person("Alice",18,"女");//又创建了一个对象

通过对象调用实例变量与实例方法:

Person person2 = new Person("Alice",18,"女");
System.out.print(person2.personInfo);
System.out.println(person.name);

注意:只要出现了关键字new就是创建了对象(即开辟了空间);在java中,所谓的性能评优,调整的就是内存问题。
4.对象内存
在C语言中我们的内存分配一共有很多个层次:
从最底层的代码区——》未初始化全局变量区——》已初始化全局变量区——》堆区——》共享区——》栈区;但是在java中我们的内存区域大体首先分为栈内存和堆内存里两个区域。
在这里插入图片描述
接下来通过代码和内存之间的关联来解释内存。
(1)创建一个对象时栈内存与堆内存的关系
代码:

class Person2{
	String name;
	int age;
}
 public class Test{
	 public static void main(String[] args){
		 //创建对象1
	1-》	 Person2 per1 = new Person2();
	2-》	 per1.name="张三";
	3-》	 per1.age=14;
	 }
 }

执行完1以后:
在这里插入图片描述
在栈中开辟了空间放per1名字(即是per1堆内存的地址),在堆中也开辟了相应的空间,堆中开辟的空间放的是Person对象的name、age属性,并且此时都为各自类型的默认值。
接着执行2、3语句:
在这里插入图片描述
执行2、3语句后,就堆中的属性进行赋值,将默认值覆盖掉,变为现在的值。
注意:int age,String name都是对象的属性,虽然是基本数据类型修饰的,但是属于引用类型,所以他们放在堆内存中。
(2)创建两个对象

class Person2{
	String name;
	int age;
}
 public class Test{
	 public static void main(String[] args){
		 //创建对象1
	1-》	 Person2 per1 = new Person2();
	2-》	 per1.name="张三";
	3-》	 per1.age=14;
		 //创建对象2
	4-》 Person2 per2 = new Person2();
	5-》 per1.name="李四";
	6-》 per1.age=15;
	 }
 }

执行完1、2、3
在这里插入图片描述
创建完第一个对象以后在堆内存开辟了自己的相应空间。
执行完4、5、6
在这里插入图片描述
创建完第二个对象以后在堆内存开辟了自己的相应空间。
(3)看起来像创建了两个对象,实际上只创建了一个对象

class Person2{
	String name;
	int age;
}
 public class Test{
	 public static void main(String[] args){
		 //创建对象1
		1-》 Person2 per1 = new Person2();
		 2-》per1.name="张三";
		 3-》per1.age=14;
		 4-》Person2 per2 = per1;
	 }
 }

执行完1、2、3
在这里插入图片描述
new->开辟了一个空间
执行完4
在这里插入图片描述
虽然是在栈内存里有per2,但是我们是将per1指向堆内存的地址赋值给了per2;所以实质上只创建了一个对象,只是有栈里面有两个变量指向它。
当我们执行per1=null,那么它将不再指向相应的堆内存,但此时还有一个对象指向这个堆内存,所以不会被垃圾回收站回收。
注意:
(1)创建一个对象一定是相应的在堆上开辟一个空间。
(2)区分一下两种创建对象的方法:
1->Person person;
2->Person person=null;
1->表示声明对象,编译的时候不能通过;
2->表示声明对象并且给对象初始化,它不是指向堆中的某个指定的空间,它是指向null,它的编译可以通过。
(3)对象(引用数据类型)必须在实例化以后调用,否则会产生NullPointerException(运行时出错),编译可以通过。–》即表示引用变量是否初始化。
(4)所有垃圾空间会不定期的被垃圾回收站(GC),回收,但GC会影响性能,所以在开发之中,尽量减少自己的无用对象。

猜你喜欢

转载自blog.csdn.net/ZhuiZhuDream5/article/details/83831961