1、java类体组成。
Java类的组成主要有3部分:数据成员、构造方法、方法成员。
⑴数据成员:数据成员是类的属性,声明该类的对象所具备的属性。声明数据成员往往需要声明以 下几项:
①权限修饰符(Java中权限修饰符有4种,在以后文章中会介绍):本例中使用的是私 有权限private。在大多数情况下,都建议数据成员使用私有权限。②数据类型:数据成员必须指明其数据类型,本类中使用的类型有String和Integer。 Java中的数据类型分两种,基本类型和引用类型。(在以后文章中会详细介绍)。
③数据成员标志符:即数据成员的名字。名字要遵守Java的命名规范,最好采用名词 性质的单词命名,可以由数字、字母、$、_组成,但是首字母不能是数字。
④初值:数据成员可以赋初值,也可不赋初值。如果不赋,则会有默认值(根据数据 类型不同而不同)。
⑵构造方法:构造方法是为了创建对象的,反过来亦成立,创建对象必须使用构造方法。
⑶方法成员:方法成员是该类对象所能进行的操作。往往需要声明一下几项。
①权限访问修饰符:与数据成员的修饰符概念相同,该类中的方法使用公有权限 public。
②返回值类型:方法成员必须指明返回值类型,如果该方法没有返回值,则使用void 。
③方法成员标志符:即方法的名字。规则与数据成员标志符相同。建议方法成员采用动词性质单词命名。
2、方法组成及与传统函数的区别。
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式为:
[修饰符] 返回值类型 方法名( 形式参数列表 )
{
//Java 语句;
}
形式参数:在方法被调用时用于接收外界输入的数据。
实参:调用方法时实际传给方法的数据。
返回值:方法在执行完毕后返回给调用它的环境的数据。
返回值类型:事先约定的返回值的数据类型,无返回值,必须给出返回类型viod。
Java语言中使用下述形式调用方法:对象名.方法名(实参列表)
实参的数目、数据类型和次序必须和所调用方法声明的形式列表匹配。
return语句中止方法的运行并指定要返回的数据。
以下是一些注意点:
⑴方法由传统函数发展而来。
⑵在结构化编程语言里,函数是一等公民,整个软件由一个个函数组成。在面向对象编程语言里,类才是一等公民,整个系统由一个个类组成。
⑶方法不能独立定义,方法只能在类体里定义。
⑷从逻辑意义上,方法要么属于该类本身,要么桑帅该类的一个对象。
⑸永远不能独立执行方法,执行方法必须使用类或对象作为调用者。
⑹java中方法的参数传递只有一种:值传递。即将实际参数的副本传入参数内。值的内容有可能是数据,也有可能是一个内存地址。
3、成员变量和局部变量区别。
成员变量:
①成员变量定义在类中,在整个类中都可以被访问。
②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
③成员变量有默认初始化值。
局部变量:
①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
②局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
③局部变量没有默认初始化值
在使用变量时需要遵循的原则为:就近原则。即首先在局部范围找,有就使用;接着在成员位置找。故而当局部变量与成员变量同名时会出现成员变量被隐藏的问题,如果此时在函数体内要使用成员变量,则可以通过“this.成员变量名”的方式使用。下面通过一个小demo展示。
public class Demo
{
private String str = "成员变量";
public static void main(String[] args){
Demo demo = new Demo();
demo.print();
}
public void print(){
String str = "局部变量";
System.out.println(str);
System.out.println(this.str);
}
}
4、UML图的四种关系(泛化,关联,依赖,实现)。
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)
1. 泛化(Generalization)
【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
【箭头指向】:带三角箭头的实线,箭头指向父类
2. 实现(Realization)
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现.
【箭头指向】:带三角箭头的虚线,箭头指向接口
3. 关联(Association)
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量
【箭头及指向】:带普通箭头的实心线,指向被拥有者
上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。
下图为自身关联:
4. 聚合(Aggregation)
【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体
5. 组合(Composition)
【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
【代码体现】:成员变量
【箭头及指向】:带实心菱形的实线,菱形指向整体
6. 依赖(Dependency)
【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者
各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
下面这张UML图,比较形象地展示了各种类图关系:
转自:http://blog.csdn.net/tianhai110/article/details/6339565
5、实例化对象过程。
每当执行Java编译器的时候,编译器会寻找指定的类,当它找到类时,首先需要初始化static变量,因为这些成员可以在没有实例的情况下运行,接着,再按照变量的声明顺序依次初始化类的成员,成员初始化完毕之后才为自己调用构造器,一切进行完毕之后,才可以调用方法。但主类比较特殊,主方法会在构造器之前,static变量初始化之后调用,这是由于Java的惰性初始化,在main方法被调用之前无法知道是否存在主类的实例。
一个类的运行,JVM做会以下几件事情:
⑴类装载
⑵链接
⑶初始化
⑷实例化
6、为什么构造器(即构造方法,以下一律写做“构造器”)不能用void修饰?
众所周知,构造器是一个特殊的方法,定义其的语法格式与定义方法的语法格式类似,所以回答这个问题之前,我们先来看看定义构造器的格式:
[修饰符] 构造器名(形参列表)
{
//构造器执行语句
}
这里提出定义构造器语法格式需要注意的五点:
1、修饰符可以省略,也可以是public、private、protected其中之一。
2、构造器的名字必须和类名相同。
3、形参列表和定义方法的形参列表格式相同,不同形参列表的构造器构成重载关系。
4、类代码里没有定义构造器时,系统会提供一个默认的无参构造器,若定义了,系统将不会提供默认构造器。
5、不能定义返回值类型,也不能用void修饰。
现在来解答为什么构造器不能用void修饰。事实上,如果为构造器定义了返回值类型,或者用void修饰声明构造器没有返回值,编译时不会出错,但是这时java会把这个构造器当作方法处理,失去了构造器的功能。所以java语法规定,构造器没有返回值类型并且不能用void修饰。那么构造器真的就没有返回值吗,关于这个问题,我采用两本比较权威的书给出的解答作为这个问题的答案。
构造器是一种特殊类型的方法,因为他没有返回值。这与返回值为空(void)明显不同。对于空返回值,尽管方法本身不会自动返回什么,但仍然可以选择让他返回别的东西,构造器则不会返回任何东西,你别无选择(new表达式确实返回了对新建对象的引用,但构造器本身并没有任何返回值)。假如构造器具有返回值,并且允许人们自行选择返回类型,那么势必得让编译器知道该如何处理此返回值。
———《Java编程思想》
实际上,类的构造器是有返回值的,当我们用new关键字来调用构造器时,构造器返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意:不能在构造器里显式使用return来返回当前类的对象,因为构造器的返回值是隐式的。
———《疯狂Java讲义》
两本书一开始的观点就出现分歧,但不难看出共通之处,new和构造器构成的表达式会返回当前类的实例,而构造器自己则不会有显式返回值。