Day02 抽象类与接口
static关键字总结
package oop.damo.test;
//static
public class Student {
private static int age;//静态变量
private double score;//非静态变量
public static void go(){//静态方法
}
public void run(){//非静态方法
}
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(Student.age);//0
System.out.println(Student.score);//报错
//非静态变量需要类实例化出对象以后才能调用,而静态变量是伴随着类的加载而产生的,不需要类实例化
System.out.println(s1.age);
System.out.println(s1.score);
//实例化出对象后,都可以调用
go();
run();//报错
s1.go();
s1.run();
//同样,非静态方法需要类实例化出对象以后才能调用,而静态方法是伴随着类的加载而产生的,不需要类实例化
}
}
抽象类
用关键字abstract修饰类,则此类成为抽象类。
public abstract class Action {
//abstract 只有方法名字,没有方法实现
public abstract void doSomething();//可见根本没有方法体,出现{}甚至会报错。
}
//抽象类的所有方法,继承了它的子类,都必须要实现(重写)它的方法,除非子类也是抽象类。
public class A extends Action{
@Override
public void doSomething() {
}
}
- 不能new这个抽象类来创造对象,只能靠子类去实现它:约束!
- 要写抽象方法,必须先声明类为抽象类
- 抽象类中也可以存在普通方法
- 虽然不能new 出来,但仍然存在构造器
- 子类可以继承抽象类,但必须实现抽象方法;同时我们可以实例化这个子类对象
菜鸟教程的解释:
-
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
-
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
-
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
-
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
-
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
总结
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
- 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
接口
定义:只有规范!定义属性默认是静态常量。自己无法写方法实现,约束和实现分离。接口的本质是一种契约
声明:声明接口的关键字是interface
- 定义一个 UserService接口
public interface UserService {
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
- 定义一个TimeService接口
public interface TimeService {
void timer();
}
定义一个类,调用两个接口,并对接口中方法进行重写
//类 可以实现接口 implement 接口
//实现了接口的类,需要重写接口中的方法
public class UserServiceImpl implements UserService,TimeService{
//可以看到此类完全可以多继承两个接口,也就是我们可以利用接口进行多继承
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
//上边是UserService的接口方法重写,下面是TimeService的方法重写
@Override
public void timer() {
}
}
异常处理
try,catch,finally,throw,throws
package oop.damo.test;
public class test {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {//try 监控区域
System.out.println(a/b);
}catch (ArithmeticException e){//捕获异常,参数表内为想要捕捉的异常类型,最高为Throwable,接着是(Error,Exceprtion)
System.out.println("程序出现异常");
}finally {//处理善后工作
System.out.println("finally");
}
}
}
public class test {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
new test().testing(a,b);
} catch (ArithmeticException e) {
System.out.println("有点小问题,but");
} finally {
System.out.println("nothing");
}
}
public void testing(int a,int b)throws ArithmeticException{//假设此方法中处理不了这个异常,方法上抛出异常
if(b==0){
throw new ArithmeticException();//主动抛出异常,一般在方法中使用
}
}
}

浙公网安备 33010602011771号