1.抽象类的基本概念:
用abstract关键字声明的类叫抽象类,用来专门当做父类
抽象类的定义规则如下:
(1)抽象类和抽象方法都必须用abstract关键字来修饰
(2)抽象类不能被直接实例化,也就是不能直接用new关键字去产生对象
(3)抽象方法只需声明,而不需实现
(4)含有抽象方法的类必须声明为抽象类,抽象类的子类必须覆写所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。
注意:在抽象类中定义的方法有两种,一种是一般的成员方法,另一种是抽象方法,以abstract关键字修饰,该方法没有方法体。格式如下:
abstract 返回值的数据类型 方法名称 (参数...);
public class Test {
public static void main(String[] args) {
Student st=new Student("张三", 25, "学生");
System.out.println(st.talk());
}
}
abstract class Person{
String name;
int age;
String occupation;
//声明一抽象方法talk()
public abstract String talk();
}
class Student extends Person
{
public Student(String name,int age,String occupation) {
this.name=name;
this.age=age;
this.occupation=occupation;
}
@Override
public String talk() {
return "学生姓名:"+this.name+" 年龄:"+this.age+" 职业:"+this.occupation;
}
}//返回结果:学生姓名:张三 年龄:25 职业:学生
2.接口的基本概念:
接口(interface)可以认为是一个特殊的抽象类,它的结构与Java中的抽象类非常相似,也具有数据成员与抽象方法,是Java所提供的一种重要技术。
它与抽象类不点有以下几种:
(1).接口中的数据成员必须初始化,且数据成员均为常量。
(2).接口里的方法必须全部声明为abstract。换而言之,接口不能像抽象类一样保留一般的方法。
(3).接口中的成员都是public的,接口中的final与抽象方法声明的abstract都是可以省略的,例如:public class Test {
public static void main(String[] args) {
Student s=new Student();
System.out.println(s.talk());
}
}
interface Person {
String name = "张三";
int age = 25;
String occupation = "学生";
// 声明一抽象方法talk();
public abstract String talk();
}
// Student类实现自Person类
class Student implements Person {
// 覆写talk()方法
@Override
public String talk() {
return "学生姓名: " + this.name + " 年龄" + this.age + " 职业:"
+ this.occupation;
}
}//得到结果:学生姓名: 张三 年龄25 职业:学生
什么是模板方法?
在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类去完成。
public class Test {
public static void main(String[] args) {
Wangwu s1=new Wangwu();
s1.smoke();
}
}
abstract class Student {
abstract void study();
}
// Smoking不是共性行为,单独抽取出来,体系以外的功能扩展,扩展功能定义在接口中。
interface Smoking {
void smoke();
}
class ZhangSan extends Student {
@Override
void study() {
System.out.println("张三在学习");
}
}
class Wangwu extends Student implements Smoking {
@Override
public void smoke() {
System.out.println("wangwu在抽烟");
}
@Override
void study() {
System.out.println("wangwu在学习");
}
}//打印结果:wangwu在抽烟
JAVA只支持单继承,但在接口中,可以对一个类有多种实现,增强了程序的可扩展性!