抽象类
可以使用java中的抽象类来实现,用abstract来修饰Pet类。
抽象类不能通过new实例化
抽象类和抽象方法的特点
- 抽象类和抽象方法都通过abstract关键字来修饰
- 抽象类不能实例化。抽象类中可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法
- 抽象方法之一方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类。
抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用,若此构造方法不是有private修饰,也可以被本类的子类中的构造方法调用。
抽象类的使用原则
所有抽象类必须有子类 :(abstract与final不能同时出现,编译出错)
//抽象类的定义与使用
abstract final class Person{//此处报错 abstract与final关键字不能同时出现
static int num=10;
public abstract void print();
}
public class Test16{
public static void main(String[] args){
System.out.println(Person.num);
}
}
如果子类不是抽象类 ,子类必须覆写抽象类(父类)的所有抽象方法。(子类是抽象类则可以不要求全部覆写)
abstract class Person{
abstract void print();
abstract void fun();
}
class Student extends Person{
static int num=10;
public void print(){}
//public void fun(){}//报错
}
public class Test17{
public static void main(String[] args){
// Person per = new Student();
//Student stu = new Student();
System.out.println(Student.num);
}
}
抽象类可以使用子类向上转型对其实现实例化,抽象类一定不能直接实例化对象(无论是否有抽象方法)
abstract class Person{
public abstract void print();
}
class Student extends Person{
public void print(){
System.out.println("hello i am student");
}
}
public class Test19{
public static void main(String[] args){
//Person per = new Student();
Person per = new Person();//此处报错
per.print();
}
}
//正确写法:
public class Test19{
public static void main(String[] args){
Person per = new Student();//正确写法 由子类向上转型实现实例化
per.print();
}
}
由于抽象类强制要求子类覆写父类方法,所以private 与 abstract 不能同时使用。(private 修饰私有属性,被private修饰的属性和方法不能被外部使用)
abstract class Person{
private abstract void print();//此时报错 private 与 abstract不能同时使用
}
class Student extends Person{
public void print(){
System.out.println("hello world");
}
}
public class Test18{
public static void main(String[] args){
Person per = new Student();
}
}
final 修饰符
用来修饰类,标示该类不能被继承,类里的方法都是默认final方法,不能被重写。
用来修饰变量。这个变量就是常量,不能被修改,只能被赋值一次。当final修饰基本数据类型时一旦在初始化后便不能发生变化。如果修饰一个引用类型,则在初始化后便不能再让其指向其他对象了。但该引用所指向的对象的内容是可以变化的。本质上是一回事,final要求值不能变。即地址值不能改变。