java父类构造
‘壹’ 在java中用来调用父类构造方法的关键字是
java中的关键字super有两种用法。
一、调用父类的构造方法,如:
class A
{
A(String s)
{
System.out.println(s);
}
}
class B extends A
{
B()
{
super("父类");
System.out.println("子类");
}
}
完整例子如下图:
‘贰’ 高人指点一下java父类构造方法
Weapon类没有无参构造方法,Tank类不能隐式调用Weapon类的无参构造方法,因此不能使用隐式构造方法,必须显式定义Tank类的构造方法,并在Tank类的构造方法第一行调用父类的构造方法super(int, int)。
‘叁’ JAVA中 子类与父类构造方法的关系 个人理解
编写JAVA作业时在继承的环节发现了一些错误,希望总结一些规律:(以下全部属于自己归纳,可能有问题)
一句话概括就是:子类一定会调用(不是继承)父类的构造方法!
即遵循一个原则:子类的构造一定是在父类已构造的基础上!
这句话要分为几种情况来理解(下面只讨论父类有构造函数):
子类构造函数自动调用super() (也可以手动加上)
但如果父类只有含参数的构造方法,那么子类必须申明一个构造方法,其中包含对super(args)的调用
一、父类含有无参构造函数
1、子类没有构造方法或者含有无参的构造方法:
这种情况,都会默认地调用super()
2、子类含有有参数构造方法:
同样会在首句默认调用super() //其实跟情况1类似
二、父类含有含参数的构造方法,不含无参数的构造方法:
子类没得选择:
子类必须申明一个构造方法(且含super的args),且方法里要首先调用super(args),否则报错。
三、父类含 含参数的构造方法和无参的构造方法:
此时子类可以选择性调用:
可以无构造方法:仍会默认调用super()
也可以有构造方法:其中会默认地调用super(),你也可以在开头加上这句,如果你不希望调用父类默认的无参方法,那么在 子类构造方法 中调用 父类含参构造方法。
上述看似情况复杂,其实基于其原则理解并不难。
综上:java为了保持 子类的构造基于父类的构造 这一原则,子类构造时必须通过某些方式首先调用父类的构造方法,否则会报错。
‘肆’ java中,父类的构造方法不能被子类继承,对吗
不对。。子类默认继承父类的构造方法 子类创建对象时默认调用自身的空构造器,并在子类构造器中隐式的调用super() 即调用父类的空构造器,如果父类重载了构造器,那么子类必须初始化父类构造器否则编译错误!
classAnimal{
privateStringname;
//重载父类构造器
Animal(Stringname){
this.name=name;
}
}
classDogextendsAnimal{
//必须加上
//Dog(Stringname){
//super(name);
//}
}
classTest{
publicstaticvoidmain(String[]args){
Animala=newDog();
//首先调用Dog空构造器Dog(){}构造器中第一句话为super()但父类已覆盖空构造器所以
//编译产生错误应添加子类构造器初始化父类构造器
//
}
}
‘伍’ java中,子类调用父类函数构造函数中被重写的方法,输出语句为什么是默认值
1,Java的函数调用是虚拟调用,对象名.方法名,调用的都是其真实类型的函数,就是说,对象实际上是一个dog,那么调用的就是dog的重写方法。父类构造器之所以被调用,是因为子类的构造器会调用父类的构造器,整个过程实际上是dog的构造。
2,这个和初始化顺序有关,new对象时,会先初始化成员变量再调用构造器,所以初始化顺序是:父类的成员变量->父类构造器->子类成员变量->子类构造器
也就是说,父类构造器中调用getAge的时候,dog的成员变量还没有初始化
等到子类构造器中再调用一次的时候,已经完成初始化。
‘陆’ java中调用父类构造方法
非静态的变量在别的类里面是不能直接用的。。若要使用的话,就要通过实例化该父类,通过【实例名.属性名】来访问、、、你自己看一下把!! class
Point{
int
x,y;
static
int
c;
public
Point(int
m,int
n){
x=m;
y=n;
System.out.println("带参数的父类给实例化了。x:"+x+"
y:"+y);
}
public
Point(){
c++;
System.out.println("第"+c+"次被创建子类对象");
}
}
public
class
Point3D
extends
Point{
public
static
void
main(String
[]
args){
Point
m1=new
Point3D();
Point
m2=new
Point3D();
Point
m3=new
Point3D();
System.out.println(Point.c);
Point
m4
=
new
Point(7
,
5);
System.out.println("父类x属性的值为:"+m4.x);
System.out.println("父类y属性的值为:"+m4.y);
}
}
‘柒’ “java”中父类构造方法的调用怎么操作
Father a = new Father(baba); 这跟直接调用另一个类并且实例化对象并没多大区别把,不用继承也能做到。调用父类的构造函数用super();关键字
public class Father {
public Father()
//{
//System.out.println("父类无参构造方法");
//} //不在父类中显式声明
public Father(String name)
{
System.out.println("父类有参构造方法");
}
}//父类
public class son extends Father {
public son()
{
super();
System.out.println("子类无参构造方法");
}//子类super();调用父类无参构造方法
public son(String name)
{
super(name);
System.out.println("子类有参构造方法");
}
}//子类
系统在Father类中默认一个无参构造函数,若不在父类中显式的声明,子类super();调用时提示父类的构造方法是未定义的。必须要显式的声明。不会调用默认的无参构造函数。用个编译器具体编译一下,看看到底报的什么错,对症下药。
‘捌’ java 子类调用父类构造方法会创建父类对象吗
调用初始化方法并不代表会生成对象,你的java代码中出现new关键字加上构造方法的调用,只会生成一个对象,其父类对象不会生成,所以调用父类为抽象类的构造方法完全是合理的。
抽象类中的构造方法其实是用来给继承的子类来用的,因为构造方法相当于初始化方法,当子类调用构造方法时必须调用父类构造方法,所以你可以在子类产生对象时抽象类中按需求初始化抽象类中的字段以及执行一些初始化代码。其实并不是一定要生成某个类的实例才调用构造方法,子类也需要调用父类构造方法。
子类在创建实例后,类初始化方法会调用父类的初始化方法(除了Java.lang.Object类,因java.lang.Object类没有父类),而这种调用会逐级追述,直到java.lang.Object的初始化方法。这个地方我说的是初始化方法,而不是构造方法,因为构造方法是相对于java源程序而言,而编译后的class文件是初始化方法即" <init>"方法(红色部分为方法名)。
‘玖’ java调用父类的构造方法,并传递参数怎样实现
class
Dad
{
String
name;
int
age;
public
Dad(){}
public
Dad(String
name,int
age)
{
this.name
=name;
this.age
=age;
}
}
class
kid
extends
Dad
{
public
kid()
{
super();
//父类构造器的调用,必须是子类构造器中的第一个语句
System.out.println("优先调用了无参构造器
");
}
public
kid(String
name,int
age)
//含参构造器中的参数列表,即包含了子类的成员变量,也包含了继承的父类的成员变量
{
super(name,age);
//●●●父类构造器的调用,必须是子类构造器中的第一个语句
System.out.println("优先调用了含参构造器:"+this.name+"已经"+this.age);
}
}
public
class
maintest
{
public
static
void
main(String[]
args)
{
kid
kd1=new
kid();
kid
kd2=new
kid("帅哥",19);
}
}
‘拾’ java子类构造中怎么调用父类的构造函数
先小小纠正一下,java里面一般不叫函数,叫方法,这是Java的一个小习惯。
你这个问题原因很简单。
首先,任何类都有构造方法,难怕是你不写,也会默认你有一个有无参构造方法。,所以你的A里面就会有一个叫A()的构造方法。
当你new A()时,默认你有一个有无参构造方法A()的方法里的第一句,会自动加上一个super();的方法,这句就是调用父类构造方法的意思,这是java规定的规则。
你可以尝试一下,在A里写一个构造方法:
A(){
super(); //这个一定要放在第一句
System.out..XX;
}
这与你不写super()这句效果是一样的,因如果没写,java会默认在第一句加上super。