java抽象类,密封类与接口

抽象类
抽象类的基本概念
普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、

普通方法、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=男]]

猜你喜欢

转载自blog.csdn.net/qq_37232304/article/details/80445523