上次我们简单介绍了Java的构造函数,对于构造函数我想大家应该也有了一定的了解,那么今天我们来看看构造函数的普通函数有那些区别?
Java上篇:Java:对象and类?
上次我们讲到如何手动定义一个构造函数以及我们定义一个有参的构造函数或者无参的构造函数。在构造函数中最需要注意的还是不能有返回值!
关于构造函数,我们下面会说到它的重载,不知道大家有没有想到既然木有返回值,那么我们如果直接把{}括号拿出来使用呢?这就会介绍到匿名构造块,它的作用也是初始化对象。
一.构造方法之重载
上次我们说到了构造函数以及它的简单使用方法,比如带有不同参数列表的构造方法可以用来实现不同的方法。
至于为什么会有重载这么一个说法呢?小编觉得这是这个语言所需要具备的这么一个特性,官方是称之为多态,而构造函数的重载便是多态一个典型的案例。类中可以有很多个构造函数,但我们知道它们函数中的参数是不一样的;多个构造函数加上构造函数的重载,这样可以衍生出很多个函数,当我们在初始化对象时,就可以表达出对象的多种初始化行为,这也是构造函数重载的一个作用。
简单来说,我们通过构造函数的重载,可以用相同的方法名【和类名一致】(但参数列表不同),我们便可以实现不同的结果。
代码实例:
package self5;
public class demo4 {
String name;
int age;
public demo4() {
}
public demo4(String name1, int age1) {
name = name1;
age = age1;
System.out.println("输出name:" + name + " 输出age:" + age);
}
public static void main(String args[]) {
demo4 p1 = new demo4();
demo4 p2 = new demo4("bob", 1);
}
}
运行结果:
说完构造函数的重载,也知道我们在创建对象时可以有很多种初始化方式,还有一种函数也可以初始化,这就是我们要说到的匿名构造函数,既然叫匿名构造函数,我想大家也能很容易猜到这个函数是木有名字的,也就是说它直接由两个框框构成。
既然有构造函数,也有构造函数的重载,再加上匿名构造函数,而且它们的作用还一样。这里就容易出现一个问题,一山不容三虎,它们在初始化对象时应该是由谁先初始化呢?谁的优先级更高呢?这里以一个简单的程序来进行演示:
程序实例:
package self4;
public class demo3 {
int age;
String name1;
{
System.out.println("执行匿名构造块");
}
{
System.out.println("再次执行构造函数,按照顺序来");
}
public demo3(String name, int age) {
name1 = name;
System.out.println("执行构造函数 name:" + name1);
}
public static void main(String args[]) {
demo3 s = new demo3("bob", 2);
demo3 s1 = new demo3("bob111", 123456);//再打印一遍
}
}
运行结果:
二.方法定义和调用
上面说完匿名构造函数和构造函数,似乎我们忘掉了普通函数,不捉急,这里我们就来说说普通函数,关于Java中的普通函数,和其他语言有一点点的不同,那就是Java中的函数不能单独存在,必须要定义在类体中。
Java中的普通函数或者称为方法,简单来说它就是对类或对象的行为特征的抽象。
普通方法体语法:
权限修饰符 返回值类型 方法名(参数类型 参数名){
//方法体
//返回值
}
方法的定义也类似于函数的使用,只是叫法不一样。普通函数的大致用法其实和别的语言也差不多,这也是编程语言学起来并不是很难的原因,把一门语言精通,那么其他的语言学起来就会很快。
普通函数既然很普通,自然也不会有太多的优先级之分,该调用时便调用。但需要注意的是方法的定义不能产生嵌套包含关系,不能随便套娃哦~
关于普通函数的返回值,在方法中定义的返回值与传递的参数类型均为Java定义的数据类型,在方法中也可以进行返回数据的处理,简单格式如下:
return 返回数据类型
void 不返回数据类型
当我们定义函数方法后,在主函数中便会对函数进行调用,在Java类中方法定义了,它是不会自动执行的,如果想要执行,应进行方法调用。
如下有两种方法调用的方式:
构造函数和普通方法的区别:
名称 | 具体区别 |
---|---|
函数名 | 1.构造函数是没有返回值类型的 |
2.普通函数是有返回值类型的,即使函数值没有返回值,返回值类型也要写上void | |
返回值类型 | 1.构造函数的函数名必须要类名一致 |
2.普通函数的函数名只要符合标识符的命名规则即可 | |
调用方式 | 1.构造函数是在创建对象的时候由jvm调用的 |
2.普通函数是由我们创建对象调用的 | |
作用 | 1.构造函数的作用用于初始化一个对象 |
2.普通函数是用于描述一类事物的公共行为的 |
三.方法的重载和编译时多态
上面有构造函数的重载,这里普通函数也是不服了,硬生生给弄出了一个普通方法的重载。关于普通函数的重载,和构造函数一样也是一个类中多个方法的名称相同,参数的列表不同,但返回值和修饰符不一样,普通函数的返回值类型和修饰符均无关。比如:
public void eat(){}
public void eat(String food){}
编译时多态
关于编译时多态,这里就需先了解早期绑定,早期绑定是指被调用的目标方法如果在编译期(把源文件编译成class文件)可知,且运行期(运行class文件)保持不变时,即可将这个方法与所属的类型进行绑定。
To:重载的方法是早期绑定完成,调用了一个重载的方法,在编译时根据参数列表就能确定方法。
面向对象的封装机制
To:封装的控制和实现:通过private私有访问修饰符修饰变量。
在编写Java程序时,我们一般要做到该露的露,该藏的藏:
1.我们从程序设计追求“高内聚,低耦合”。
2.高内聚就是类内部数据操作细节要自己完成,不允许外部干涉。
3.低耦合:仅暴露方法给外部使用。
4.应禁止直接访问一个对象中数据的实际表示,而通过操作方法来访问,这称
为数据的隐藏。