❶ java中什么是构造方法及其作用
无意中翻到这条提问,看了很多回答,发现歧义较重,在这里解答一下,为了避免后边来的朋友们踩雷
新手学习Java在构造方法这里很容易踩雷,构造方法是用来初始化的,这句勉强没错,可构造方法是用来创建对象的,这句就错了,实际上,在构造方法执行之前,类的内存空间已经开辟完成了,意思就是说对象已经创建了,这步是由new关键字来完成的,而构造方法的作用是给类中的变量进行初始化赋值
假设,假设构造方法是用来创建对象用的,就无法解释抽象类中为什么允许构造方法的存在,抽象类无法实例化,不能被创建,但是抽象类中允许构造方法的存在,举例从侧面证明一下:
abstract class Animal{
String name;
public Animal() {
System.out.println("抽象父类的无参构造");
}
abstract void eat();
}
class Dog extends Animal{
public Dog() {
super();
System.out.println("子类的无参构造");
}
@Override
void eat(){
}
}
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
System.out.println(d.name);
}
}
随手敲的很简陋的一段代码,不要在意格式上的不严谨,领会精神,这段代码执行后的结果为:
抽象父类的无参构造
子类的无参构造
null
当执行Dog d = new Dog()这句代码时,大致会分两步,一是加载类,开辟类的内存空间,这是由new完成的,第二步执行构造方法,为类中的变量初始化赋值,在执行Dog的无参构造时,系统会默认调用父类的无参构造,也就是super(),super关键字是对该类的父类进行的引用,它并不是一个对象,这也是个难点,感兴趣的可以去查一下,而super()这句代码可以简单理解为调用这个类的父类的无参构造
在上述代码中,父类Animal是一个抽象类,而抽象类不可被实例化,如果构造方法的作用是创建对象,在这一步上逻辑就无法自洽,而实际情况是:抽象类执行了构造方法,但却没有创建对象,同时成员变量name也有了初始值null
❷ java中的构造方法是用来干嘛的怎么就想到要用构造方法我写的时候想不到要写
构造方法就是用来构造一个对象出来的。
一个对象通常有很多属性,这些属性通常是定义为private访问级别的,通常定义了public 的GET SET方法,操作这些属性。
当new 一个无参数的对象,即调用默认构造方法,这些属性的值一般就是为空的。
当调用带参数的构造方法的时候 一般我们是给一些属性赋值。
所以当你想初始化NEW出来的对象有些值的时候就去调用你自己定义的带参数构造方法。
其实不难理解 吧 亲再好好地去学习一下!
❸ java中的构造方法是个什么意思,为什么一定通过它来为成员赋初值,直接赋不行吗
构造方法就是上户口,上户口派出所必须要求你出示必要条件,男人还是女人,出生日期,父母姓名。这些必须是上户口的时候必须具备的,否则上个空头户口那就乱套了。势必是活不见人死不见尸。先开个空头户口,在让你写名字,这就意味着,你这个户口可以是张三,还能是李四,到时候户口起不到作用了。
❹ java中什么叫构造方法
构造方法是一种特殊的方法,与一般的方法不同是:
1.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
2.构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
3.不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。
class RectConstructor{
double length;
double width;
double area(){
return length*width;
}
//下面这个方法就是所谓的构造方法,没有返回值,方法名与类名相同~~~
RectConstructor(double width,double length){//带参数的构造方法
this.length=length;
this.width=width;
}
}
其实构造方法就是为了给类中成员赋初值~~~~~~~~~~~~~
❺ java中如何构造和调用方法,请给个实例
你说的是构造方法还是构造一个方法? 构造方法是用来传值的,生成对象的时候会自动运行默认的构造方法,当然也可以对其进行私有化。 如果是构造一个方法的话 你的意思应该是写一个类 然后可以进行继承 或者实现 来调用。
一下楼上的话!添加个实例说明下!
//这是一个测试类
class Test{
//这个是构造方法,在创建对象的时候会自动调用执行,当然这是个无参构造方法,
//如果需要还可以写有参构造方法
public test(){}
public void method(){//里边方法体}
//如果要调用这种实体方法必须通过new 的对象来调用如:new Test().method();
public static void method2(){//里边方法体}
//如果要调用这种静态方法,直接通过类名就可以调用如:Test.method2();
}
❻ 1. 说明什么是构造方法,构造方法有哪些特点 2. 如果程序中有多个类时,如何来确定源程序文件的名称
1
构造方法是完成实例初始化的一系列指令集。构造方法的特点是没有返回类型,和类名字一抹一样。
2
如果有多个类,如果有且只有一个public class,则必须和这个public class命名相同。如果没有public,文件名随意。注意java得扩展名是.java...
❼ java中什么是构造方法
构造方法,就是java类实例化的时候调用的类里面的一个方法来构造这个定义的实体。
在类中有不同的构造方法,通过传入参数来区分,选择不用构造方法来实例化这个实体
❽ iOS中构造方法和实例方法的区别
你好!
行为差异:构造方法,创建对象后自动调用构造方法,实例方法必须对象.实例方法进行调用。
功能差异:构造方法多用于初始化对象状态,对属性赋初值,实例方法用于实现某个功能
仅代表个人观点,不喜勿喷,谢谢。
❾ java抽象类中的构造方法作用如何理解
/*学好java基础,学深java基础,才能走的更远(为什么呢?网络有更好的解释),愿我们共同探讨学习,用通俗易懂的话语来了解java
1.抽象类也是类,只不过本身不能实例化,要通过子类实例化。
2.是类就有构造方法,如果我们没有给出构造方法,系统将自动提供一个无参构造方法,如果我们给出了构造方法,系统将不会提供。
那么问题来了,为什么非得有构造方法呢?
构造方法(函数)的作用:(1)用于创建对象,初始化参数;(2)接受子类传来的参数,初始化参数,子类堆内存的某块位置存放父类的初始化参数
那么问题又来了,问题1:抽象类有构造方法怎么不能创建对象?问题2:它与接口又有什么关系呢?
问题1:请看构造函数的作用,还要补充下,用抽象类就要写个继承它的子类,然后通过父类引用指向子类这也是多态的表现,Father f = new Son();引用地址f就可以调用抽象类中的一般方法;
那么问题又来了抽象类怎么访问子类的方法呢?好了,自己考虑去
对于抽象类和一般类,接口来个例子
话说我去兰州拉面馆吃面,拿着菜单
抽象类的说法:
我:老板来碗面
老板:你需要什么面?
我:就是面啊?---------->描述抽象,既然抽象类都这么抽象了,那它有什么作用呢?简单来 说,就是抽取某个类的共性功能,方便分类调用(编程就需要逻辑思维清晰,可读性强,就像书为什么要目录);举个例子,假如有哥们想吃面,想吃辣点的(面的共性辣),就快速选个方向去四川面馆,到了面馆就有查渣面,鸡丝凉面(具体类)选择...
老板:...
类的说法:
我:老板来碗面
老板:你需要什么面?
我:油泼面 ------------>描述具体
接口:从广义的角度讲对外提供规则的都是接口,来个例子
话说你家大门锁,你可以用匹配的钥匙打开锁,可我不一定非得要用你那型号的钥匙去开你家大门,我可以用铁丝就可以了,想想,实际生活中当真可以么,去问盗贼,他们"接口"倒是学的不赖
为什么用铁丝也可以开门呢?因为实现了锁孔内几个顶针同时顶上然后什么什么的方法,现在我们来看,我们可以用钥匙这个对象可以开锁,用铁丝这个对象开锁,他们共同的特点就是实现了
开锁的一些规则要求,也就是实现了开锁的要求的方法
需要说明的是:接口是没有构造方法的,它只是用来对外提供规则,其他类都可以实现这个接口,重写里面的方法
问题2:抽象类和接口的关系?
一般类继承抽象类,extends
一般类也可继承一般类 ----->类与类可以继承,单继承,儿子和父亲的关系(一个儿子不能来自两个父亲的基因,能吗?)
一般类和抽象类可以实现一个或多个接口,implements--->....干儿子和干爹的关系
那么问题来了:有没有人有个奇葩的问题,接口可不可以有父亲?干爹呢?
......收住,回到正题
3.子类中所有的构造方法默认都会访问父类中空参构造方法-->为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据,
所以,子类初始化之前,一定要先完成父类数据的初始化。
4.那么问题来了,要是父类没有无参构造呢?
不会有人认为父类没构有造方法吧?。。。
系统会默认加的(前面有提到),这里是指父类手动写了有参构造,子类继承也要手动写出构造方法(请看下面例子)
5.继承的注意事项
(1):子类只能继承父类所有非私有的成员(成员方法和成员变量)--->皇帝老儿的妃子,你太子能继承享用,恩...只代表大众的想法,特殊的除外,不钻牛角尖
(2):子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
*/
/* 1.父类没有无参构造方法,子类怎么办?
super解决
this解决
2.注意事项
super(…)或者this(….)必须出现在构造方法的第一条语句上
*/
class test{
public static void main(String[] args) {
Son son = new Son("张三",23);
System.out.print(son.name+":"+son.age);
}
}
class Father {
String name="李四"; //姓名
int age=24; //年龄
/*public Father() { //空参构造
System.out.println("Father 空参构造");
}*/
public Father(String name,int age) { //有参构造
//super(); 系统默认的,你知道是继承谁的吗? 最高父类Object
this.name = name;
this.age = age;
}
public void setName(String name) { //设置姓名
//super(); 系统默认的,你知道是继承谁的吗?最高父类Object
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
}
class Son extends Father {
//String name = "张三";
//int age=23;
/*public Son() { //由于父类没有无参构造(子类不继承父类构造放法),但是可以通过加this(值)或super(值)去访问父类构造方法
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
//this(name,age); //注意,这种写法错误,虽然name,和age为成员变量,但是,无参构造方法没有参数传进来,(说到底无参构造方法终究还是个方法而已)
this("张三",23); //这种方法可以,为什么?因为它会在本类中寻找有参构造,通过 super(name,age)将值传入父类(因为父类只有有参构造)
//留下个疑问?要是下面有参构造,形参少了参数,即public Son(String name){ super(name,age);}还起作用吗?试试
//super(name,age); //同上
super("李四",24); //同上,注意this(值)和super(值)不能同时在构造方法的第一条语句上,但系统默认super()除外
}
public Son(String name,int age) {
//super(name);
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
super(name,age);
System.out.print(name+":"+age);
}
}
//子类构造方法另外种写法对吗?
class test{
public static void main(String[] args) {
Son son = new Son("王五");
System.out.print(son.name+":"+son.age);
}
}
class Father {
String name; //姓名
int age; //年龄
/* public Father() { //空参构造
System.out.println("Father 空参构造");
}
*/
public Father(String name,int age) { //有参构造
//super(); 系统默认的,你知道是继承谁的吗? 最高父类Object
this.name = name;
this.age = age;
}
public void setName(String name) { //设置姓名
//super(); 系统默认的,你知道是继承谁的吗?最高父类Object
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
}
class Son extends Father {
//String name = "张三";
//int age=23;
/* public Son() { //由于父类没有无参构造(子类不继承父类构造放法),但是可以通过加this(值)或super(值)去访问父类构造方法
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
//this(name,age); //注意,这种写法错误,虽然name,和age为成员变量,但是,无参构造方法没有参数传进来,(说到底无参构造方法终究还是个方法而已)
this("张三",23); //这种方法可以,为什么?因为它会在本类中寻找有参构造将值传入父类(因为父类只有有参构造)
//留下个疑问?要是下面有参构造,形参少了参数,即public Son(String name){ super(name,age);}还起作用吗?试试
//super(name,age); //同上
super("李四",24); //同上,注意this(值)和super(值)不能同时在构造方法的第一条语句上,但系统默认super()除外
}*/
public Son(String name) { //我们说子类不继承父类的构造方法,也可以这样写对吗?
//super(name);
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
super(name,24);
System.out.print(name+":"+age);
}
}
//就写这么多吧,不断的为什么,我都要疯了,有错误的和遗漏的希望指正
❿ JAVA中构造方法和普通方法的区别
1.构造函数的命名必须和类名完全相同;在java中普通函数可以和构造函数同名,但是必须带有返回值。
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有返回值,也不能用void来修饰.这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择.而其他方法都有返回值.即使是void返回值,尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的.
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用,一般方法在程序执行到它的时候被调用.
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的.而一般方法不存在这一特点