A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 623927408 中级黑马   /  2016-10-15 23:52  /  642 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近学习无参构造和继承,总结出来一些经典编程问题,供大家分享.
例一
class TestA{
public TestA(){
System.out.println(“A”);
}
}
class TestB extends TestA{
public TestB(){
System.out.println(“B”);
}
}
public class Test{
public static void main(String args[]){
TestB testB=new TestB();
}
}
写出上面程序的运行结果,我毫不犹豫的写了个B,回来运行了一下,输出的而是AB,以前我一直以为只有在子类的构造方法调用super()语句的时候才会调用父类的构造方法,看来不是这样的,子类会自动调用父类的无参构造函数。再看下面的例子:
例二:
class TestA{
public TestA(String s){
System.out.println(“A”);
System.out.println(s);
}
}
class TestB extends TestA{
public TestB(){
System.out.println(“B”);
}
}
public class Test{
public static void main(String args[]){
TestB testB=new TestB();
}
}
编译上面的程序,看有什么错误提示,如果没有意外的话,会有下面的错误提示:
———- javac ———-
C:\Users\Administrator\Desktop\Test.Java:8: 错误: 无法将类 TestA中的构造器 TestA应用到给定类型;
public TestB(){
^
原因在于当我们没有给出构造方法是,系统会自动提供一个无参构造方法;如果我们给出了构造方法,系统将不再默认提供无参构造方法.而在这个例子中,我们在父类中写了一个有参构造,当执行这条语句时TestB testB=new TestB(); 系统会默认在子类无参构造方法中访问父类无参构造方法,但父类没有无参构造方法,所以报错.但是此时TestA中只有一个TestA(String s),只要在TestA中加上”public TestA(){}”即可,或者在TestB的构造函数中加上”super(“xxx”)便不会调用TestA的无参构造函数而是调用TestA的有参构造函数。从这里我们还应该能看出,当我们在一个类中定义了自己的带参数的构造方法的时候,必须把无参构造函数定义一下。

例三:
class P {
public static void main(String[] args) {
Father f = new Son();
f.print();
}
}

abstract class Father {
public Father(){
System.out.println(“father”);
}
public abstract void print();
}

class Son extends Father {
public void print(){
System.out.println(“son”);
}
}
运行结果:father son,在子类中没有无参构造函数,系统会自己在子类中创建一个无参构造方法,并且访问父类无参构造方法.

例四:
class TestA{
public TestA(){
System.out.println(“A”);
}
}

class TestB extends TestA{
public static TestB(){
System.out.println(“B”);
}

}

public class Test{
public static void main(String[] args){
TestB testB=new TestB();
}
}
———- javac ———-
C:\Users\Administrator\Desktop\Test.java:8: 错误: 此处不允许使用修饰符static
public static TestB(){
^
java中构造方法可以有任何访问的修饰符,public、private、protected或者没有修饰符 ,都可以对构造方法进行修饰。不同于实例方法的是构造方法不能有任何非访问性质的修饰符修饰,例如static、final、synchronized、abstract等都不能修饰构造方法。
解释:构造方法用于初始化一个实例对象,所以static修饰是没有任何意义的;多个线程不会同时创建内存地址相同的同一个对象,所以synchronized修饰没有意义;
构造方法不能被子类继承,所以final和abstract修饰没有意义。
2、返回类型是非常重要的,实例方法可以返回任何类型的值或者是无返回值(void),而构造方法是没有返回类型的,void也不行。
3、至于命名就是构造方法与类名相同,当然了实例方法也可以与类名相同,但是习惯上我们为实例方法命名的时候通常是小写的,另一方面也是与构造方法区分开。
而构造方法与类名相同,所以首字母一般大写。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马