抽象类、接口、异常
一.抽象类
1.抽象方法和抽象类:
·抽象方法
使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。
·抽象类
包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。
抽象类的使用要点:
\1. 有抽象方法的类只能定义成抽象类
\2. 抽象类不能实例化,即不能用new来实例化抽象类。
\3. 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
\4. 抽象类只能用来被继承。
\5. 抽象方法必须被子类实现。
抽象类和抽象方法的基本用法
//抽象类
abstract class Animal {
abstract public void shout(); //抽象方法
}
class Dog extends Animal {
//子类必须实现父类的抽象方法,否则编译错误
public void shout() {
System.out.println("汪汪汪!");
}
public void seeDoor(){
System.out.println("看门中....");
}
}
//测试抽象类
public class TestAbstractClass {
public static void main(String[] args) {
Dog a = new Dog();
a.shout();
a.seeDoor();
}
}
二.接口
1.接口的作用:
接口中所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共方法规范。
2.区别
\1. 普通类:具体实现
\2. 抽象类:具体实现,规范(抽象方法)
\3. 接口:规范!
3.定义接口:
声明格式:
[访问修饰符] ``interface` `接口名 [``extends` `父接口``1``,父接口``2``…] {``常量定义; ``方法定义;``}
定义接口的详细说明:
\1. 访问修饰符:只能是public或默认。
\2. 接口名:和类名采用相同命名机制。
\3. extends:接口可以多继承。
\4. 常量:接口中的属性只能是常量,总是:public static final 修饰。不写也是。
\5. 方法:接口中的方法只能是:public abstract。 省略的话,也是public abstract。
要点
\1. 子类通过implements来实现接口中的规范。
\2. 接口不能创建实例,但是可用于声明引用变量类型。
\3. 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
4接口的使用:
public class TestInterface {
public static void main(String[] args) {
Volant volant = new Angel();
volant.fly();
System.out.println(Volant.FLY_HIGHT);
Honest honest = new GoodMan();
honest.helpOther();
}
}
/**飞行接口*/
interface Volant {
int FLY_HIGHT = 100; // 总是:public static final类型的;
void fly(); //总是:public abstract void fly();
}
/**善良接口*/
interface Honest {
void helpOther();
}
/**Angle类实现飞行接口和善良接口*/
class Angel implements Volant, Honest{
public void fly() {
System.out.println("我是天使,飞起来啦!");
}
public void helpOther() {
System.out.println("扶老奶奶过马路!");
}
}
class GoodMan implements Honest {
public void helpOther() {
System.out.println("扶老奶奶过马路!");
}
}
class BirdMan implements Volant {
public void fly() {
System.out.println("我是鸟人,正在飞!");
}
}
5.接口的多继承:
接口完全支持多继承。和类的继承类似,子接口扩展某个父接口,将会获得父接口中所定义的一切。
interface A {
void testa();
}
interface B {
void testb();
}
/**接口可以多继承:接口C继承接口A和B*/
interface C extends A, B {
void testc();
}
public class Test implements C {
public void testc() {
}
public void testa() {
}
public void testb() {
}
}
三.内部类
1.内部类(innerclasses):把一个类放在另一个类的内部
内部类是相对独立的一种存在,其成员变量/方法名可以和外部类的相同。
/**外部类Outer*/
class Outer {
private int age = 10;
public void show(){
System.out.println(age);//10
}
/**内部类Inner*/
public class Inner {
//内部类中可以声明与外部类同名的属性与方法
private int age = 20;
public void show(){
System.out.println(age);//20
}
}
}
内部类的作用:
\1. 内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。
\2. 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。 但外部类不能访问内部类的内部属性。
\3. 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整。
内部类的使用场合:
\1. 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,在只为外部类提供服务的情况下可以优先考虑使用内部类。
\2. 使用内部类间接实现多继承:每个内部类都能独立地继承一个类或者实现某些接口,所以无论外部类是否已经继承了某个类或者实现了某些接口,对于内部类没有任何影响。
2.内部类的分类:
Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。
四.异常机制
Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。