class 父类 {
}
class 子类 extends 父类 {
}
需要注意的是 Java 不支持多继承,但支持多重继承。
(多继承是指一个类继承多个类的变量和方法;多重继承指的是B继承A,然后C再继承B)
子类拥有父类非 private 的属性、方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
可以变相的使java具有多继承的特性:
public class C implements A,B {
}
我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
final class 类名 {//类体}
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
(构造方法或者构造函数)的,它只是调用(隐式或显式)。
如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
例如:
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
}
}
【b属于Animal类型,但是它运行的是Dog类的move方法。】
是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
例如:
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}
public String test(String s,int a){
System.out.println("test4");
return "returntest4";
}
就是同一个接口,使用不同的实例而执行不同操作。
多态存在的三个必要条件:
继承
重写
父类引用指向子类对象
例如:
public class studentImpl implements Istudent,Iteacher{
@Override
public String getUsername() {
// TODO Auto-generated method stub
return null;
}
public String getTeacher(){
return null;
}
}
public static void main((String[] args){
Iteacher itercher=new StudentImpl();
Istudent istu=new StudentImpl();
}
除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
在Java语言中使用abstract class
来定义抽象类。
12.实现Java封装的步骤
,在JAVA编程语言中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。
接口的声明语法格式如下:
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法,接口内的方法默认为抽象方法。
}
不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
package net.java.util;
public class Something{
...
}
那么它的路径应该是 net/java/util/Something.java
这样保存的。
包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
编译所有该包声明的文件,并把他们放在一个用该包名命名的子目录中。
引用类型
即自己定义的类或接口。
比如多态,将对象的接口类型进行转换。
所有的异常类是从 java.lang.Exception 类继承的子类。
java.lang包自动引用。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。
使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。
例如:
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
上面的代码段包含了 3 个 catch块。
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。
[异常处理机制主要处理检查性异常,而不是非检查性异常和Error]
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
例如:
public void deposit(double amount) throws RemoteException,InsufficientFundsException
{
// Method implementation
throw new RemoteException();
}
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
例如:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
可以像下面这样定义自己的异常类:
class MyException extends Exception{
}
只继承Exception 类来创建的异常类是检查性异常类。