- 浏览: 426544 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
pulsar_lxl:
请注明转载原文:http://hllvm.group.itey ...
JVM研究 -
goycejin:
感谢楼主,我也要及笔记了,这记性
Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.8.1:jar -
lianglong2000:
我理解是 java -server 类名 是运行的jdk中的j ...
jdk,jre你真的懂吗? -
yanqlv:
有个问题,既然windows目录(Windows/system ...
jdk,jre你真的懂吗? -
yanqlv:
系统化的描述也挺重要,架构模式>设计模式,架构模式≈设计 ...
MVC是设计模式么?是框架么?
继承中的构造方法
一、无参构造函数(默认构造函数)与有参构造函数
子类的所有构造方法都必须调用父类的一个构造方法,如果不显示指定调用父类的哪个构造方法,就默认调用父类的无参构造方法.
class A
{
//A() { System.out.println("A()");}
A(int i) { System.out.println("A(i)");}
}
class B extends A
{
B() { }
public static void main(String []a)
{ B b=new B(); }
}
编译时显示:
B.java:8: 找不到符号
符号: 构造函数 A()
位置: 类 A
B( ) { }
^
1 错误
即:创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),
假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,
因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。我们假设A是B的父类,B是A的子类。
1、如果程序员没有给类A没有提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不再提供默认的无参数构造函数。
2、子类B实例化时会自动调用父类A的默认构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供了其他类型的构造函数,编译器同样会报错,因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数。
3、或者在B的构造函数中显示的调用父类A的有参构造函数。super(parameter)
二、成员继承中的隐藏和覆盖
首先看一下JAVA中方法和变量在继承时的覆盖和隐藏规则
1.父类的实例变量和静态变量能被子类的同名变量隐藏
2.父类的静态方法被子类的同名静态方法隐藏
3.父类的实例方法被子类的同名实例方法覆盖
还有几点需要注意的是
1.不能用子类的静态方法隐藏 父类中同样标识(也就是返回值 名字 参数都一样)的实例方法
2.不能用子类的实例方法覆盖 父类中同样标识的静态方法
3.这点儿请注意,就是变量只会被隐藏不会被覆盖,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏父类的实例变量,子类的实例变量可以隐藏 父类的静态变量
总结:
1.同名的实例方法被覆盖 ,同名的静态方法被隐藏,
2.隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法。(类的多态性)
3.如果需要访问父类被隐藏 的实例变量,加上super就好了。
4.如果需要访问父类被覆盖的方法,加上super就好了。
例1:变量隐藏:子类拥有了两个相同名字的变量,一个来自父类,一个是自己定义;当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己定义的方法时,所操作的就是它自己的变量,而把继承自父类的变量“隐藏”起来了。
class A
{
protected int a;
A(int a) {setA(a+10);}
public void setA(int x) { a=x; }
public void showA() {System.out.println("A:showA(): a="+a);}
public void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
protected int a,b;
B2(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public void setB(int x1, int y1) { a=x1; b=y1; }
public void show()
{
//super.show();
System.out.println("B:show():a="+a+" B:b="+b);
}
public static void main(String []a)
{
B2 b1;
b1=new B2(1,2);
b1.show();
b1.showA();
}
}
----------运行 ----------
B:show():a=101 B:b=102
A:showA(): a=11
例2:部分覆盖:super.原父类方法名+其它语句
class A
{
protected int a;
A(int a) {setA(a+10);}
public void setA(int x) { a=x; }
public void showA() {System.out.println("A:showA(): a="+a);}
public void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
protected int a,b;
B2(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public void setB(int x1, int y1) { a=x1; b=y1; }
public void show()
{
super.show();
System.out.println("B:show():a="+a+" B:b="+b);
}
public static void main(String []a)
{
B2 b1;
b1=new B2(1,2);
b1.show();
//b1.showA();
}
}
----------运行 ----------
A:show() :a=11
B:show():a=101 B:b=102
例3:show是实例方法被覆盖,转化为父类对象时,由于是子类对象所以调用本身类的方法,如果是父类对象,则调用父类的方法。showA是父类的方法而子类中无该方法,所以调用父类的方法,访问父类的成员。
class A
{
protected static int a;
A(int a) {setA(a+10);}
public static void setA(int x) { a=x; }
public static void showA() {System.out.println("A:showA(): a="+a);}
public void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
protected static int a,b;
B2(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public static void setB(int x1, int y1) { a=x1; b=y1; }
public void show()
{
//super.show();
System.out.println("B:show():a="+a+" B:b="+b);
}
public static void main(String []a)
{
A a1=new A(1);
B2 b1;
a1.show();
b1=new B2(1,2);
a1=b1;
a1.show();
a1.showA();
}
}
----------运行 ----------
A:show() :a=11
B:show():a=101 B:b=102
A:showA(): a=11
例4:a是静态变量,在子类用有同名变量,所以在子类中a被隐藏。在子类中如果要访问来自父类的a成员需要使用super。
class A
{
protected static int a;
A(int a) {setA(a+10);}
public static void setA(int x) { a=x; }
public static void showA() {System.out.println("A:showA(): a="+a);}
public void show() {System.out.println("A:show() :a="+a);}
}
class B3 extends A
{
protected static int a,b;
B3(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public static void setB(int x1, int y1) { a=x1; b=y1; }
public void show()
{
System.out.println("B:show():a="+a+" B:b="+b+" B:super.a="+super.a);
}
public static void main(String []a)
{
B3 b1;
b1=new B3(1,2);
b1.show();
}
}
结果:
B:show():a=101 B:b=102 B:super.a=11
例5:show是静态方法,属于类的,而不属于某一个对象,所以用a1对象调用show()方法相当于A.show()调用,跟a是那一个父类对象,或者跟子类对象没有任何的关系。
class A
{
protected static int a;
A(int a) {setA(a+10);}
public static void setA(int x) { a=x; }
public static void showA() {System.out.println("A:showA(): a="+a);}
public static void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
protected static int a,b;
B2(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public static void setB(int x1, int y1) { a=x1; b=y1; }
public static void show()
{
//super.show();
System.out.println("B:show():a="+a+" B:b="+b);
}
public static void main(String []a)
{
A a1=new A(1);
B2 b1;
a1.show();
b1=new B2(1,2);
a1=b1;
b1.show();
a1.show();
a1.showA();
}
} ----------运行 ----------
A:show() :a=11
A:show() :a=11
A:showA(): a=11
一、无参构造函数(默认构造函数)与有参构造函数
子类的所有构造方法都必须调用父类的一个构造方法,如果不显示指定调用父类的哪个构造方法,就默认调用父类的无参构造方法.
class A
{
//A() { System.out.println("A()");}
A(int i) { System.out.println("A(i)");}
}
class B extends A
{
B() { }
public static void main(String []a)
{ B b=new B(); }
}
编译时显示:
B.java:8: 找不到符号
符号: 构造函数 A()
位置: 类 A
B( ) { }
^
1 错误
即:创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),
假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,
因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。我们假设A是B的父类,B是A的子类。
1、如果程序员没有给类A没有提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不再提供默认的无参数构造函数。
2、子类B实例化时会自动调用父类A的默认构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供了其他类型的构造函数,编译器同样会报错,因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数。
3、或者在B的构造函数中显示的调用父类A的有参构造函数。super(parameter)
二、成员继承中的隐藏和覆盖
首先看一下JAVA中方法和变量在继承时的覆盖和隐藏规则
1.父类的实例变量和静态变量能被子类的同名变量隐藏
2.父类的静态方法被子类的同名静态方法隐藏
3.父类的实例方法被子类的同名实例方法覆盖
还有几点需要注意的是
1.不能用子类的静态方法隐藏 父类中同样标识(也就是返回值 名字 参数都一样)的实例方法
2.不能用子类的实例方法覆盖 父类中同样标识的静态方法
3.这点儿请注意,就是变量只会被隐藏不会被覆盖,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏父类的实例变量,子类的实例变量可以隐藏 父类的静态变量
总结:
1.同名的实例方法被覆盖 ,同名的静态方法被隐藏,
2.隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法。(类的多态性)
3.如果需要访问父类被隐藏 的实例变量,加上super就好了。
4.如果需要访问父类被覆盖的方法,加上super就好了。
例1:变量隐藏:子类拥有了两个相同名字的变量,一个来自父类,一个是自己定义;当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己定义的方法时,所操作的就是它自己的变量,而把继承自父类的变量“隐藏”起来了。
class A
{
protected int a;
A(int a) {setA(a+10);}
public void setA(int x) { a=x; }
public void showA() {System.out.println("A:showA(): a="+a);}
public void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
protected int a,b;
B2(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public void setB(int x1, int y1) { a=x1; b=y1; }
public void show()
{
//super.show();
System.out.println("B:show():a="+a+" B:b="+b);
}
public static void main(String []a)
{
B2 b1;
b1=new B2(1,2);
b1.show();
b1.showA();
}
}
----------运行 ----------
B:show():a=101 B:b=102
A:showA(): a=11
例2:部分覆盖:super.原父类方法名+其它语句
class A
{
protected int a;
A(int a) {setA(a+10);}
public void setA(int x) { a=x; }
public void showA() {System.out.println("A:showA(): a="+a);}
public void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
protected int a,b;
B2(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public void setB(int x1, int y1) { a=x1; b=y1; }
public void show()
{
super.show();
System.out.println("B:show():a="+a+" B:b="+b);
}
public static void main(String []a)
{
B2 b1;
b1=new B2(1,2);
b1.show();
//b1.showA();
}
}
----------运行 ----------
A:show() :a=11
B:show():a=101 B:b=102
例3:show是实例方法被覆盖,转化为父类对象时,由于是子类对象所以调用本身类的方法,如果是父类对象,则调用父类的方法。showA是父类的方法而子类中无该方法,所以调用父类的方法,访问父类的成员。
class A
{
protected static int a;
A(int a) {setA(a+10);}
public static void setA(int x) { a=x; }
public static void showA() {System.out.println("A:showA(): a="+a);}
public void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
protected static int a,b;
B2(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public static void setB(int x1, int y1) { a=x1; b=y1; }
public void show()
{
//super.show();
System.out.println("B:show():a="+a+" B:b="+b);
}
public static void main(String []a)
{
A a1=new A(1);
B2 b1;
a1.show();
b1=new B2(1,2);
a1=b1;
a1.show();
a1.showA();
}
}
----------运行 ----------
A:show() :a=11
B:show():a=101 B:b=102
A:showA(): a=11
例4:a是静态变量,在子类用有同名变量,所以在子类中a被隐藏。在子类中如果要访问来自父类的a成员需要使用super。
class A
{
protected static int a;
A(int a) {setA(a+10);}
public static void setA(int x) { a=x; }
public static void showA() {System.out.println("A:showA(): a="+a);}
public void show() {System.out.println("A:show() :a="+a);}
}
class B3 extends A
{
protected static int a,b;
B3(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public static void setB(int x1, int y1) { a=x1; b=y1; }
public void show()
{
System.out.println("B:show():a="+a+" B:b="+b+" B:super.a="+super.a);
}
public static void main(String []a)
{
B3 b1;
b1=new B3(1,2);
b1.show();
}
}
结果:
B:show():a=101 B:b=102 B:super.a=11
例5:show是静态方法,属于类的,而不属于某一个对象,所以用a1对象调用show()方法相当于A.show()调用,跟a是那一个父类对象,或者跟子类对象没有任何的关系。
class A
{
protected static int a;
A(int a) {setA(a+10);}
public static void setA(int x) { a=x; }
public static void showA() {System.out.println("A:showA(): a="+a);}
public static void show() {System.out.println("A:show() :a="+a);}
}
class B2 extends A
{
protected static int a,b;
B2(int x1, int y1) { super(x1); setB(x1+100, y1+100); }
public static void setB(int x1, int y1) { a=x1; b=y1; }
public static void show()
{
//super.show();
System.out.println("B:show():a="+a+" B:b="+b);
}
public static void main(String []a)
{
A a1=new A(1);
B2 b1;
a1.show();
b1=new B2(1,2);
a1=b1;
b1.show();
a1.show();
a1.showA();
}
} ----------运行 ----------
A:show() :a=11
A:show() :a=11
A:showA(): a=11
发表评论
-
Java线程池使用说明
2015-05-12 23:34 1221一简介 线程的使用在java中占有极其重要的地位 ... -
Long == 操作符 的陷阱
2015-02-25 10:38 831当两个对象进行比较的时候,我们应该使用equals方法,但是 ... -
java中只有值传递,没有引用传递
2013-08-24 14:29 1427一、首先来明确一下"值传递"和&quo ... -
java vs javaw vs javaws
2013-08-12 22:54 1427reference:http://javapapers.co ... -
java类的初始化顺序
2013-07-17 23:14 766(1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序 ... -
java泛型
2013-07-04 11:43 1053泛型是Java SE 1.5的新特性,泛型的本质是参数化类 ... -
JVM分代垃圾回收详述
2013-07-03 20:15 880虚拟机中的共划分为三 ... -
JSP 9 大内置对象详解
2013-06-24 23:15 1096内置对象特点:1. 由JSP规范提供,不用编写者实例化2. ... -
什么是J2EE
2013-05-20 19:36 1258J2EE英文全称Java 2 Platform Enterpr ... -
transient Volatile ThreadLocal
2013-04-29 16:05 1233Java的serialization提供了 ... -
java 过滤器 Filter
2012-10-11 14:43 1451Servlet 过滤器是可插入 ... -
java xml解析
2012-08-04 17:11 1696随着XML越来越广泛地被 ... -
Tomcat Web项目中文乱码问题解决方案
2012-07-30 16:58 2833Tomcat常见乱码解决方案:(建议按顺序来看,逐个排除) 1 ... -
list的remove问题
2012-07-17 12:45 17441、增强的for循环里面不 ... -
java方法覆盖的原则
2012-06-06 22:50 1785什么是方法覆盖 如果在子类中定义的一个方法,其名称、返回类型 ... -
Spring之方法注入(lookup method)
2012-05-29 10:51 3627Spring使用CGLIB的动态字节码增强功能,所以,必须要加 ... -
java虚拟机内存原型
2012-05-14 17:21 1044寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引 ... -
jdk,jre你真的懂吗?
2012-05-07 11:01 24097关于jdk和jre 大家肯定 ... -
java注解
2012-04-24 16:56 1471Java注解 一、什么是java注解 注 ... -
java
2012-03-16 19:50 8630. 构造方法不能被继承! 1. ...
相关推荐
1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字
要有至少两个构造方法(一个构造方法只有一个参数id并调用父类无参的构造方法,另一个构造方法有多个属性值做参数并调用父类有参的构造方法); 要体现出this和super的用法; 要覆盖play()方法,并在play...
继承与接口含义,子类的继承性的访问控制,子类对象的构造过程,子类的内存分布,子类对象的成员初始化,成员变量的隐藏,方法的重载与方法的覆盖,this关键字。。。。。。
8.2 super构造方法调用 8.3 封装和继承 8.4 使用继承 8.4.1 Object类 8.4.2 定义equals方法 8.5 关于设计好继承的几点建议 8.6 实例:一卡通类的继承 8.6.1 构造方法 8.6.2 setter方法 8.6.3 getter方法 ...
什么时候被覆盖的方法并非真的被覆盖了 Item 2: String.equals()方法与== 运算符的用法比较 Item 3: Java 是强类型语言本 Item 4: 那是构造函数吗 Item 5: 不能访问被覆盖的方法...
4.5 继承中的方法的覆盖和重载 65 4.6 多态和动态绑定 66 4.7 动态绑定 69 4.8 instanceof 运算符 70 4.9 多态对象的类型转换 71 4.10 Java static关键字以及Java静态变量和静态方法 72 4.11 static 的内存分配 73 ...
java基础教学ppt,共15...* 继承时候的构造方法 * 隐藏和覆盖 * 重载、覆盖和重载的区别 * Object类 * 终结类、终结方法 * 抽象类、抽象方法 * 接口 其它不在这里一一说明.如果有感趣的可以自己下载看.
4.4构造方法的继承154 4.5super的使用156 4.5.1用super引用父类的成员156 4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 4.7多态的基本概念159 4.8重载159 4.8.1普通方法的重载160 4.8.2构造...
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...
showDiff.java 演示隐藏与覆盖之间的区别 showSomething.java 测试运行时多态 stupid.java 试图覆盖最终方法的类,它有错误 Sub.java 一个简单的子类 Super.java 一个基类 testOverload.java 测试方法的重载...
C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...
•构造器的重载和方法的重载一样,都是方法名相同,形参列表不相同。 •在构造器中可通过this来调用另外一个重载的构造器。 继承的特点 •Java通过关键字extends来实现,实现继承的类称为子类,被继承的...
6.7. 构造方法 6.8. 数据和方法的隐藏―――封装 6.9. 方法的重载 7. 六 高级语言特性 7.1. 封装 (encapsulation) 7.2. 继承 (inherit) 7.2.1. JAVA继承特点 7.2.2. 父类(SuperClass)和 子类(SubClass)的...
7-6-4 覆盖(Overriding)与隐藏(Hiding)的差别 7-6-5 Override与OVerload的差别 7-7 Abstract成员函数与多态(Polymorphic) 7-7-1 一般纯虚函数的多态实现概念 7-7-2 纯虚函数的定义语法及实现 7-8 Self、AS、is...
接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法, 而接口中不能定义构造器而且其中的方法全部都是抽象方法。 抽象类中的成员可以是private、默认、protected、public的,而接口中的...
5.3.1方法覆盖 53 5.3.2多态性 54 5.4 静态方法 58 5.5 本章小结 59 5.6 实战演练 59 第六章 属性、数组和索引器 60 6.1 属性——智能字段 60 6.1.1定义和使用属性 61 6.1.2编译器的工作原理 62 6.1.3 只读属性 63 ...
在子类中用 new 关键字修饰定义的与父类中同名的方法,叫覆盖。覆盖不会改变父类方法的功能。 当子类创建父类时,代码中A c = new B(),覆盖不会改变父类的功能。依然还是调用父类的功能。 三、new 约束 用于在泛型...
使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用...