Java多态性详解——父类引用子类对象

合集下载

java 父类方法

java 父类方法

Java 父类方法的使用场景和优势
Java 父类方法是一种在子类中重写或覆盖的方法,其目的是在
子类中提供一些额外的功能或行为,同时又允许子类根据自己的需要选择是否使用这些功能或行为。

在 Java 中,父类方法通常用于实现类的继承和多态性。

Java 父类方法的使用场景如下:
1. 实现类的继承:Java 中的类可以继承其他类,而父类方法可
以用来实现类的继承。

当一个子类继承了一个父类,子类就可以重写或覆盖父类方法,以实现自己独特的行为。

2. 实现多态性:Java 中的多态性指的是同一个方法可以在不同
参数类型和参数数量的情况下被调用。

父类方法可以用来实现多态性,从而让子类根据自己的需要选择是否使用这些方法。

3. 提供额外的功能或行为:Java 父类方法可以用来提供额外的
功能或行为,这些功能或行为可以在子类中重写或覆盖以满足不同的需求。

例如,一个类可以使用父类方法来实现文件读写操作,让子类可以选择是否实现这些操作。

Java 父类方法有很多优势。

首先,它实现了类的继承和多态性,让子类可以有自己的独特行为。

其次,它提供了额外的功能或行为,让子类可以根据需要选择是否实现这些功能或行为。

最后,父类方法可以减少代码的重复,让代码更加简洁和易于维护。

在 Java 中,父类方法是一种非常有用的技术,可以用来实现类的继承和多态性,并提供额外的功能或行为。

使用父类方法可以让代
码更加简洁和易于维护,同时也可以减少代码的重复。

Java基本概念:多态

Java基本概念:多态

Java基本概念:多态⼀、简介描述:多态性是⾯向对象编程中的⼀个重要特性,主要是⽤来实现动态联编的。

换句话说,就是程序的最终状态只有在执⾏过程中才被决定,⽽⾮在编译期间就决定了。

这对于⼤型系统来说能提⾼系统的灵活性和扩展性。

多态允许相同类域的不同对象对同⼀消息做出响应。

即同⼀消息可以根据发送对象的不同⽽采⽤多种不同的⾏为⽅式。

多态可以让我们不⽤关⼼某个对象到底是什么具体类型,就可以使⽤该对象的某些⽅法,从⽽实现更加灵活的编程,提⾼系统的可扩展性。

如果对象的编译时类型和运⾏时类型不⼀致,就会造成多态。

存在条件:1. 类之间有继承关系。

2. ⼦类重写⽗类⽅法。

3. ⽗类引⽤指向⼦类对象。

注意:多态是⽅法的多态,属性没有多态性。

⼀个对象的实际类型是确定的,但是可以指向这个对象的引⽤的类型,却是可以是这对象实际类型的任意⽗类型。

⼦类继承⽗类,调⽤⽅法,如果该⽅法在⼦类中没有重写,那么就是调⽤的是⼦类继承⽗类的⽅法,如果重写了,那么调⽤的就是重写之后的⽅法。

'protected'修饰的⽗类⽅法可以被⼦类见到,也可以被⼦类重写,但是它是⽆法被外部所引⽤的,所以没有多态性。

通过⼀个变量调⽤其引⽤的对象的⼀个⽅法,编译器是否能让其编译通过,主要是看该变量类型的类中有没有定义该⽅法,如果有则编译通过,如果没有则编译报错。

⽽不是看这个变量所引⽤的对象中有没有该⽅法。

Java中的⽅法调⽤,是运⾏时动态和对象绑定的,不到运⾏的时候,是不知道到底哪个⽅法被调⽤的。

编写程序时,如果想调⽤运⾏时类型的⽅法,只能进⾏类型转换,不然通不过编译器的检查。

但是如果两个没有关联的类进⾏强制转换,会报类型转换异常:ClassCastException。

⽰例:public class Test {public static void main(String[] args) {/* 编译看左,运⾏看右 */Student student = new Student();/* 变量person是可以指向Person类型或其⼦类型的对象,所以可以指向Student类型对象 */Person person = new Student();/* 变量student能调⽤的⽅法是Student类中有的⽅法(包括继承过来的) */student.say();//Student/* 变量person能调⽤的⽅法是Person类中有的⽅法 */person.say();//Student}}class Person {public void say() {System.out.println("Person");}}class Student extends Person {public void say() {System.out.println("Student");}}⼆、重写、重载、多态的关系1. 重载是编译时多态调⽤重载的⽅法,在编译期间就要确定调⽤的⽅法是谁,如果不能确定则编译报错。

面试小问题——什么是多态?

面试小问题——什么是多态?

⾯试⼩问题——什么是多态?
在Java⾯试中,多态是⼀个被问到的频率很⾼的⼀个概念。

多态整理如下:
⼀、什么是多态?
概念:同⼀操作作⽤于不同的对象,可以有不同的解释,产⽣不同的执⾏结果,这就是多态性。

简单的说:就是⽤基类的引⽤指向⼦类的对象。

⽐如有⼀个⽗类superClass,它有2个⼦类subClass1,subClass2。

superClass有⼀个⽅法 func(),两个⼦类都重写了这个⽅法。

那么我们可以定义⼀个superClass的引⽤obj,让它指向⼀个⼦类的对象,⽐如superClass obj = new subClass1();那么我们调⽤obj.func()⽅法时候,会进⾏动态绑定,也就是obj它的实际类型的func()⽅法,即subClass1的func()⽅法。

同样你写superClass obj = new
subClass2();obj.func()其实调⽤的是subClass2的func()⽅法。

这种由于⼦类重写⽗类⽅法,然后⽤⽗类引⽤指向⼦类对象,调⽤⽅法时候会进⾏动态绑定,这就是多态。

多态对程序的扩展具有⾮常⼤的作⽤,⽐如你要再有⼀个subClass3,你需要改动的东西会少很多。

⼆、多态有什么好处?
⼆、多态有什么好处?
1. 应⽤程序不必为每⼀个派⽣类编写功能调⽤,只需要对抽象基类进⾏处理即可。

⼤⼤提⾼程序的可复⽤性。

//继承
2. 派⽣类的功能可以被基类的⽅法或引⽤变量所调⽤,这叫向后兼容,可以提⾼可扩充性和可维护性。

//多态的真正作⽤。

在JAVA中有两种多态指的是什么

在JAVA中有两种多态指的是什么
在JAVA中有两种多态指的是什么??

同问 在JAVA中有两种多态指的是什么 2009-01-15 14:32 提问者: mdydyy |浏览次数:2218次
我来帮他解答
精彩回答
2009-01-15 15:11在JAVA中有两种多态是指:运行时多态和编译时多态。关于类的多态性简介如下: 多态(polymorphism)意为一个名字可具有多种语义.在程序设计语言中,多态性是指”一种定义,多种实现”.例如,运算符+有多种含义,究竟执行哪种运算取决于参加运算的操作数类型: 1+2 //加法运算符 “1” + “2” //字符串连接运算,操作数是字符串 多态性是面向对象的核心特征之一,类的多态性提供类中成员设计的灵活性和方法执行的多样性. 1、类多态性表现 (1)方法重载 重载表现为同一个类中方法的多态性.一个类生命多个重载方法就是为一种功能提供多种实现.编译时,根据方法实际参数的数据类型\个数和次序,决定究竟应该执行重载方法中的哪一个. (2)子类重定义从父类继承来的成员 当子类从父类继承来的成员不适合子类时,子类不能删除它们,但可以重定义它们,使弗雷成员适应子类的新需求.子类重定义父类成员,同名成员在父类与子类之间表现出多态性,父类对象引用父类成员,子类对象引用子类成员,不会产生冲突和混乱. 子类可重定义父类的同名成员变量,称子类隐藏父类成员变量.子类也可以重定义父类的同名成员方法,当子类方法的参数列表与父类方法参数列表完全相同时,称为子类方法覆盖(override)父类方法。覆盖父类方法时,子类方法的访问权限不能小于父类方法的权限。 由于Object类的equals()方法比较两个对象的引用是否相等而不是值是否相等,因此一个类要覆盖Object类的equals()方法,提供本类两个对象比较相等方法. 覆盖表现为父类与子类之间方法的多态性.java 寻找执行方法的原则是:从对象所属的类开始,寻找匹配的方法执行,如果当前类中没有匹配的方法,则逐层向上依次在父类或祖先类中寻找匹配方法,直到Object类. 2、super 引用 在子类的成员方法中,可以使用代词super引用父类成员.super引用的语法如下: super([参数列表]) //在子类的构造方法体中,调用父类的构造方法 super.成员变量 //当子类隐藏父类成员变量时,引用父类同名成员变量 super.成员方法([参数列表]) //当子类覆盖父类成员方法时,调用父类同名成员方法 *注意:super引用没有单独使用的语法 3、多态性有两种: 1)编译时多态性 对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性. 2)运行时多态性 如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态性. 方法覆盖表现出两种多态性,当对象获得本类实例时,为编译时多态性,否则为运行时多态性,例如: XXXX x1 = new XXXX(参数列表); //对象获得本类实例,对象与其引用的实例类型一致 XXX xx1 = new XXX(参数列表); x1.toString(); //编译时多态性,执行XXX类的方法. xx1.toString(); //编译时多态性,执行XXXX类覆盖的方法. XXXX为XXX的父类. 由于子类对象既是父类对象,父类对象与子类对象之间具有赋值相容性,父类对象能够被赋值为子类对象.例如, XXXX x2 = new XXX(参数列表); //父类对象获得子类实例,子类对象即是父类对象 x2.toString(); //运行时多态 x2声明为父类对象却获得子类XXX的实例,那么x2.toString()究竟执行父类方法还是执行子类覆盖的方法呢? 这分为两种情况: 取决于子类是否覆盖父类方法.如果子类覆盖父类方法,则执行子类方法; 如果没有覆盖,则执行父类方法. 在编译时,仅仅依据对象所属的类,系统无法确定到底应该执行那个类的方法,只有运行时才能确定,因此这是运行时多态. 父类对象并不能执行所有的子类方法,只能执行那些父类中声明\子类覆盖的子类方法.

中科软java面试题答案

中科软java面试题答案

中科软java面试题答案1. 什么是Java中的接口(Interface)?请简要阐述接口的定义和作用。

接口是Java中一种特殊的引用类型,它是一组方法声明的集合,这些方法可以被其他类实现。

接口通过定义一组操作来提供一种行为契约,使用接口可以实现类之间的松耦合关系。

在Java中,接口可以理解为对行为的一种抽象,允许程序员定义一个模板,规定了实现该接口的类必须具备的行为。

接口可以被多个类实现,一个类也可以同时实现多个接口。

通过实现接口,类不仅可以继承父类的属性和方法,还可以实现接口的方法,从而实现多重继承。

接口的主要作用包括:- 定义标准规范:接口定义了一组方法的签名(方法名、参数列表和返回类型),类在实现接口时必须遵守这些规范。

- 实现多态性:通过接口可以实现同一个接口的不同实现类之间的替换使用,增加了程序的灵活性和可扩展性。

- 提供统一的方法访问入口:通过接口可以将一组相关的方法进行分组,对外提供统一的访问入口,方便其他类进行调用。

2. 请简要介绍Java中的四种访问修饰符,包括其作用和可访问性。

在Java中,共有四种访问修饰符,分别是:public、protected、default和private。

- public:具有最高的访问级别,可以被任何类访问。

被public修饰的成员变量、方法或类可以在任何地方被访问到。

- protected:具有较高的访问级别,可以被同一包内的其他类或不同包中的子类访问。

被protected修饰的成员变量、方法或类可以在同一包中的其他类以及不同包中的子类被访问到。

- default:没有修饰符时,即默认访问修饰符。

可以被同一包内的其他类访问,但不能被不同包中的类访问。

被default修饰的成员变量、方法或类在同一包内可见。

- private:具有最低的访问级别,只能被所属类访问,其他类无法访问。

被private修饰的成员变量、方法或类只能在所属类内部访问。

访问修饰符的使用可以控制类、成员变量和方法的可见性,从而实现对外的封装性和内部的隐私保护。

JAVA多态性 ppt课件

JAVA多态性  ppt课件

a.fun1();
// 此方法被子类覆写过
}
}
PPT课件
6
对象的向下转型
class A{ public void fun1(){
// 定义类A // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
} public void fun2(){
PPT课件
5
对象的向上转型
class A{ public void fun1(){
// 定义类A // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
} public void fun2(){
// 定义fun2()方法
this.fun1() ;
A a = new B() ;
// 发生了向上转型的关系,子类 --> 父类
B b = (B)a ;
// 此时发生了向下转型关系
b.fun1() ;
// 调用方法被覆写的方法
b.fun2() ;
// 调用父类的方法
b.fun3() ;
// 调用子类自己定义的方法
}
}
PPT课件
7
多态禁忌
•千万不要出现这样的操作:就是将父类对象转换成为子类是类型 – Animal a=new Animal(); – Dog d4=(Dog)a;//类造型异常
}
}; class B extends A{
public void fun1(){
// 子类通过extends继承父类 // 覆写父类中的fun1()方法

父类实现调用子类的方法

父类实现调用子类的方法

父类实现调用子类的方法在面向对象编程中,父类和子类之间的关系是一种继承关系。

父类是子类的直接上级,子类继承了父类的属性和方法,同时可以在子类中增加新的属性和方法。

如果要在父类中调用子类的方法,可以通过动态绑定和重写的方式实现。

动态绑定是指在编程过程中,根据对象的实际类型来确定调用的方法。

在面向对象的语言中,每个对象都有一个唯一的运行时类型,这个类型决定了对象的方法和属性。

在父类中,可以使用多态的特性,将父类的引用指向子类的对象,然后调用子类的方法。

具体实现如下:```javaclass Parentvoid callChildMethod(Child child)child.method(;}class Child extends Parentvoid methoSystem.out.println("This is the child method.");}public class Mainpublic static void main(String[] args)Parent parent = new Parent(;Child child = new Child(;parent.callChildMethod(child); // Output: This is the child method.}```在上述代码中,父类`Parent`中定义了一个`callChildMethod`方法,该方法的参数是一个`Child`类型的对象。

在`callChildMethod`方法中,调用了`child.method(`来调用子类`Child`的`method`方法。

另外一种实现方式是通过重写的方式,在子类中重写一个与父类相同的方法,然后在子类中实现这个方法。

然后在父类中调用该方法。

具体实现如下:```javaclass Parentvoid methoSystem.out.println("This is the parent method.");}void callChildMethomethod(; // 调用子类的method方法}class Child extends Parentvoid methoSystem.out.println("This is the child method.");}public class Mainpublic static void main(String[] args)Parent parent = new Parent(;Child child = new Child(;parent.callChildMethod(; // Output: This is the parent method.child.callChildMethod(; // Output: This is the child method.}```在实际的应用中,父类调用子类的方法可以用于实现一些具体的功能,然后在子类中进行定制化实现。

父类调用子类重写的方法

父类调用子类重写的方法

父类调用子类重写的方法在面向对象程序设计中,父类和子类之间存在一种继承关系。

父类定义了一些基本的属性和方法,而子类继承了父类的属性和方法,并且可以根据需要进行重写或扩展。

当父类调用子类重写的方法时,实际上是在调用子类中重写的方法。

在实际的开发中,父类调用子类重写的方法有多种应用场景。

下面以一个具体的例子来解释。

假设有一个父类Animal,其中包含了一个eat(方法,用来表示动物进食的行为。

现在需要创建一个子类Dog,继承自Animal,并且重写eat(方法,表示狗吃骨头的行为。

代码如下所示:```class Animalpublic void eaSystem.out.println("动物进食");}class Dog extends Animalpublic void eaSystem.out.println("狗吃骨头");}```在上面的代码中,Animal类定义了一个eat(方法,并且提供了一个默认的实现,输出"动物进食"。

Dog类继承了Animal类,并且重写了eat(方法,输出"狗吃骨头"。

接下来,我们可以创建一个Animal引用,指向Dog对象,并且调用eat(方法。

代码如下所示:```Animal animal = new Dog(;animal.eat(;```在上面的代码中,我们创建了一个Animal引用animal,指向Dog对象。

由于多态的特性,animal的编译时类型是Animal,运行时类型是Dog。

当调用animal.eat(方法时,实际上调用的是Dog类中重写的eat(方法。

运行上面的代码,输出结果为"狗吃骨头",这说明父类调用了子类重写的eat(方法。

通过这个例子,可以看出父类调用子类重写的方法的实际应用价值。

通过父类引用指向子类对象,可以实现代码的灵活性和可扩展性。

Java的动态多态性

Java的动态多态性

angle 类和Trigle 类的对象给t 、 赋值, r 利
4 结语
多态性提高了程序的抽象程度和简洁 性,降低 了 类和程序模块之间的祸合性,提 高了类模块之间的封闭性。实现了 “ 一个接 口,多个 方法” 。
参考文献 【 朱喜福, ] 1 编著. J va 程序设计, a 清华大学出 版社 .
盛. 娜井
昊金秀
(黄冈职业技术学院
湖北黄冈
435002 )
摘 要: 运行时多 态性是面向 对象程序设计代码重用的一个最强 大机制,动态性的 概念也可以被说成 “ 接口 一个 ,多个方 。 av a 法” J
实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译时动态绑定的机制。 关键词: 覆盖 多态性 动态多 态性 上溯造型 中图分类号: T P 3 文献标识码: A 文章编号: 1672一 3791(2007)07(b卜0246一 01 面向对象的程序设计有三大特点: 封装, 继承和多态。多态提供了另一个层面的接口 与实现分离,也就是说把做什么和怎么做分 离开来。多态性是一项很重要的技术。 个对象在调用与其子类同名成员函数 ( 函数 原型一致) 时,调用规则是依据对象在实例 化时而非定义时的类型相应地调用对应类中 的同名成员函数,是在程序执行的过程中根 据不同对象类型有不同的绑定。 2 上述代码中Rect angle 类和T rigle 类都是 Sha pe 类的子类, 程序中定义了Shape 类的 两个引用对象t 和r , 分别通过创 建子类Re 一 t c
住砚. .
(目加 翻 州翻,
使用单排深层搅拌桩作防水帷幕时必须设反 循环观测井。 ④有邻近建筑物的基坑支护桩配筋宜用 双面配筋 ,以备加内撑时使用。 ⑤桩顶的圈梁作用重大,起调节跨中与 附近桩内力的作用,应予重视。

java的封装,继承和多态(思维导图)

java的封装,继承和多态(思维导图)

java的封装,继承和多态类和对象类类声明 { 成员变量的声明; 成员方法的声明及实现; }声明类:[修饰符] class 类<泛型> [extends 父类] [implements 接口列表]声明成员变量:[修饰符]数据类型 变量[=表达式]{,变量[=表达式]}成员方法声明:[修饰符]返回值类型 方法([形式参数列表])[throws 异常类列表]{语句序列;[return[返回值]]; }重载:一个类中可以有多个同名的成员方法,前提是参数列表不同,称为类的成员方法重载,重载的多个方法为一种功能提供多种实现。

重载方法之间必须以不同的参数列表(数据类型、参数个数、参数次序)来区别。

例如,MyDate 类可声明多个重载的set()方法如下: void set(int y,int m, int d)void set(int m, int d) //重载方法,参数个数不同void set(int d) void set(MyDate date)//重载方法,参数的数据类型不同对象对象声明:类 对象构造实例:对象 = new 类的构造方法([实际参数列表])引用对象的成员变量和调用成员方法:对象.成员变量 对象.成员方法([实际参数列表])类的封装性构造与析构类的构造方法用于创建类的一个实例并对实例的成员变量进行初始化一个类可声明多个构造方法对成员变量进行不同需求的初始化,构造方法不需要写返回值类型,因为它返回的就是该类的一个实例。

例:MyDate类声明以下构造方法:public MyDate(int year, int month, int day)// 声明构造方法,方法名同类名,初始化成员变量 {set(year, month day);// 调用 set()方法,为成员变量赋值}使用new运算符调用指定类的构造方法,实际参数列表必须符合构造方法声明。

例如:MyDate d1 = new MyDate(2017,10,1);//创建实例并初始化成员变量当一个类没有声明构造方法时,Java 自动为该类提供一个无参数的默认构造方法对象的引用与运算this引用访问本类的成员变量和成员方法:this.成员变量,this.成员方法([实际参数列表])调用本类重载的构造方法:this([实际参数列表])访问控制类的访问控制权限公有和(public)和缺省类中成员4级访问控制权限及范围声明set()和get()方法存取对象的属性例:public void set(int year, int month, int day) //设置日期值 public void set(MyDate date)//设置日期值,重载 public int getYear()//获得年份 public int getMonth()// 获得月份 public int getDay()//获得当月日期静态成员定义及访问格式使用关键字static声明的成员称为静态成员在类内部,可直接访问静态成员,省略类名。

Java题库——Chapter11继承和多态

Java题库——Chapter11继承和多态

Java题库——Chapter11继承和多态1)Analyze the following code:public class Test {public static void main(String[ ] args) {B b = new B();b.m(5);System.out.println("i is " + b.i);}}class A {int i;public void m(int i) {this.i = i;}}class B extends A {public void m(String s) {}}A)The program has a compilation error, because m is overridden with a different signature in B.B)The method m is not overridden in B. B inherits the method m from A and defines an overloaded method m in B.C)The program has a runtime error on b.i, because i is not accessible from b.D)The program has a compilation error, because b.m(5) cannot be invoked since the method m(int) is hidden in B. B中没有重写⽅法m。

B继承了A中的⽅法m,并在B中定义了⼀个重载的⽅法m。

2)Analyze the following code.// Program 1public class Test {public static void main(String[ ] args) {Object a1 = new A();Object a2 = new A();System.out.println(((A)a1).equals((A)a2));}}class A {int x;public boolean equals(A a) {return this.x == a.x;}}// Program 2public class Test {public static void main(String[ ] args) {A a1 = new A();A a2 = new A();System.out.println(a1.equals(a2));}}class A {int x;public boolean equals(A a) {return this.x == a.x;}}A)Program 1 displays true and Program 2 displays trueB)Program 1 displays false and Program 2 displays trueC)Program 1 displays false and Program 2 displays falseD)Program 1 displays true and Program 2 displays false3)Invoking ________ removes all elements in an ArrayList x. 3) _______A)x.clear() B)x.delete() C)x.remove() D)x.empty() E)x.clean()4)Analyze the following code:Cylinder cy = new Cylinder(1, 1);Circle c = cy; 4) _______A)The code has a runtime error. B)The code has a compile error. C)The code is fine.5)Which of the following statements are true? (Choose all that apply.) 5) _______A)Overloading a method is to provide more than one method with the same name but with different signatures to distinguish them.B)A private method cannot be overridden. If a method defined in a subclass is private in its superclass, the two methods are completely unrelated.C)It is a compilation error if two methods differ only in return type in the same class.D)A static method cannot be overridden. If a static method defined in the superclass is redefined in a subclass, the method defined in the superclass is hidden.E)To override a method, the method must be defined in the subclass using the same signature and compatible return type as in its superclass.1、重载⼀个⽅法是提供多个具有相同名称但具有不同签名的⽅法来区分它们。

Java面向对象的三大特征

Java面向对象的三大特征

public class Demo2 {
public int num;
public Demo2(){ this(1);
}
// this关键字调用类中的其他构造函数
public Demo2(int a){
this.fun();
// this关键字调用类中的其他方法
System.out.println(a);
}
在子类中重写:
public class Son extends Father { /** * 一个跟父类方法一样的方法 */ public void say(){ System.out.println("我会说英语"); } public static void main(String[] args) { Son son = new Son(); son.say(); }
/** * 父类中的成员方法 */ public void say(){
System.out.println("我会说话"); }
public void eat(){ System.out.println("我会吃饭");
} }
2)、编写子类,继承父类
a.子类继承父类时只能继承一个父类
b.继承的关键字 extends
}
二、继承
1、继承的概念和特点
概念:
继承是Java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或类从父 类继承方法,使得子类具有父类相同 的行为。
特点:
继承鼓励类的重用 继承可以多层继承 一个类只能继承一个父类 父类中private修饰的不能被继承 构造方法不能被继承

Java程序设计——05面向对象核心机制

Java程序设计——05面向对象核心机制

赵志崑
继承
• 继承提供了创建新类的一种方法,本质特征是行为共 享。继承对开发者来说就是代码共享与重用。
– 通过继承创建的子类是作为另一个类的扩充或修正所定义的 一个类。 – 子类从超类(父类)中继承所有方法和变量。 – 子类和超类之间是特化与范化的关系。
自行车 (超类)
子类
山地车
赛车
双座自行车
赵志崑
赵志崑
多态
• 继承机制引出多态机制 • 某一类型的引用变量可能是指向该类或者其子类的对象。 • 由于Java中Object类是所有类的祖先,所以可以用Object 类型的引用指向所有类型的对象。
class Car { int colorNumber; int doorNumber; int speed; void pushBreak() { … } void addOil() { … } } class TrashCar extends Car { double amount; fill_trash() { … } } Car myCar = new TrashCar();
• 如果一个构造函数既没有调用super(…)也没有调用this(…),编译器 自动插入一个对父类构造函数的调用,而且不带参数,super() 。
– 上例中,若去掉红色的super语句,编译将报错。
赵志崑
构造函数定义错误举例
• 下面的类声明会产生编译错误,
class GeometricObject{ private String name; public GeometricObject(String aName){name = aName;}; } class Ellipse extends GeometricObject{ }

java中子类重写父类的方法

java中子类重写父类的方法

Java中子类重写父类的方法在Java中,子类可以重写(override)父类的方法。

方法重写是面向对象编程的一个重要概念,它允许子类根据自己的需要重新实现继承自父类的方法。

本文将详细介绍Java中子类重写父类方法的概念、语法和使用场景。

1. 方法重写的概念方法重写是指子类定义一个与父类具有相同名称、参数列表和返回类型的方法,并且在子类中提供新的实现逻辑。

通过方法重写,子类可以覆盖掉从父类继承而来的方法实现,以满足自己特有的需求。

方法重写是实现多态性(polymorphism)的一种方式。

多态性指同一个方法可以在不同的对象上产生不同的行为。

通过方法重写,我们可以在父类引用指向子类对象时,根据实际对象类型调用相应的方法。

2. 方法重写的语法在Java中,要实现方法重写,需要遵循以下语法规则:访问修饰符返回类型方法名(参数列表) throws异常 {// 子类自定义的逻辑}•访问修饰符:与父类中被重写方法的访问修饰符相同或更宽松。

常用的访问修饰符有public、protected和默认(package-private)。

•返回类型:与父类中被重写方法的返回类型相同或是其子类。

•方法名:与父类中被重写方法的方法名相同。

•参数列表:与父类中被重写方法的参数列表相同。

•throws 异常:与父类中被重写方法声明的异常列表相同或是其子集,如果子类抛出了比父类更大范围的异常,编译时会报错。

3. 方法重写的注意事项在进行方法重写时,需要注意以下几点:3.1 方法签名必须一致方法签名由方法名称、参数列表和返回类型组成。

子类重写父类方法时,必须保证方法签名一致,否则编译器将无法识别该方法为重写而是新定义的方法。

3.2 访问修饰符不能更严格在进行方法重写时,子类不能使用比父类更严格的访问修饰符。

如果父类中的方法使用了protected访问修饰符,则子类中重写该方法时只能使用protected或public访问修饰符。

Java中封装、继承、多态的理解

Java中封装、继承、多态的理解

Java中封装、继承、多态的理解Java中的继承、封装、多态继承的理解:1、继承是⾯向对象的三⼤特征之⼀,也是实现代码复⽤的重要⼿段。

Java的继承具有单继承的特点,每个⼦类只有⼀个直接⽗类。

2、Java的继承通过extends关键字来实现,实现继承的类被称为⼦类,被继承的类称为⽗类(有的也称其为基类、超类),⽗类和⼦类的关系,是⼀种⼀般和特殊的关系。

就像是⽔果和苹果的关系,苹果继承了⽔果,苹果是⽔果的⼦类,⽔果是苹果的⽗类,则苹果是⼀种特殊的⽔果。

3、Java使⽤extends作为继承的关键字,extends关键字在英⽂是扩展的意思,⽽不是继承。

为什么国内把extends翻译成继承呢?除了与历史原因有关外,把extends翻译成为继承也是有其道理的:⼦类扩展⽗类,将可以获得⽗类的全部属性和⽅法,这与汉语中得继承(⼦辈从⽗辈那⾥获得⼀笔财富成为继承)具有很好的类似性。

值得指出的是:Java的⼦类不能获得⽗类的构造器。

4、实例:class BaseClass{public double weight;public void info() {System.out.println("我的体重是"+weight+"千克");}}public class ExtendsDemo001 extends BaseClass {public static void main(String[] args) {//创建ExtendsDemo001对象ExtendsDemo001 ed = new ExtendsDemo001();//ExtendsDemo001本⾝没有weight属性,但是ExtendsDemo001的⽗类有weight属性,也可以访问ExtendsDemo001对象的属性ed.weight = 56;//调⽤ExtendsDemo001对象的info()⽅法();}}打印结果为:我的体重是56.0千克5、Java类只能有⼀个⽗类。

Java面向对象详解

Java面向对象详解

Java面向对象详解前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学过的基础知识的想法。

一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵懵懂懂,后来实践的多了,有些东西才慢慢清楚;二是经过一定的实践之后,反过头来再去学习一些基础东西才能够理解的更透彻;三是有些东西基础但是确很重要,是值得好好搞一搞的。

1、面向对象面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。

从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。

2、对象对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。

一个对象由一组属性和对这组属性进行操作的一组服务组成。

类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。

当不存在对一个对象的引用时,该对象成为一个无用对象。

Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。

当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。

3、类类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。

在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。

Java中的类实现包括两个部分:类声明和类体。

类声明[public][abstract|final] class className [extends superclassName] [implementsinterfaceNameList]{……}其中,修饰符public,abstract,final 说明了类的属性,className为类名,superclassName为类的父类的名字,interfaceNameList为类所实现的接口列表。

Java中this和super的用法详解

Java中this和super的用法详解

Java中this和super的⽤法详解前⾔这次我们来回顾⼀下this和super这两个关键字的⽤法,作为⼀名Java程序员,我觉得基础是最重要的,因为它决定了我们的上限,所以我的⽂章⼤部分还是以分享Java基础知识为主,学好基础,后⾯的知识我想学起来就变得简单。

废话不多说,进⼊正⽂。

thisthis 关键字只能在⽅法内部使⽤,表⽰对调⽤⽅法的那个对象的引⽤。

其实简单来说 this 关键字就是表⽰当前对象,下⾯我们来具体介绍 this 关键字在Java中的⽤法。

1、调⽤成员变量在⼀个类的⽅法内部,如果我们想调⽤其成员变量,不⽤ this,我们会怎么做?public class ThisTest {private String name = "xiaoming";public String getName() {return name;}public void setName(String name) {name = name;}}看上⾯的代码,我们在ThisTest类中创建了⼀个name属性,然后创建了⼀个setName⽅法,注意这个⽅法的形参也是String name,那么我们通过name = name这样赋值,会改变成员变量name的属性吗?public static void main(String[] args) {ThisTest thisTest = new ThisTest();thisTest.setName("xiaoma");System.out.println(thisTest.getName());}打印结果是xiaoming,⽽不是我们重新设置的xiaoma,显然这种⽅式是不能在⽅法内部调⽤到成员变量的。

因为形参的名字和成员变量的名字相同,setName⽅法内部的name = name,根据最近原则,编译器默认是将这两个name属性都解析为形参name,从⽽导致我们设值操作和成员变量name完全没有关系,当然设置不了。

java 父类调用子类方法

java 父类调用子类方法

Java父类调用子类方法一、概述在Java中,父类可以调用子类的方法,这是面向对象编程中的一个重要特性。

通过这种方式,我们可以实现多态性,提高代码的复用性和灵活性。

二、继承关系在Java中,子类可以继承父类的属性和方法。

通过使用extends关键字,子类可以继承父类的所有非私有成员。

继承关系可以形成一个层次结构,父类可以有多个子类,而子类也可以有自己的子类。

三、方法重写方法重写是指子类可以重新定义父类中已有的方法。

子类可以根据自己的需要,重新实现父类中的方法。

当父类的引用指向子类的对象时,调用该方法时将执行子类中的实现。

3.1 重写规则•方法名、参数列表和返回类型必须与父类中被重写的方法一致。

•子类中重写的方法不能比父类中被重写的方法访问性更严格。

例如,如果父类中的方法是public的,那么子类中的方法也必须是public的。

•子类中重写的方法不能抛出比父类中被重写的方法更多的异常,可以不抛出异常或者抛出父类方法中声明的异常。

•子类中的方法不能使用final、static和private修饰符,因为这些修饰符都不能被继承。

3.2 示例代码下面是一个简单的示例代码,演示了方法重写的使用:class Animal {public void sound() {System.out.println("动物发出声音");}}class Cat extends Animal {@Overridepublic void sound() {System.out.println("猫发出“喵喵”声");}}public class Main {public static void main(String[] args) {Animal animal = new Cat();animal.sound();}}输出结果为:猫发出“喵喵”声四、父类调用子类方法在Java中,父类可以通过使用super关键字来调用子类的方法。

java封装继承多态选择题附加答案解析

java封装继承多态选择题附加答案解析

java封装继承多态选择题附加答案解析1. 封装的主要目的是:A. 增加代码的长度B. 隐藏实现细节C. 使所有方法都公有D. 提高程序运行速度答案: B。

解析:封装是面向对象编程的重要原则,通过将数据和方法封装在类中,隐藏内部实现细节,提高代码的可维护性和安全性。

2. 在以下选项中,哪一种方法用于实现封装?A. 使用`public`关键字定义所有成员B. 使用`private`关键字隐藏类的实现细节C. 使用`static`关键字定义所有成员D. 使用`final`关键字定义所有成员答案: B。

解析:封装是通过使用`private`关键字将类的实现细节隐藏起来,并提供公共的访问方法(getter和setter)来访问这些私有成员。

3. 在Java中,如果类B继承自类A,则下列哪个选项是正确的?A. 类B是类A的超类B. 类A是类B的子类C. 类A是类B的超类D. 类B不能有自己的方法答案: C。

解析:类A是类B的超类,类B是类A的子类。

子类可以有自己的方法和属性。

4. 在以下哪个情况下,一个方法被认为是重写了另一个方法?A. 当方法具有相同的名称但不同的参数列表时B. 当方法在子类中重新实现且具有相同的名称、返回类型和参数列表时C. 当方法在同一个类中被定义了两次时D. 当方法在类中没有定义时答案: B。

解析:方法重写发生在子类中,要求被重写的方法在子类中具有相同的方法名、返回类型和参数列表。

5. 在以下访问修饰符中,哪个是最具限制性的?A. publicB. protectedC. default(无修饰符)D. private答案: D。

解析:`private`是最具限制性的访问修饰符,只有在同一个类中可以访问。

6. 以下哪个场景中体现了多态性?A. 一个方法有多个重载版本B. 一个类有多个构造方法C. 一个子类可以使用父类的属性和方法D. 父类的引用指向子类的对象答案: D。

解析:多态性允许父类的引用指向子类的对象,实际调用的方法取决于对象的运行时类型。

父类调用子类的方法

父类调用子类的方法

父类调用子类的方法当父类调用子类的方法时,需要注意以下几点:1. 继承关系:父类和子类必须存在继承关系,才能够调用子类的方法。

子类继承了父类的属性和方法,并且可以添加自己的属性和方法。

2. 重写方法:如果子类中存在和父类同名的方法,那么子类的方法会覆盖父类的方法,此时调用子类的方法会执行子类中的代码。

这种情况下,可以通过super 关键字调用父类的方法。

3. 多态机制:父类调用子类方法的基础是多态机制。

多态可以通过父类的引用指向子类的对象,从而实现调用子类中的方法。

这种情况下,方法的具体实现取决于子类的实现。

当父类调用子类的方法时,首先需要确保父类和子类之间存在继承关系。

在父类中调用子类的方法有多种方式:1. 直接调用:如果子类覆盖了父类的方法,可以通过直接调用子类的方法来执行子类的代码。

例如,定义一个Animal类,其中有一个eat()方法,然后定义一个子类Dog,覆盖父类的eat()方法,并进行自己的实现。

当我们创建一个Dog对象时,可以直接调用eat()方法,它将执行子类Dog中的代码。

2. 使用super关键字:如果子类覆盖了父类的方法,可以使用super关键字调用父类的方法。

例如,在子类Dog中,可以使用super.eat()语句调用父类Animal 的eat()方法。

这样可以在子类中执行父类的方法,并在其基础上添加一些子类特有的操作。

3. 多态调用:通过父类的引用指向子类的实例,可以调用子类中的方法。

例如,在一个方法中,我们可以将Animal类的引用指向Dog对象的实例,然后调用eat()方法,它将执行Dog类中的eat()方法代码。

这是多态的一种体现,方法的具体实现取决于调用方法时的对象类型。

父类调用子类的方法可以有效地实现代码的重用和扩展。

通过继承和多态的机制,我们可以在父类中定义一些通用的行为,然后在子类中根据具体需求进行扩展和实现。

这样可以提高代码的可维护性和可扩展性。

总而言之,父类调用子类的方法是面向对象编程中的一个重要特性,通过继承和多态的机制实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面向对象编程有三个特征,即封装、继承和多态。

封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。

继承是为了重用父类代码,同时为实现多态性作准备。

那么什么是多态呢?方法的重写、重载与动态连接构成多态性。

Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。

这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。

同时,多态也是面向对象编程的精髓所在。

要理解多态性,首先要知道什么是“向上转型”。

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。

我可以通过Cat c = new Cat();实例化一个Cat的对象,这个不难理解。

但当我这样定义时:Animal a = new Cat();这代表什么意思呢?很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。

由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。

那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

看下面这段程序:class Father{public void func1(){func2();}//这是父类中的func2()方法,因为下面的子类中重写了该方法//所以在父类类型的引用中调用时,这个方法将不再有效//取而代之的是将调用子类中重写的func2()方法public void func2(){System.out.println("AAA");}}class Child extends Father{//func1(int i)是对func1()方法的一个重载//由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用//所以在下面的main方法中child.func1(68)是不对的public void func1(int i){System.out.println("BBB");}//func2()重写了父类Father中的func2()方法//如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法public void func2(){System.out.println("CCC");}}public class PolymorphismTest {public static void main(String[] args) {Father child = new Child();child.func1();//打印结果将会是什么?}}上面的程序是个很典型的多态的例子。

子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。

重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。

而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。

那么该程序将会打印出什么样的结果呢?很显然,应该是“CCC”。

对于多态,可以总结它为:一、使用父类类型的引用指向子类的对象;二、该引用只能调用父类中定义的方法和变量;三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

********************************************************************* 多态详解(整理)2008-09-03 19:29多态是通过:1 接口和实现接口并覆盖接口中同一方法的几不同的类体现的2 父类和继承父类并覆盖父类中同一方法的几个不同子类实现的.一、基本概念多态性:发送消息给某个对象,让该对象自行决定响应何种行为。

通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。

2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

二、Java多态性实现机制SUN目前的JVM实现机制,类实例的引用就是指向一个句柄(handle)的指针,这个句柄是一对指针:一个指针指向一张表格,实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的类型);另一个指针指向一块从java堆中为分配出来内存空间。

三、总结1、通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

DerivedC c2=new DerivedC();BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法分析:* 为什么子类的类型的对象实例可以覆给超类引用?自动实现向上转型。

通过该语句,编译器自动将子类实例向上移动,成为通用类型BaseClass;* a.play()将执行子类还是父类定义的方法?子类的。

在运行时期,将根据a这个对象引用实际的类型来获取对应的方法。

所以才有多态性。

一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。

在a1=c2的时候,仍然是存在两个句柄,a1和c2,但是a1和c2拥有同一块数据内存块和不同的函数表。

2、不能把父类对象引用赋给子类对象引用变量BaseClass a2=new BaseClass();DerivedC c1=a2;//出错在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行。

c1=(DerivedC)a2; 进行强制转化,也就是向下转型.3、记住一个很简单又很复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量。

你可能说这个规则不对的,因为父类引用指向子类对象的时候,最后执行的是子类的方法的。

其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。

而假若子类的这个方法在父类中并没有定义,则会出错。

例如,DerivedC类在继承BaseClass中定义的函数外,还增加了几个函数(例如 myFun())分析:当你使用父类引用指向子类的时候,其实jvm已经使用了编译器产生的类型信息调整转换了。

这里你可以这样理解,相当于把不是父类中含有的函数从虚拟函数表中设置为不可见的。

注意有可能虚拟函数表中有些函数地址由于在子类中已经被改写了,所以对象虚拟函数表中虚拟函数项目地址已经被设置为子类中完成的方法体的地址了。

4、Java与C++多态性的比较jvm关于多态性支持解决方法是和c++中几乎一样的,只是c++中编译器很多是把类型信息和虚拟函数信息都放在一个虚拟函数表中,但是利用某种技术来区别。

Java把类型信息和函数信息分开放。

Java中在继承以后,子类会重新设置自己的虚拟函数表,这个虚拟函数表中的项目有由两部分组成。

从父类继承的虚拟函数和子类自己的虚拟函数。

虚拟函数调用是经过虚拟函数表间接调用的,所以才得以实现多态的。

Java的所有函数,除了被声明为final的,都是用后期绑定。

四. 1个行为,不同的对象,他们具体体现出来的方式不一样,比如: 方法重载 overloading 以及方法重写(覆盖)overrideclass Human{void run(){输出人在跑}}class Man extends Human{void run(){输出男人在跑}}这个时候,同是跑,不同的对象,不一样(这个是方法覆盖的例子)class Test{void out(String str){输出 str}void out(int i){输出 i}}这个例子是方法重载,方法名相同,参数表不同ok,明白了这些还不够,还用人在跑举例Human ahuman=new Man();这样我等于实例化了一个Man的对象,并声明了一个Human的引用,让它去指向Man这个对象意思是说,把 Man这个对象当 Human看了.比如去动物园,你看见了一个动物,不知道它是什么, "这是什么动物? " "这是大熊猫! "这2句话,就是最好的证明,因为不知道它是大熊猫,但知道它的父类是动物,所以,这个大熊猫对象,你把它当成其父类动物看,这样子合情合理.这种方式下要注意 new Man();的确实例化了Man对象,所以 ahuman.run()这个方法输出的是 "男人在跑 "如果在子类 Man下你写了一些它独有的方法比如 eat(),而Human没有这个方法,在调用eat方法时,一定要注意强制类型转换 ((Man)ahuman).eat(),这样才可以...对接口来说,情况是类似的...实例:package domatic;//定义超类superAclass superA {int i = 100;void fun(int j) {j = i;System.out.println("This is superA");}}// 定义superA的子类subBclass subB extends superA {int m = 1;void fun(int aa) {System.out.println("This is subB");}}// 定义superA的子类subCclass subC extends superA {int n = 1;void fun(int cc) {System.out.println("This is subC");}}class Test {public static void main(String[] args) {superA a = new superA();subB b = new subB();subC c = new subC();a = b;a.fun(100);a = c;a.fun(200);}}/** 上述代码中subB和subC是超类superA的子类,我们在类Test中声明了3个引用变量a, b,* c,通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

相关文档
最新文档