------- android培训、java培训、期待与您交流! ----------
定义类:
面向对象的设计过程中有两个重要的概念:类和对象(也叫实例).其中类是某一批对象的抽象,可以把类理解成某种概念:对象才是一个具体存在的实体,从这个意义上讲我们通常所说的人,其实都是人的实例,而不是人类。
JAVA语言定义类的简单语法:
[修饰符] class 类名
{
零到多个构造器的定义
零到多个field
零到多个方法
}
在上面的语法中,修饰类的修饰符可以是:public abstract final,或者完全省略这三个修饰符其他的就是错误的!
定义field的语法格式: 修饰符 field类型 field名 = 默认值;
其中修饰符可以是:public protected private fianal static 等
field类型可以是JAVA语言中的任何数据类型,包括基本数据类型和引用数据类型
field名:从语法上来说,field名只要是合法的标识符即可,当时程序的可读性来说,应该是一个有意义的一个或多个单词所组成,第一个单词首字符小写,后面每个单词首字符大写,其他字符都小写,单词与单词之间不用任何分隔符。
默认值:既可以指定也可以不指定。
定义方法的语法格式是:
修饰符 方法的返回值类型 方法名(形参列表)
{
有一条或多条可执行语句组成
}
修饰符可以是:public protected private fianal static abstract
返回值类型允许Java的任何数据类型,包括基本数据类型和引用数据类型,如果声明了返回值类型,则方法体内必须要有一个return语句
方法名与field明媚规则基本相同,但通常建议方法名以英文中的动词开头
形参列表:用于定义该方法可以接受的参数,需要注意的是形参列表传递的是值得副本,而不是值得本身。
构造器的语法格式
修饰符 构造器名(形参列表)
{
由零条或者多条可执行型语句组成的构造器执行体
}
其中修饰符可以省略也可以是public protected private 中的一种
构造器名 必须和类名相同
形参列表和定义方法的形参列表完全相同。
需求:为了描述事物更准确,发现事物对应的很多对象一创建时,
就有了,一些初始化的数据。在类中该如何完成的。
通过Java中的另一个小技术完成:就是构造函数。对象本身就是构造出来,
构造时,需要做一些动作这些应该定义在函数内。
构造函数(Constructor)有什么用?可以对对象创建进行初始化。
构造函数怎么在代码中体现呢?
1,没有返回值类型。因为构造对象,创建完就结束,需要结果。void也不要写,因为要有区别与一般函数。
2,构造函数名称和类名一致。
3,没有具体的返回值。
接下来,按照以上三点,在Person类中定义一个构造函数。
对象一创建就具备了姓名。
发现了问题?
没有学习构造函数时,对象也创建出来了。那么该对象是否有被构造呢?或者说是否有调用构造函数呢?
是的。必须调用!
那么类中那个构造函数是什么呢?
lass Person
{
//Person(){}//默认的空参数构造函数。
}
main()
{
Person p = new Person();//这就已经调用了Person类中的空参数的构造函数。
//类中有定义该构造函数吗?有的。只要定义一个类,
//该类中默认就有一个空参数的构造函数,是编译器编译时添加到class文件中。
//注意:如果在类中自定义了构造函数,那么默认的空参数构造函数编译器就不添加了。
//原理:没有定义对象的初始化过程,编译器会添加一个默认的初始化过程。
// 如果定义了指定的对象初始化过程,默认的就不添加了。
}
构造函数的细节:
1,一个类中可以有多个构造函数,它们的存在是以重载的形式体现的。
2,构造函数中也是有return语句的,用于结束初始化动作的。
3,构造函数是否能被private修饰呢?能,作用:其他程序无法创建该类的对象。
class Person
{
private Person(){}
}
main()
{
Person p = new Person();//创建对象无法初始化。
}
构造函数和一般函数的区别?
1,写法不一样。
2,运行上有差别,对象一创建就会调用对应的构造函数。
一般方法是对象创建后,才会调用所需的一般函数。
问:有了构造函数初始化姓名,那么还需要setName方法吗?
需要,因为对象创建后,如果需要对数据进行修改,可以通过set完成。
3,构造函数在对象创建时,仅调用一次(初始化动作只做一次,而且先执行)。一般方法可以被对象调用多次。
class Person
{
//Person(){}
void Person(){}//这是一般函数。但不要这些书写,因为一般函数名称有规范。
}
main()
{
Person p = new Person();
}
lass Person
{
//属性:姓名,年龄。
private String name;
private int age;
//一初始化,既没有姓名,又没有年龄。
Person()
{
}
// Person(int a)
// {
// if(a<0)
// return;
// age = a;
// }
//定义构造函数,对象一创建就具备姓名。
Person(String n)
{
//将接收到的值赋值给对象的name
name = n;
}
//一初始化既有姓名,又有年龄。
Person(String n,int a)
{
name = n;
age = a;
}
//行为。
public void speak()
{
System.out.println("name="+name+",age="+age);
}
}
class PersonDemo2
{
public static void main(String[] args)
{
Person p1 = new Person();
// Person p = new Person("lisi");//对象创建时,必须会调用对应的构造函数,因为对象需要初始化。
// Person p2 = new Person("wangwu",23);
}
}
//对象的初始化过程。
class Demo
{
static int x = 1;
int y = 1;
static
{
System.out.println("static code...x="+x);
}
{
System.out.println("cons code ...y="+y);
}
Demo()
{
System.out.println("cons function ...y="+y);
}
}
class CreateObjectTest
{
public static void main(String[] args)
{
/*
1,加载Demo.class文件进方法区,并进行空间分配。
2,如果有静态变量,先默认初始化,显示初始化。
3,如果有静态代码块,要执行,仅一次。
4,通过new在堆内存中开辟空间,并明确首地址。
5,对对象中的属性进行默认初始化。
6,调用对应的构造函数进行初始化。
7,构造函数内部。
7.1 调用父类构造函数super();
7.2 成员变量的显示初始化。
7.3 构造代码块初始化。
7.4 构造函数内容自定义内容初始化。
8,对象初始化完毕后,将地址赋值给d引用变量。
*/
Demo d = new Demo();
}
}
JDK1.5之后Java允许定义形参个数可变的参数,从而允许为方法指定数量不确定的形参,如果在定义方法时,在最后一个形参后面加上三个点(...)则表明该形参可以接受多个参数值,多个参数值被当成数组传入。
package arrayview;
public class 可变形参 {
//定义了形参个数的可变方法
public static void test(int a , String...books)
{
//books被当成数组处理
for (String string : books) {
System.out.println(string);
}
//输出整数a的值
System.out.println(a);
}
public static void main(String[] args) {
//调用test方法,可以随便输入几个参数
test(5,"我爱Java","我爱黑马","我爱传智播客","我爱北京");
}
}
需要注意的是:长度可变得形参只能处于形参列表的最后,一个方法中最多只能包含一个长度可变的形参。调用包含一个长度可变得形参方法时,这个长度可变的形参既可以传入多个参数,也可以传入一个数组。