标签:
面向对象的基本思想是,从现实世界中客观存在的事物发出来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。
面向对象更加强调运用人类在日常的思维逻辑中经常采用的方法与原则,如抽象,分类,集成,聚合,多态等
对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性
类是用于描述同一类型的对象的一个抽象的概念,类中定义了这一类对象所具有的静态和动态属性
类可以堪称一类对象的模版,对象可以看成该类的一个具体实例
一个类中可能会从多个类中继承,所以C++存在多重继承但是对于不同变量中重名函数的处理比较麻烦
例如:
游泳云动员是运动员(一般和特殊)
足球运动员是球类运动员,也是运动员的一类,这种关系就叫继承关系
例如:
队长是球队的一部分,队员也是球队的一部分(聚集)
头身体四肢构成了人,是一种密不可分的关系(组合)
对象是java程序的核心,在java程序中“万事万物皆对象”
对象可以堪称是静态属性(成员变量)和动态属性(方法)的封装体
类是用来创建同一类型的对象的“模版”,在一个类中定义了该类对象所应具有的成员变量以及方法
一组对象互相配合通过沟通完成特定功能就是对象的引用
java语言中除级别很类型之外的变量类型都称之为引用类型
java中的需i爱那个是通过引用对其操作的,例如:
先看一个例子:
[<modifiers>] <modifiers> <return_type> <name> ([<argu_list>]){
[<statements>]
}
成员变量:
java语言中的成员变量可以使用任意一种数据类型(包括基本数据类型和引用类型)
在定义成员变量时可以对其进行初始化,如果不对其进行初始化,java使用默认的值对其初始化(上面例子中的id为默认初始化,age为自定义初始化,默认的数值类型初始化都为0,boolean是faulse,引用类型是null)
成员变量的作用范围为整个类体
如何在内存中区分类和对象:
类是静态的概念,存放在代码区
对象是new出来的,位于对内存,类的每个成员变量在不同的对象中都由不同的值(除了静态变量)而方法只有一份,执行的时候才占用内存
对象的创建和使用:
必需使用new关键字创建对象
使用对象(引用). 成员变量来引用对象的成员变量
使用对象(引用). 方法(参数列表)来调用对象的方法
同一类的每个对象有不同的成员变量存储空间
同一类的每个对象共享该类的方法
类个对象的关系:
构造函数也就是构造方法:
使用new+构造方法创建一个新的对象
构造函数是定义在java类中的一个用来初始化对象的函数
构造函数与类同名且没有返回值
例如:
注意:
当没有指定构造函数时,编译器为类自动添加形如: 类名 ( ) { }的构造函数,例如:
当已经指定过构造函数的时候,编译器不再为该类自动添加构造函数,如上面例子中的person函数,如果在主方法中再输入代码 “persion Jian = new Jian();”
方法的重载是指一个类中可以定义有相同的名子,但参数不同的多个方法。调用时。会根据不同的参数表选择对应的方法。
例如:
public class test1 { public static void main (String args[]) { test1 p = new test1(); p.info(); p.info("Hello"); } void info() { System.out.println("Method1"); } void info(String t) { System.out.println("Method2"); } }
同样的,构造方法也可以重载,规则与方法重载相同
首先先定义这样一个类,方便后面举例分析:
class BirthDate { private int day; private int month; private int year; public BirthDate(int d,int m,int y) { day = d; month = m; year = y; } public void setDay(int d) { day = d; } public void setMonth(int m) { month = m; } public int getDay() { return day; } public int getMonth() { return month; } public void display() { System.out.println(day + "-" + month + "-" + year); } }
接下来就是例子代码了:
public class test1 { public static void main (String [] args){ test1 test = new test1(); int date = 9; BirthDate d1 = new BirthDate(7, 7, 1970); BirthDate d2 = new BirthDate(1, 1, 2000); test.Change1(date); test.Change2(d1); test.Change3(d2);
System.out.println(date);
d1.display();
d2.display(); } public void Change1(int i) { i = 1234; } public void Change2(BirthDate b) { b = new BirthDate(22, 2, 2004); } public void Change3(BirthDate b) { b.setDay(22); } }
程序运行结果:
1)当调用change1方法的时候应该在栈内存分配一个名为i的空间,值为调用方法过程中传入的参数,例子中相当于是把9赋值给i,然后方法开始执行,当执行完i=1234后,i变成了1234,date的值没变,因为刚刚是相当于date的值复制给了i,方法执行完毕后,为这个方法执行分配的所有的局部变量的内存空间全部消失,所以当执行完change1方法后date的值依然是9,i的值却消失了
2)接下来看change2的参数b是一个局部变量,传入的是d1的内容,于是栈内存空间分配出一块空间,当执行方法之前,b和d1的值指向同一地址的对象,方法开始执行,b=new一个新的BirthDate出来,方法执行完毕后,局部变量b消失,栈内存也随之消失,堆内存不会马上消失,是由java的垃圾回收机制自动回收的。此时d1的值还是原先的值,没有变化。
3)同理,方法调用前在栈内存空间分配了一块区域,名为b,值为传入的参数,当方法开始后,对象b调用了BirthDate类里面的setDay方法,于是d1的值就被改变了,方法执行完毕后b的栈内存空间消失
方法调用执行前的内存:
方法调用后的内存:
只有在引用的方法中有引用的时候才能改变堆内存的值,也就是最终改变那个值
标签:
原文地址:http://www.cnblogs.com/JianXu/p/5551646.html