【JAVASE_学习笔记】抽象类与接口

【JAVASE_学习笔记】抽象类与接口

final关键字

final表示最终
注意:
   1.final修饰一个基本类型变量时,该变量不能被重新赋值
     常量的修饰符为:public static final
   2.final修饰一个引用类型变量时,该引用不能重新指向新的对象
   3.final修饰一个方法时,该方法不能被重写
   4.final修饰一个类时,该类不能被继承
举例:

final class Circle{
    double r;
    public  static  final double PI = 3.14; // 常量
    //构造函数
    public Circle(double r){
        this.r = r;
    }
    public Circle(){}
    public final void getArea(){
        System.out.println("面积是:"+ PI*r*r);
    }
}

class Demo3 {
    public static void main(String[] args) 
    {
        final Circle c = new Circle(3.0);
        //c = new Circle();//报错
        print(c);//不会报错
    }
    public static void  print(final Circle c){
        //c  = new Circle(4.0);  // c指向了新的对象。
    }
}

abstract(抽象)类

描述一类事物时,发现该事物确实存在着某种行为,但目前该行为是不具体的,这时应该抽取该方法的声明,不去实现该方法,这时应使用抽象类。
注意:
   1.如果一个方法没有方法体,那么该方法必须使用abstract修饰
   2.如果一个类有抽象的方法,该类也必须用abstract修饰
   3.非抽象类继承抽象类时,必须把抽象类中的所有抽象方法全部实现
   4.抽象类可以定义抽象方法以及非抽象方法
   5.抽象类可以不存在抽象类
   6.抽象类不能创建对象
   7.抽象类是存在构造方法的(留给子类调用初始化父类继承的成员变量)
抽象类的成员特点:
    成员变量:
      可以是变量也可以是自定义常量
    构造方法:
      抽象类可以有构造方法:包括有参构造和无参构造
      作用:通过抽象类多态的形式:让子类进行数据的初始化
    成员方法:
      可以有抽象方法,也可以有非抽象方法
      抽象方法:强制子类必须要做到一件事情:方法重写(覆盖)
      非抽象方法:由继承保证可以去提高代码的复用性
abstract不能和以下关键字配合使用:
  1.不能和private配合使用
  2.不能和final配合使用
  3.不能和static配合使用
举例:

//测试类
public class Demo1 {
    public static void main(String [] args){
        Rectangle r=new Rectangle(3,4);
        System.out.println(r.areaMath());//12.0
        System.out.println(r.perimeterMath());//14.0
        Circle c=new Circle(1.0);
        System.out.println(c.areaMath());//3.14
        System.out.println(c.perimeterMath());//6.28
    }

}
//图形类  抽象
abstract class Graph{
    public abstract double areaMath();
    public abstract double perimeterMath();
}
//矩形类
 class Rectangle extends Graph{
    int shortLength;
    int longLength;
    public Rectangle(int shortLength,int longLength){
        this.shortLength=shortLength;
        this.longLength=longLength;
    }
    //方法重写:返回值类型要与抽象方法一致,或是抽象方法返回值类型的子类
    public double areaMath() {
        int area=shortLength*longLength;
        return area;
    }
    public double perimeterMath() {
        int perimeter=(shortLength+longLength)*2;
        return perimeter;
    }
}
//圆形类
 class Circle extends Graph{
    double r;
    //常量要用public static final修饰
    public static final double PI=3.14;
    public Circle(double r){
        this.r=r;
    }
    public double areaMath() {
        double area=PI*r*r;
        return area;
    }
    public double perimeterMath() {
        double perimeter=PI*r*2;
        return perimeter;
    }
}

接口

接口的定义格式:

interface 接口名{

}

接口子实现类的一般命名规范:接口名+impl
实现接口的格式:

class 接口 implements 接口{

}

注意:
   1.接口其实是一个特殊的类
   2.接口中的成员变量都属于常量,默认修饰符:public static final
   3.接口中的方法都是抽象的方法,默认修饰符:public abstract
   4.接口是不能用于创建对象的
   5.接口是没有构造方法的,因为接口中的变量都是常量,接口中的方法都是抽象的方法
   6.一个非抽象类实现一个接口时,必须实现接口中的所有方法
接口的作用:
   1.拓展功能
   2.定义约束规范
   3.程序的解耦
接口与类之间的关系:实现关系
   1.非抽象类实现一个接口时,必须要把接口中的所有方法都实现
   2.一个类可以实现多个接口

class 类名 implements 接口1,接口2,...

   3.抽象类实现接口时,可以实现接口中的方法,也可以不实现接口中的方法
接口和接口之间的关系:继承关系
   一个接口可以继承多个接口

interface B extends A,C

接口与抽象类间的区别:
  1)成员的区别
    成员变量:抽象类:成员变量可以是常量也可以是变量
         接 口:成员变量只能是常量,默认修饰符为:public static final
    构造方法:抽象类:可以有无参构造、有参构造方法
             作用:通过子类进行数据初始化(通过子类创建对象)
         接 口:没有构造方法
    成员方法:抽象类:可以有抽象方法,也可以有非抽象方法
         接 口:只能是抽象方法。默认修饰符为:public abstract
  2)关系的区别
    类与类的关系:extends,Java中只存在单继承,不支持多继承,但支持多层继承
    类与接口:implements,一个类在继承另一个类的同时可以实现多个接口
    接口与接口:继承关系,可以单继承也可以多继承
  3)设计理念
    抽象类:体现的是一种“is a”关系,存在继承关系
    接口:体现的是“like a”关系,扩展功能
举例:

//测试类
public class Demo2 {
    public static void main(String [] args){
        Student s=new Student("张三",18);
        s.study();//18岁的张三学习啦
        SomeStudent ss=new SomeStudent("李四",23);
        ss.study();//23岁的李四学习啦
        ss.getMoney();//23岁的李四赚钱啦
    }

}
//父类
class Student {
    String name;
    int age;
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void study(){
        System.out.println(age+"岁的"+name+"学习啦");
    }
}
//接口
interface GetMoney{
    public void getMoney();
}
//子实现类
class SomeStudent extends Student implements GetMoney{
    public SomeStudent(String name,int age){
        super(name,age);
    }
    public void getMoney(){
        System.out.println(age+"岁的"+name+"赚钱啦");
    }
}
实验题目 编写一个类实现银行帐户的概念,包括的属性有“帐号”、“储户姓名”、“地址”、“存款余额”,包括的方法有“存款”、“取款”、“查询”、“计算利息”、“累加利息”等。 实验要求 改写上面的类,增加一个类的静态属性“最小余额”和一个用来修改这个最小余额属性的方法。 改写上面的类,增加一个类的静态属性“活期利率”和封装这个属性的相应方法。 程序模块 实验后的结果验证 总结体会 通过此次实验,我初步掌握了编写一个类的概念,更进一步的熟悉了static等等之用法相类似的语法类,增强了自己学好JAVA的信心。进一步掌握静态对象和非静态对象的区别联系。 静态对象的数据在全局是唯一的,一改都改。如果你想要处理的东西是整个程序中唯一的,弄成静态是个好方法。 非静态的东西你修改以后只是修改了他自己的数据,但是不会影响其他同类对象的数据。 静态对象和非静态对象都是对象,是对象都是要实例化的。不同之处就是2者的数据表现和存储方式不一样。 静态的好处: 引用方便。对于公用类型的变量,直接用 类名.静态方法名 或者 类名.静态变量名就可引用并且直接可以修改其属性值,不用getter和setter方法。 保持数据的唯一性。此数据全局都是唯一的,修改他的任何一处地方,在程序所有使用到的地方都将会体现到这些数据的修改。 有效减少多余的浪费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值