请问是哪里错了,谢谢!小弟初学JAVA,请问大家哪里有介绍构造函数的继承问题的好文章,谢谢了!~public class Example1 {
public static void main(String[] args)
{
B b;
b=new B(12);
System.out.print(b.i+" "+b.f()+" "+b.g()+" "+B.g()+'\n');
A a=b;
System.out.print(a.i+" "+a.f()+" "+a.g()+" "+A.g()+'\n');
}}class A
{
int i;
void A(int y)
{
this.i=y;
}
char f()
{
return 'a';
}
static char g()
{
return 'A';
}
}class B extends A
{
int i;
void B(int x)
{
this.i=x;
}
char f()
{
return 'b';
}
static char g()
{
return 'B';
}
}
public static void main(String[] args)
{
B b;
b=new B(12);
System.out.print(b.i+" "+b.f()+" "+b.g()+" "+B.g()+'\n');
A a=b;
System.out.print(a.i+" "+a.f()+" "+a.g()+" "+A.g()+'\n');
}}class A
{
int i;
void A(int y)
{
this.i=y;
}
char f()
{
return 'a';
}
static char g()
{
return 'A';
}
}class B extends A
{
int i;
void B(int x)
{
this.i=x;
}
char f()
{
return 'b';
}
static char g()
{
return 'B';
}
}
解决方案 »
- Java调用bash文件出现command not found
- 求高手们给推荐一两本java方面的书籍
- 问个小问题,Random(long seed)
- 为什么去掉requestFocus(true)就无法获得聚焦
- 内部类
- 今天看了关于编写健壮的Java代码的一些规则,哪位大侠把这句话具体的分析一下?
- JAVA如何实现像素的移动?妹妹不胜感激!
- 大家都来看看,写文件时,如果数据量非常大,怎样在占用固定内存下高效的进行写操作。
- 找工作,想听听大家的意见
- 下列方法,在BMP实体Bean内何时被调用,应在各个方法内放置那些操作?请指教!
- 最新的mail包在什么地方找啊?
- 各位大哥,我这有个数据流的问题,帮帮我
这一行,把void去掉构造方法不能 加 void
B b;
b = new B(12);
System.out.print(b.i + " " + b.f() + " " + b.g() + " " + B.g() + '\n');
A a = b;
System.out.print(a.i + " " + a.f() + " " + a.g() + " " + A.g() + '\n'); }}class A {
int i; A() {//这里还要加一个默认的构造函数才行;因为你在子类中没有调用你自定义的构造函数,那么将调用默认的构造函数;由于你有自定义的构造函数,所以默认构造函数必须显示的写出来;
} A(int y) {//构造函数没有void
this.i = y;
} char f() {
return 'a';
} static char g() { //你在main方法中是通过对象来调用此函数,那么最好把static去掉,否则就用类名.方法名来调用
return 'A';
}
}class B extends A {
int i; B(int x) {
this.i = x;
} char f() {
return 'b';
} static char g() {
return 'B';
}
}
{
B b;
b=new B(12);
// System.out.print(b.i+" "+b.f()+" "+b.g()+" "+B.g()+'\n');
// A a=b;
// System.out.print(a.i+" "+a.f()+" "+a.g()+" "+A.g()+'\n');
System.out.print(b.i+" "+b.f()+" "+b.g()+'\n');
A a=b;
System.out.print(a.i+" "+a.f()+" "+a.g()+'\n'); } } class A
{
int i; public A() {
//这里要有一个默认构造方法. 因为在创建子类对象时,会先调用父类默认构造方法
}
public A(int y) {
this.i=y;
}
char f()
{
return 'a';
}
// static char g()//父类的静态(Static)方法.子类不能覆盖,虽然你表面上覆盖
// { //了父类的静态(Static)方法,但实际上你是建立了一个新的
// return 'A'; //静态(Static)方法
// }
char g()
{
return 'A';
} } class B extends A
{
int i;
void B(int x)
{
this.i=x;
} char f()
{
return 'b';
}
// static char g()
// {
// return 'B';
// }char g() { return 'B';
}
}
因为加了返回值就不是构造方法了,虽然你类名和这个方法名相同,但虚拟机也不会认为,他是构造函数,实际上,他只是长的比较像构造函数的普通方法,而以...
void A(int y)//不要加VOid
{
this.i=y;
}
void B(int x)//不要加VOid
{
this.i=x;
}
class super1{
{
System.out.println("super1 ok");
}
super1()
{
System.out.println("3");
}
}
class Employee extends super1{
private String name;
private double salary=1500.00;
private Date birthday;
public Employee(String n,Date DoB){
System.out.println("2");
name=n;
birthday=DoB;
}
public Employee(String n){
this(n,null);
System.out.println("4");
}
}
class Manager extends Employee{
{
System.out.println("Manager ok");
}
private String department;
public Manager(String n,String d){
super(n);
department=d;
}
}
public class test1{
public static void main(String args[]){
new Manager("Smith","sales");
}
}
new Manager("Smith","sales")调用过程:
(1)绑定构造函数参数。其实就是传递参数的过程
(2)查看是否有this()语句。没有。虽然没有使用this()语句调用构造函数,但是该步骤不能省略
(3)调用super()语句,此时,程序跳转到Public Employee(String n)。
(4)绑定构造函数参数String n
(5)查看是否有this()。有,则执行构造函数public Employee(String n,Date DoB)
(6)绑定构造函数参数String n,Date DoB
(7)查看是否有this()语句。没有
(8)执行有系统自动插入的super()语句:执行super1()
(9)执行显式初始化语句System.out.println("super1 ok");
(10)执行构造函数语句System.out.println("3");
(11)执行显式初始化语句private double salary=1500.00;
(12)执行构造函数语句System.out.println("2");同时执行name=n;birthday=DoB;
(13)执行构造函数语句System.out.println("4");
(14)执行显式初始化语句System.out.println("Manager ok");
(15)执行构造函数语句department=d;
几点总结:
(1)对象是由new运算符创建的,且在任何构造函数执行之前就已经创建完毕了
(2)构造函数的执行总是“向上”的:而且总是先执行完父类的构造函数
(3)在构造函数中,没有this()语句则由super()语句。没有this()时,或者自己编写super(),或者由系统自动调
用 super()
(4)显式初始化语句总是先于构造函数语句,但后于super()或this()