Java基础_super()用法和继承的关系
来源:互联网 发布:东莞买房 知乎 编辑:程序博客网 时间:2024/06/06 02:26
下面的文章是转载自http://greateryang.blog.163.com/blog/static/81953375201232661845898/
看完这篇文章,你可以理顺super()的作用,和使用该注意的情况;
class A{
int x;
public A(){
this.print() ;
}
public void print(){
System.out.println("x = " + x) ;
}
};
class B extends A{
int x = 100 ;
public B(int x){
super();
this.x = x ;
}
public void print(){
System.out.println("x = " + x) ;
}
- 这里出个题目:为什么打印出来x的值是0,如果不能理解的话再看下一问!
- 再出一个题目: 子类里面的每个构造函数里都有隐式的super(),为什么一定要有super()呢 !
- 看到第二个问题是不是第一个问题比较清晰了,原来是有默认的super();在起作用,那么第二个问题是不是还没有答案!
下面认真看吧,几乎上解决了所有的super的问题!
这个问题中涉及到super的,还涉及到继承!
关于继承这是个大问题:要提到内存机制了,认真看看,后面还给你写了代码分析,是继承和super()大总结!
内存机制:
内存机制:
父类和子类是占用同一块内存的,子类是依附于父类的,先有父类再有子类,只不过子类在父类的基础上增加了自己的方法和属性。
所以: 一个子类对象的产生,必须先调用父类的构造方法产生一个父类实例,然后在这个实例基础上添加子类自己的东西,但是没有父类的构造方法子类根本不可能有构造方法!
问题来了:你会问,我的父类就没有写构造方法,但是我的子类有写构造方法啊,各种有,有参的无参的都很正常啊,而且运行也很好啊,如下面的这个:有这个疑问很正常!! 这就涉及到另一个知识点,构造方法!!
详解:
当每一个类建立的时候,系统都默认添加一个没有参数也没有方法体的构造函数,还记得吧!
所以父类中有构造方法,而且是系统默认存在的构造方法,所以你子类才可能建立构造方法!
问题又来了:子类有无参的构造方法是合理的了,但是我还有有参的构造方法啊,怎么还正确!当你吧某个子类的构造函数里面写成super(100)等的时候,你就会发现出错了,就是这个道理,因为父类默认的构造函数是没有参数的!
问题又来了:只能说小伙很有思想啊,下面的代码又出错了,认真看看!这是问什么呢??,这就是因为,系统给子类构造函数默认的super(),找不到父类的无参的构造函数了,
问题又来了:为什么找不到了呢!他不是默认的吗!!
现在父类已经变身了没看到吗,已经有了人自己的有参构造方法了,系统不提供默认的构造方法了,有了自己的房子还想住国家的公租房?开玩笑吧!
问题又来了:那现在怎么办呢?如何能正常编译呢
这里提供两种方法
A、子类构造方法中全部自定义为有参的super, 就像super(100)调用父类存在的带参数的构造方法!
B、父类中重新定义无参的构造方法, public Text1(){ 方法体可以根据需要取舍!
};
所以: 一个子类对象的产生,必须先调用父类的构造方法产生一个父类实例,然后在这个实例基础上添加子类自己的东西,但是没有父类的构造方法子类根本不可能有构造方法!
问题来了:你会问,我的父类就没有写构造方法,但是我的子类有写构造方法啊,各种有,有参的无参的都很正常啊,而且运行也很好啊,如下面的这个:有这个疑问很正常!! 这就涉及到另一个知识点,构造方法!!
详解:
当每一个类建立的时候,系统都默认添加一个没有参数也没有方法体的构造函数,还记得吧!
所以父类中有构造方法,而且是系统默认存在的构造方法,所以你子类才可能建立构造方法!
问题又来了:子类有无参的构造方法是合理的了,但是我还有有参的构造方法啊,怎么还正确!当你吧某个子类的构造函数里面写成super(100)等的时候,你就会发现出错了,就是这个道理,因为父类默认的构造函数是没有参数的!
问题又来了:只能说小伙很有思想啊,下面的代码又出错了,认真看看!这是问什么呢??,这就是因为,系统给子类构造函数默认的super(),找不到父类的无参的构造函数了,
问题又来了:为什么找不到了呢!他不是默认的吗!!
现在父类已经变身了没看到吗,已经有了人自己的有参构造方法了,系统不提供默认的构造方法了,有了自己的房子还想住国家的公租房?开玩笑吧!
问题又来了:那现在怎么办呢?如何能正常编译呢
这里提供两种方法
A、子类构造方法中全部自定义为有参的super, 就像super(100)调用父类存在的带参数的构造方法!
B、父类中重新定义无参的构造方法, public Text1(){ 方法体可以根据需要取舍!
};
例子2:
public class Base {protected int flag = 5;protected String name;protected int age;public Base(){System.out.println("Base");}public Base(String a){System.out.println("Base");}protected void setName(String name){this.name = name;}protected void setAge(int age){this.age = age;}protected void foo(){System.out.println("foo in father.\n"+"age = "+age+",\t"+"name = "+name);}}
public class Checket extends Base{//private int flag = 100;public Checket(){super();//当不写super();系统会默认添加一个super();进来//super("1");//调用父类构造方法System.out.println("Checket");}public Checket(String name){//super("1");super();}@Overridepublic void foo(){System.out.println("flag = "+flag);//this.flag = 1;super.foo();System.out.println("foo in son");++flag;System.out.println("flag = "+flag);}public static void main(String [] args){Checket c = new Checket();c.setAge(1);c.setName("LPY");c.foo();}}
0 0
- Java基础_super()用法和继承的关系
- Java基础_super
- 继承_super()
- java基础-继承关系
- java继承关系super用法
- Java -- 继承和实现接口的关系
- JAVA的继承关系
- java基础(八)Math/代码块/继承成员方法指南的关系/继承中成员变量之间的关系/方法的重写/继承中构造方法之间的关系/this和super的区别
- java中的代码块和java的继承关系
- hibernate继承关系映射和java反射机制的运用
- Java继承中属性、方法和对象的关系
- Java继承中属性、方法和对象的关系
- Java继承中属性、方法和对象的关系
- C++和Java继承关系中方法覆盖的不同
- Java继承中属性、方法和对象的关系
- Java中的继承:父类和子类的关系
- Java的集合(Collection、Map)和继承关系
- Java继承中属性、方法和对象的关系
- ORA-00904: "POLTYP": invalid identifier 错误
- 搜索
- C++开发工具汇总
- 大话数据挖掘第一章1.1-1.5
- 注意mybatis里面外连接的使用方法
- Java基础_super()用法和继承的关系
- 动态修改控件高度
- 黑马程序员——OC学习之类的声明和实现
- linux下的tomcat内存溢出问题解决
- 自动更新组件分享
- 使用ViewPager时,发生内存溢出OOM问题
- hibernate单向关联和双向关联的区别
- DB2 索引整理
- 字典NSDictionary