第四课:面向对象(基础)
1、面向对象概念
面向对象是一个比较先进的设计思路,在这之前有一种开发设计,称为面向过程,两者之间的区别为:
面向过程:专注于解决问题
面向对象:经过完整的分析、设计之后才可以进行开发
面向对象的程序开发实际上分为三种:OOA、OOD、OOP
OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象程序
2、面向对象的三大特征
封装性:对外部不可见,保护类中的操作不被外部直接访问
继承性:扩展类的功能。
多态性:方法的重载,不同的方法名称根据传入的参数类型或个数不同调用的方法也不同。多态是在整个Java中最重要的概念,而且一个好的面向对象设计中肯定要大量的使用多态性
3、类与对象
类和对象是面向对象中两个最重要的概念:
类:表示一个共性的产物,是对某一类实物的描述,是抽象的、概念上的定义。
对象:就是一个个性的体现,是实际存在的该类实物的每个个体,因而也称为实例(instasnce)。
实际上,类就相当于是一个对象的操作图纸,按照此图纸生产出来的对象,才可以被用户所使用:
没有类则肯定没有对象的产生
没有对象的产生类不能使用
对象的所有活动范围在类中已经完整的定义出来了
4、类与对象的定义
(1)、类要使用class来进行定义,类由属性和方法组成,类的定义格式为:
class 类名称{
数据类型 属性 ; //声明成员变量(属性)
public 返回值的数据类型 方法名称 ( 参数1, 参数2...) { //定义方法的内容
程序语句 ;
[return表达式 ;]
}
};
属性跟标量一样,数据类型就是使用Java的两种数据类型:基本数据类型、引用数据类型。
但是,此时在方法的定义上与直接使用主方法调用的时候声明不一致的是,不再出现static关键字。
(2)、对象的创建及使用的两种方式:
类名 对象名称 = null ; //声明对象
对象名称 = new 类名() ; //实例化对象
或者:
类名 对象名称 = new 类名() ; //产生实例化对象
(3)、对象的操作分为两种情况:
访问属性:对象名称.属性名 = 值 ;
访问方法:对象名称.方法() ;
(4)、对象的产生
对象的产生步骤实际上是分为两步完成的:
声明对象:类名称 对象名称 = null ;
实例化对象:对象名称 = new 类名称() ;
如果对象在使用中只是声明的话,则无法使用,会出现下面的错误必须实例化之后才可以正确使用:
Exception in thread "main" java.lang.NullPointerException
出现上面错误的原因:是由于对象未被实例化,所以出现的空指向异常,此异常在开发中会经常出现。
实际上对于对象的产生,也是与数组一样,需要划分堆栈空间的:
对象实际上是保存在栈内存中的:Person per = null ;
实例化之后对象会开辟对应的堆内存空间:per = new Person() ;
在堆内存中实际上存放的是对象的各个属性,因为对象中只能依靠属性的不同来区分。
全部的方法保存在全局代码区中,这是一个其他的存储空间,这个方法被所有的对象所共同拥有。
声明几个对象,就会在栈内存中开辟几个空间来保存对象,然后分别实例化对象,也就是说,只要一出现关键字new就表好似要开辟新的内存空间。而且这些对象之间不会互相影响。
5、对象的引用传递
在对象的操作中实际上是存在引用传递的,所谓的引用传递,就是将一个堆内存空间的使用权交给了其他的对象,就相当于为一个堆内存空间起了一个别名。
class Person{ String name ; int age ; public void tell(){ System.out.println("姓名:" + name + ",年龄:" + age) ; } } public class SimpleDemo{ public static void main(String args[]){ Person per1 = null ; //声明对象per1 Person per2 = null ; //声明对象per2 per1 = new Person() ; //实例化对象per1 per2 = per1 ; //引用传递 per1.name = "张三" ; //为对象属性赋值 per1.age = 30 ; per2.age = 33 ; per1.tell() ; per2.tell() ; } }
一个栈内存只能引用一个堆内存空间,但是一个堆内存空间可以被多个栈内存同时指向。在Java中不用的内存空间成为垃圾空间,垃圾空间要等待垃圾收集机制进行空间释放,垃圾收集机制成为GC。
【2011-12-27】