组合与继承 学习笔记
来源:互联网 发布:医疗器械临床数据库 编辑:程序博客网 时间:2024/05/17 07:31
一、继承
继承就是一种由已有类创建新类,在已有类的基础上扩展功能。
1、只能单一继承,即子类只能有一个父类,但是可以多层继承。
2、子类中出现了同名称的成员变量,会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
3、子类可以对父类的方法进行重写(即方法的返回类型、方法名、参数列表完全相同时,仅方法体不一样),子类对父类的方法重写之后,创建子类对象,直接调用的是子类重写的方法,这时要想调用父类的方法就要在子类方法中用到super.方法名(参数列表)。另有调用父类中被重写的构造方法时super语句要写在子类构造方法第一行。
代码演示:
public class Sub {String name="老子";public Sub(){System.out.println("老子:哈哈,我是老子,不信你去百度翻译查‘老子’怎么翻译");}public Sub(int i){System.out.println("老子:儿子,孙子在哪?");}Sub(String s){ System.out.println(s);} void f(){System.out.println("老子:小子,你调用的是老子的方法");}public static void main(String[] args) { Son1 s=new Son1();//如果父类只有有参的构造函数,即使子类有无参构造函数,这样写会报错。 Son1 s1=new Son1(1); s1.f(); System.out.println(s1.name);//子类变量覆盖了父类变量 Son1 s2=new Son1("儿子");//将默认调用父类无参构造函数}}class Son1 extends Sub{String name="儿子";Son1(){System.out.println("儿子:查了,老子是您“me”呀!");} Son1(int i){ super(i);//不写这句默认调用的是父类无参构造函数System.out.println("儿子:说的跟儿子你有媳妇似的!");} Son1(String s) { System.out.println(s); } void f(){//子类覆盖父类方法,不能缩小访问权限。System.out.println("儿子:我长大了,要用自己的方法");super.f();//调用父类的方法,可以不放在第一行} }
运行结果:
老子:哈哈,我是老子,不信你去百度翻译查‘老子’怎么翻译
儿子:查了,老子是您“me”呀!
老子:儿子,孙子在哪?
儿子:说的跟儿子你有媳妇似的!
儿子:我长大了,要用自己的方法
老子:小子,你调用的是老子的方法
儿子
老子:哈哈,我是老子,不信你去百度翻译查‘老子’怎么翻译
儿子
对于无参数的父类构造器,会被子类默认调用;
对于带参数的父类构造器,子类必须使用关键字super显示地调用,并配以适当的参数。
子类覆盖父类方法,可以修改方法作用域修饰符,但只能把方法的作用域放大。
父类只有有参数构造函数,子类在构造方法中必须要显示调用父类相应的构造函数,否则编译出错。
静态方法和实例方法不能相互隐藏。
有多层继承时首先根基类中的static初始化,然后是下一个导出类,以此类推,static初始化完成之后。然后实例变量和构造器从根基类到下一个导出类一步步初始化调用。
二、组合
在新类中产生现有类的对象,由于新类是由现有类的对象组成的,这种方法称之为组合。
注意区分组合和继承:
代码演示如下所示:
class Plate{Plate(int i){System.out.println("Plate constructor"+i);}}class DinnerPlate extends Plate{DinnerPlate(int i){super(i);System.out.println("DinnerPlate constructor"+i);}}class Utensil{Utensil(int i){System.out.println("Utensil constructor"+i);}}class Spoon extends Utensil{Spoon(int i){super(i);System.out.println("Spoon constructor"+i);}}class Fork extends Spoon{Fork(int i){super(i);System.out.println("Fork constructor"+i);}}class Knife extends Fork{Knife(int i){super(i);System.out.println("Knife constructor"+i);}}class Custom{Custom(int i){System.out.println("Custom constructor"+i);}}public class PlaceSetting extends Custom{private Spoon sp;//组合private Fork frk;//组合private DinnerPlate pl;//组合private Knife kn;public PlaceSetting(int i){super(i+1);//调用父类构造方法sp=new Spoon(i+2);frk=new Fork(i+3);//从根基类到派生类一步步调用构造函数kn=new Knife(i+4);//从根基类到派生类一步步调用构造函数pl=new DinnerPlate(i+5);System.out.println("PlaceSetting constructor"+i);}public static void main(String[] args) {PlaceSetting x=new PlaceSetting(9);}}
运行结果:
Custom constructor10
Utensil constructor11
Spoon constructor11
Utensil constructor12
Spoon constructor12
Fork constructor12
Utensil constructor13
Spoon constructor13
Fork constructor13
Knife constructor13
Plate constructor14
DinnerPlate constructor14
PlaceSetting constructor9
- 组合与继承 学习笔记
- java学习笔记<六>继承与组合
- java 继承与组合学习笔记
- java编程思想学习笔记:如何选择继承与组合
- Effecitve 阅读笔记--private继承与组合
- Java菜鸟学习笔记--面向对象篇(十四):继承与组合
- 论组合与继承
- 组合与继承
- 继承与组合
- 组合与继承
- 组合与继承
- 继承与组合
- 组合 继承 与 代理
- 组合与继承
- 组合与继承
- 继承与组合
- 继承(Virtual)与组合
- 继承与组合
- Android 自定义View基础-View的绘制
- 理解MVC,MVP和MVVM设计模式
- 215. Kth Largest Element in an Array
- Cookie/Session机制详解
- 一个自己写的PHP模板引擎
- 组合与继承 学习笔记
- 【Python学习日记】map/reduce
- Android MediaRecord视频录制
- 转:浅谈移动前端的最佳实践
- 打造自己的Android-Universal-Image-Loader
- 【优易销】YES租售系统(含分销)
- 中介者模式(Mediator)
- c语言学习笔记37之字符串
- ffmpeg播放器快进快退(七)