抽象类
抽象类的基本概念
普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、
普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。
那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。
而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。
抽象类中,可以有抽象方法,也可以有非抽象方法
//如果一个类继承了一个抽象类,那么这个类中必须实现抽象类中的方法
abstract class animal{//抽象类可以有抽象方法,也可以有非抽象方法,
abstract public void cry();//抽象类的方法必须为public protect 方法
public void fun1(){//如果不加,默认为public
System.out.println("animal fun1!!");
}
}
class dog extends animal{
public void cry(){
System.out.println("wangwang");
}
}
//如果一个抽象类继承一个抽象类,那么可以不实现基类的抽象方法
abstract class Cat extends Animal{
}
//当你继承的抽象类有父类的时候,你也必须实现其父类的抽象方法
class LittleCat extends Cat{
public void cry() {
}
}
抽象类的使用规则:
(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
(2)抽象类不能直接实例化;
(3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
(4)子类(如果不是抽象类)则必须实现抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。)
密封类
类和方法被final修饰之后,类不能被继承,方法不能被修改
密封类主要是为了防止有意的派生出现
final class base{//不能继承
public final void fun1(){
System.out.println("base.fun1");
}
public void fun2(){
System.out.println("base.fun2");
}
}
接口
接口是对行为的一种抽象化
接口的特点
1、Java接口中的成员变量默认都是public static final类型的
2、Java接口中的方法默认都是public abstract类型的(都可省略),没有方法体,不能被实例化
接口与抽象类的区别:
1,接口可以被继承多个,抽象类只能被继承一个
2,接口中没有构造方法,不能被实例化
3,一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口(相当于对基接口的扩展)
4,抽象类是对一个整体的抽象,接口是对这个整体某个行为进行抽象。
接口的继承:
1,接口可以被接口继承,但是不是被接口实现。
2,接口的继承解决了java单继承的问题
接口的具体应用:
1,Cloneable
Cloneable是一个空接口,他是一个标志,如果没有这个标志,JVM无法识别
这个接口主要是为了实现类的克隆
class student implements Cloneable{//定义一个类实现Cloneable
String name;
int age;
String sex;
public student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
protected student clone() throws CloneNotSupportedException {//修改object的克隆方法
student c=(student) super.clone();
return c;
}
@Override
public String toString() {
return "student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
public class tses4 {
public static void main(String[] args) throws CloneNotSupportedException {
student t1=new student("a",12,"男");
student t2=(student)t1.clone();
System.out.println(t1);
System.out.println(t2);
}
}
结果
student [name=a, age=12, sex=男]
student [name=a, age=12, sex=男]
2,Comparable
这个接口用于类的排序
import java.util.Arrays;
class student implements Comparable<student>{//实现接口Comparable
String name;
int age;
String sex;
public student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
@Override
public int compareTo(student o) {//,对Comparable接口内的方法进行实现
// TODO Auto-generated method stub
//return age-o.age;//按照年纪升序
return name.compareTo(o.name);//按照姓名升序
}
}
public class tses4 {
public static void main(String[] args) {
student []a=new student[2];
a[0]=new student("a",12,"男");
a[1]=new student("b",15,"男");
Arrays.sort(a);//调用排序函数进行排序
System.out.println(Arrays.toString(a));
}
}
结果
[student [name=a, age=12, sex=男], student [name=b, age=15, sex=男]]
3,Comparator
Comparator为比较器,比Comparable灵活,它可以根据用户的需求来对类中的的成员进行排序
import java.util.Arrays;
import java.util.Comparator;
class student {
String name;
int age;
String sex;
@Override
public String toString() {
return "student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
public student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
public class tses4 {
public static void main(String[] args) {
student []a=new student[2];
a[0]=new student("a",12,"男");
a[1]=new student("b",15,"男");
Arrays.sort(a,new Comparator<student>() {
@Override
public int compare(student o1, student o2) {
// TODO Auto-generated method stub
return o1.getAge()-o2.getAge();//按照年龄进行排序
}
});
System.out.println(Arrays.toString(a));
}
}
结果
[student [name=a, age=12, sex=男], student [name=b, age=15, sex=男]]