`
darrenzhu
  • 浏览: 781353 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 多态,覆盖(override),super关键字,构造函数知识要点

    博客分类:
  • Java
阅读更多

1. 多态概念要点:
概念:
类重载(overload)方法,子类覆盖(override)父类的方法都是多态的体现.

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

作用:
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。


结论一:多态时,当子类覆盖了父类的方法,使用子类覆盖的方法
结论二:当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量


class SuperClass {
	int number;

	public SuperClass(int number) {
		this.number = number;
	}

	public int getNumber() {
		return ++number;
	}
}

class SubClass1 extends SuperClass {
	public SubClass1(int number) {
		super(number);
	}
}

class SubClass2 extends SuperClass {
	int number=200;
	public SubClass2(int number) {
		super(number);
	}
}

class SubClass3 extends SuperClass {
	int number=300;

	public SubClass3(int number) {
		super(number);
	}

	public int getNumber() {
		System.out.println("super number:"+super.getNumber());
		return ++number;
	}
}

class SubClass4 extends SuperClass{
	public SubClass4(int number){
		super(number);
	}
	
	public int getNumber() {
		System.out.println("super number:"+super.getNumber());
		return ++number;
	}
}

public class TestPolymorphsim {

	public static void main(String[] args) {
		SuperClass s1 = new SubClass1(100);
		SuperClass s2 = new SubClass2(100);
		SuperClass s3 = new SubClass3(100);
		SuperClass s4 = new SubClass4(100);
		System.out.println(s1.getNumber()+"\n");
		System.out.println(s2.getNumber()+"\n");
		System.out.println(s3.getNumber()+"\n");
		System.out.println(s4.getNumber());
	}
}



output:
101

101

super number:101
301


super number:102
102



2. super关键字使用要点:
结论一:构造函数里面通过super调用父类的构造函数的语句只能放置在第一行,否则编译报错.

结论二:如果子类里面有和父类同名的属性和方法(构造函数除外),则父类的同名属性和方法在子类中会被覆盖,子类里面可以通过super.propertyName和super.methodName的方式来访问父类中被覆盖的属性和方法,当然前提是父类的属性和方法不是private的,不过对于属性你可以说子类覆盖了父类的同名属性,也可以说子类没有覆盖,因为就算子类覆盖了属性,如果运行时的instance调用的是方法是继承自父类的,那么该方法访问的是父类的同名属性,不是子类的,子类的方法访问的是子类的属性,如上面的s3打印的是[super number:101,301].

结论三:子类里面的普通方法super.methodName的位置不需要是第一行,这跟构造函数不同.


3. 构造函数定义要点:
1)如果一个类没有定义任何构造函数,编译器默认会生成一个无参构造函数
2)如果一个类显示了定义的有参构造函数,那么编译器就不会生成无参构造函数,如果此时你需要无参构造函数,你得显示的定义一个无参构造函数
3)子类的构造函数是一定要调用父类的构造函数的,如果子类的构造函数中没写任何调用父类的构造函数的代码,那么其实隐含者子类会调用父类的无参构造函数,所以这个时候父类必须要有无参构造函数存在
4)父类如果没有定义任何构造函数,编译器默认会给父类生成一个无参构造函数,这种情况下,子类的构造函数没有任何约束,你可以不定义,也可以显示的定义
5)父类如果定义了有参构造函数,而没有显示定义无参构造函数的话,那么子类的构造函数中必然也要显示的调用父类的有参构造函数,子类中不能省略调父类构造函数的代码
分享到:
评论

相关推荐

    Java开发技术大全(500个源代码).

    示例描述:本章介绍开发Java的基础语法知识。 accumulationByDoWhile.java 用do~while语句写的累加程序 accumulationByFor.java 用for语句写的累加程序 accumulationByWhile.java 用while语句写的累加程序 ...

    AIC的Java课程1-6章

    希望大家喜欢 <br>如果大家觉得好我继续发 <br>课程定位 “Java程序”课程覆盖SCJP认证所要求的知识点,是J2EE课程体系中的基础课程。本课程面向的学员应该具有基本的编程概念,能够编写简单的程序,并学习...

    疯狂JAVA讲义

    3.2.3 Java关键字 47 3.3 数据类型分类 48 3.4 基本数据类型 48 3.4.1 整型 49 3.4.2 字符型 49 3.4.3 浮点型 51 3.4.4 布尔型 52 3.5 基本类型的类型转换 53 3.5.1 自动类型转换 53 3.5.2 强制类型转化 54...

    java 面试题 总结

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)...

    Java面试宝典2020修订版V1.0.1.doc

    42、一个静态方法,里面可不可以用this和super关键字 24 三、JavaScript/JQuery/Ajax部分 24 1、用js和jQuery怎么进行表单验证 24 3、列举javaScript的3种主要数据类型,2种复合数据类型和2种特殊数据类型。 24 4、...

    Java面试宝典-经典

    19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,...

    Java面试宝典2010版

    19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,...

    java面试题大全(2012版)

    19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,...

    最新Java面试宝典pdf版

    19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,...

    Java面试笔试资料大全

    19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,...

    java面试宝典2012

    19、构造器Constructor是否可被override? 16 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 16 21、写clone()方法时,...

    JAVA面试宝典2010

    19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,...

    Java面试宝典2012新版

    19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,...

    Java面试宝典2012版

    19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时...

    超级有影响力霸气的Java面试题大全文档

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。  接口(interface...

    Java 面试宝典

    19、构造器 Constructor 是否可被 override? ................................................................ 15 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继 承具体类...

Global site tag (gtag.js) - Google Analytics