`
darrenzhu
  • 浏览: 806995 次
  • 性别: 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语言中的 覆盖重载和多态

    Java语言中的覆盖(Override)和重载(Overload)以及多态(Polymorphism)是面向对象编程的重要概念,它们是实现代码复用和灵活性的关键。 **多态性(Polymorphism)** 多态性是Java中一种允许一个接口有多种实现的方式。...

    北大青鸟javaOOP多态Ch03作业全集.rar

    5. 构造器的多态:虽然构造器不能被继承,但是子类可以通过super关键字调用父类的构造器,实现不同子类在初始化阶段的不同行为。 6. 接口与多态:接口是实现多态的一种重要手段,它定义了一组方法,任何实现该接口...

    JAVA进阶-Java继承,多态,重写,修饰符以及super与this使用,Oject对象

    在Java编程语言中,继承、多态、重写、修饰符以及`super`和`this`的使用是面向对象编程的核心概念。这些知识点对于理解和编写高效、可维护的代码至关重要。 1. **Java继承**: Java继承允许一个类(子类)继承另一...

    java学习资料-Java继承和多态

    这通常在子类构造函数的第一行完成,使用`super()`调用。 ### 多态 **1. 多态的定义** 多态(Polymorphism)意味着一个接口可以有多种不同的表现形式。在Java中,多态分为编译时多态和运行时多态。编译时多态主要...

    Java语言与面向对象程序设计第12讲(继承与多态)

    - **5.5.2 调用父类的构造函数**:子类可以通过`super`关键字调用父类的构造函数。如果子类没有显式调用父类构造函数,Java会默认调用父类的无参构造函数。如果父类没有无参构造函数,子类必须显式调用父类的构造...

    java关键字

    `this`关键字在方法中引用当前对象,而在构造函数中,`super`关键字用于调用父类的构造函数。 理解并熟练运用这些关键字是Java编程的基础,它们帮助我们实现各种设计模式,保证代码的可读性、可维护性和高效性。在...

    java程序设计-第5章-继承、多态、重载与接口

    子类构造器可以通过`super`关键字调用父类的构造函数,确保初始化过程正确进行。 6. **内部类与匿名类** 内部类是定义在另一个类内部的类,可以是静态的或非静态的。非静态内部类可以访问外部类的所有成员,包括...

    java---- 封装,接口,继承,覆盖,构造过程,多态,static、this、super、final用法

    通过以上对封装、继承、覆盖、构造过程、多态以及 `static`、`this`、`super` 和 `final` 关键字的详细介绍,我们可以更好地理解和运用Java的核心概念和技术点,从而编写出更加高效、灵活和易于维护的代码。

    继承多态重载与接口PPT学习教案.pptx

    总结,这个PPT学习教案涵盖了Java中关于继承、多态、覆盖、重载、构造函数重载、内部类与匿名类以及接口的基本概念和使用,这些都是Java面向对象编程的基础,对于理解Java编程模式和设计模式至关重要。通过学习这些...

    完整版Java全套入门培训课件 Java基础 04-继承上(共8页).pptx

    默认情况下,子类的所有构造函数都会隐式地调用父类无参数的构造函数,这是因为每个构造函数的第一行都有`super();`的默认语句。如果父类没有无参数的构造函数,子类的构造函数必须显式地通过`this`或`super`调用...

    Java语言基础入门教程 Java实训教程 6.继承与多态 共41页.pptx

    如果父类有多个构造函数,则可以通过`super`关键字显式指定调用哪个构造函数。 ##### 示例: ```java class BaseClass { BaseClass() { System.out.println("BaseClass Constructor"); } } class ChildClass ...

    Java新手指南方法覆盖Java开发Java经验技巧共14

    - `super()`用于子类构造函数中调用父类的无参构造函数,而`super.method()`则用来调用父类的特定方法。 5. **抽象类与接口中的方法覆盖**: - 抽象类中的抽象方法默认需要被子类覆盖,否则子类也必须是抽象的。 ...

    Kotlin基础教程之面向对象

    子类不会继承父类的构造函数,在子类中可以使用super关键字调用父类函数,使用override重写父类函数。 三、多态 多态是面向对象编程的一个重要概念,它允许对象具有多种形态。在Kotlin中,多态可以通过继承和重写...

    学习java的心得精华

    通过阅读《Java关键字this、super使用总结》和《深入理解java多态性》这两篇文章,你可以更深入地了解这两个关键字和多态的概念,并通过示例代码来巩固理解。这些资源通常会包含详细的解释、示例代码以及实践中的...

    Java的继承机制PPT教案学习.pptx

    它包括了类的继承、成员的访问控制、构造函数的处理、方法覆盖、final关键字的应用、this和super的关键字用法、接口的实现以及多态和对象类型转换等核心概念。理解和掌握这些知识点对于编写高效、可维护的Java代码至...

    第5章 继承和多态.ppt

    如果父类没有无参数构造函数,或者需要调用有参数的构造函数,那么必须在子类构造函数中使用`super`关键字显式调用,如: ```java class Base { Base(int i) {} } class Sub extends Base { Sub(int i) { super...

    徐葳《40小时掌握java语言之04继承》内部教材

    - 显式调用父类构造函数:可以使用`super(参数列表)`在子类构造函数中显式调用父类的构造函数。需要放在子类构造函数的第一行。 - 构造函数的重载和多态:与普通方法一样,构造函数也支持重载。在子类中重写父类方法...

    java4android的学习笔记

    14. **`super`关键字**:与`this`相反,`super`用于调用父类的成员,包括构造函数。 15. **对象转型**:向上转型是将子类对象赋值给父类引用,允许调用父类的公共和受保护成员。向下转型需先向上转型再转换,以访问...

    JAVA语言程序设计-第七章 类的封装、多态和继承

    **Java语言程序设计-第七章 类的封装、多态和继承** 在Java编程语言中,类的封装、多态和继承是面向对象编程的三大核心特性。这些概念为软件开发提供了强大的抽象能力和代码复用机制,使得程序设计更加灵活、高效。...

    267.265.JAVA基础教程_面向对象(中)-继承性练习1:基本操作(267).rar

    2. **构造函数**:子类可以调用父类的构造函数,通过`super()`关键字来初始化父类的状态。了解何时和如何使用`super`关键字是重要的。 3. **方法覆盖**(Override):子类可以重写父类的方法,提供不同的实现。这有...

Global site tag (gtag.js) - Google Analytics