继承的基本语法:
在JAVA语言中, 用extends关键字来表示一个类继承另一个类,例如:
public class Sub extends Base {
...
}
以上代码表明Sub类继承了Base类。那么Sub类到底继承了Base类的哪些东西呢?这需要分两种情况:
- 当Sub类和Base类位于同一个包中,Sub类继承了Base类中public、protected和默认级别的成员变量和成员方法。
- 当Sub类和Base类位于不同包中,Sub类继承了Base类中public、protected的成员变量和成员方法。
1、方法重载(Overload):
重载方法必须满足以下条件:
- 方法名相同。
- 方法的参数类型、个数、顺序至少有一项不同。
- 方法的返回类型可以不相同。
- 方法的修饰符可以不相同。
例如以下Simple类中已经定义了一个amethod()方法。
public class Simple {
public void amethod(int i, String s);
//加入其他方法
}
下面哪些方法可以加入到Simple类中,并且保证编译正确呢?
A)public void amethod(String s, int i){} (可以)
B)public int amethod(int i, String s){return 0;} (不可以)
C)private void amethod(int i, String mystring){} (不可以)
D)public void Amethod(int i, String s){} (可以)
E)abstract void amethod(int i); (不可以)
2、方法覆盖(Override):
覆盖方法必须满足多种约束:
(1)子类方法的名称、参数类型和返回类型必须和父类方法的名称、参数类型和返回类型一致。例如:以下代码将导致编译错误:
public class Base {
public void method() {...}
}
public class Sub extends Base {
public int method() { //编译错误,返回类型不一致
return 0;
}
}
(2)子类方法不能缩小父类方法的访问权限。例如:
public class Base {
public void method() {...}
}
public class Sub extends Base {
private void method() {...} //编译错误子类方法缩小了父类方法的访问权限
}
(3)子类方法不能抛出比父类方法更多的异常。子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常是父类方法抛出的异常的子类。
例如,假设异常类ExceptionSub1和ExceptionSub2是ExceptionBase类的子类,则以下代码是合法的:
publc class Base {
void method() throws ExceptionBase {}
}
public class Sub1 extends Base {
void method() throws ExceptionSub1 {}
}
public class Sub2 extends Base {
void method() throws ExceptionSub1,ExceptionSub2 {}
}
public class Sub3 extends Base {
void method() throws ExceptkionBase {}
}
以下代码不合法:
public class Base {
void method() throws ExceptionSub1 {}
}
public class Sub1 extends Base {
void method() throws ExceptionBase {} //编译出错
}
public class Sub2 extends Base {
void method() throws ExceptionSub1,ExceptionSub2 {} //编译出错
}
(4)方法覆盖只存在于父类(包括直接父类和间接父类)之间。在同一个类中的方法只能重载,不能覆盖。
(5)父类的静态方法不能被子类覆盖为非静态方法。例如以下代码将编译错误:
public class Base {
public static void method() {...}
}
public class Sub extends Base {
public void method() {...} //编译出错
(6)子类可以定义与父类的静态方法同名的静态方法,以便在子类中可以隐藏父类的静态方法。在编译时,子类定义的静态方法也必须方法覆盖类似的约束:方法的参数签名一致,返回类型一致,不能缩小父类的访问权限,不能抛出更多的异常。
public class Base {
static int method(int i) throws BaseException() {return 0;}
}
public class Sub extends Base {
public static int method(int i) throws SubException() {return 0;}
}
(7)父类非静态方法不能被子类覆盖为静态方法。例如以下代码不合法:
public class Base {
void method() {}
}
public class Sub extends Base {
static void method() {} //编译出错
}
(8)父类的私有方法不能被子类覆盖。
(9)父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的的,抽象方法。例如以下代码是合法的:
public abstract class Base {
abstract void method1();
abstract void method2();
}
public abstract Sub extends Base {
public void method1() {...} //实现method1()方法,并且扩大访问权限。
public abstract void method2() //重新声明method2()方法,仅扩大访问权限,但不实现。
}
(10)父类的非抽象方法可以被覆盖为抽象方法。例如以下代码是合法的:
public class Base {
void method() {}
}
public abstract class Sub extends Base {
public abstract void method(); //合法
}
3、方法覆盖与方法重载的异同
方法覆盖和方法重载具有以下相同点:
- 都要求方法同名。
- 都可以用于抽象方法和非抽象方法之间。
方法覆盖和方法重载不同点:
- 方法覆盖要求参数签名一致,而方法重载要求参数签名不一致。
- 方法覆盖要求返回类型必须一致,而方法重载对此不做限制。
- 方法覆盖只用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类继承而来的方法)。
- 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制 。
- 父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次。
以下是子类Sub覆盖了父类Base的method(int v)方法,并且提供了多种重载方法:
public class Base {
protected void method(int v) {}
private void method(String s){} //重载
}
public abstract class Sub extends Base {
public void method(int v) {} //覆盖
public int method(int v1, int v2) {return 0;} //重载
protected void method(String s) Exception {} //重载
abstract void method(); //重载
}
分享到:
相关推荐
【完整课程列表】 Java基础[01-Java概述]....Java基础[04-继承上].pdf Java基础[04-继承下].pdf Java基础[05-多线程].pdf Java基础[06-集合].pdf Java基础[07-IO].pdf Java基础[08-GUI].pdf Java基础[09-网络编程].pdf
以上只是Java基础知识的一部分,实际的Java基础教程会更深入地讲解每个概念,并配有实例来帮助理解。这份"java基础教程----精华版"应该涵盖了这些主题,并且可能还有更多的实践指导和示例代码,对于学习和巩固Java...
Java是一种广泛使用的面向对象的编程语言,其基础知识是学习Java编程的基石。下面将详细解释标题和描述中涉及的关键...以上就是Java基础知识的一些核心概念和特性,理解并掌握这些知识点对于深入学习Java编程至关重要。
【中信java培训资料------第一部分】是一份针对Java编程语言的初期学习资料,涵盖了从基础知识到实际应用的多个方面。这份资料旨在帮助初学者建立起坚实的Java编程基础,并逐步熟悉其核心概念和技术。 在【听课笔记...
2. **第二章:Java基础语法【上】** - 基本数据类型:整型(byte, short, int, long)、浮点型(float, double)、字符型(char)和布尔型(boolean)。 - 变量声明与初始化:变量的定义、赋值和作用域。 - ...
这份"Java基础入门--教学课件--PPT"旨在帮助初学者掌握Java编程的基本概念和语法,为深入学习Java打下坚实的基础。 1. **Java简介**: Java由Sun Microsystems(现为Oracle公司)于1995年推出,由詹姆斯·高斯林等...
### Java基础知识概览 #### 1. Java简介 - **定义**:Java是一种广泛使用的面向对象编程语言,由Sun Microsystems在1995年推出。 - **特点**: - 高度可移植性:由于采用了JVM(Java虚拟机)机制,使得Java程序...
java中的继承是一种面向对象编程的重要概念,它允许一个类继承另一个类的属性和方法。使用继承可以实现代码的重用和层次化组织。 要使用继承,需要定义一个子类(派生类)来继承一个父类(基类或超类)。子类可以...
为了在激烈的Java开发者竞争中脱颖而出,深入理解Java基础知识、JVM(Java虚拟机)、线程并发以及常用框架是至关重要的。这份"java-java面试题库整理-基础-JVM-线程并发-框架等.zip"文件提供了一个全面的复习资源,...
### Java基础知识总结 #### Java 入门概述 Java 作为一种广泛应用的编程语言,自1995年由 Sun Microsystems 发布以来,迅速成为了软件开发领域的主流技术之一。Java 的诞生不仅推动了软件行业的进步,还引领了一...
《Java语言程序设计-基础篇-原书第8版》是一部深入浅出、全面系统地讲解Java编程基础知识的优秀教材,对于初学者和有一定基础的程序员来说,都是一个极佳的学习资源。本书由Cay S. Horstmann与Gary Cornell共同编写...
### Java基础 #### 1. Java概述 - **定义**:Java是一种面向对象的编程语言,由Sun Microsystems公司于1995年推出。 - **特点**: - 面向对象:支持封装、继承、多态等特性。 - 平台无关性:Java程序可以在任何...
### Java基础知识概述 #### 1. Java简介 Java是由Sun Microsystems公司于1995年推出的面向对象的程序设计语言。最初由James Gosling及其团队研发,并在同年正式发布。随着时间的发展,Sun Microsystems被Oracle公司...
以上内容仅为Java基础知识的一部分,后续还包括数据类型、运算符、流程控制等内容。这些基础概念对于理解和学习Java至关重要。接下来将继续介绍更深入的主题,如面向对象的概念、类与对象、封装、继承、多态等。
java
### Java基础知识点详解 #### 一、Java语言的历史与地位 - **计算机语言的历史:** - **第一代语言(机器语言)**:基于0和1的二进制代码,直接与硬件交互,例如早期的打孔机。 - **第二代语言(汇编语言)**:...
Java基础知识大总结涵盖了Java编程语言的核心概念和结构,为初学者提供了一个全面的参考资料。下面将详细解析这些知识点: 1. JVM、JRE和JDK的区别: - JVM(Java Virtual Machine)是Java虚拟机,它是Java程序跨...
3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 ...
随着对这些基础知识的掌握,你可以继续深入学习Java的高级特性,如集合框架、IO流、数据库连接以及框架技术,如Spring和Hibernate,进一步提升你的编程能力。 总之,“Java技术教程--基础篇”是一份全面的入门资料...