• Java学习笔记之抽象类与接口


    抽象类(abstract)

    抽象类概述一个类被abstract修饰表示这个类是抽象类, 自己定义方法但是不实现方法,后代去实现

    抽象方法:   一个方法被abstract修饰表示这个方法是抽象方法 ,抽象方法没有方法体        

    特点

    1,有抽象方法的类一定是抽象类,抽象类不一定有抽象方法。 抽象类有0-N个抽象方法

    2,抽象类不能实例化,意思是不能new一个抽象类

    3,凡是继承抽象类的类,必须实现抽象类的方法或者自己也是一个抽象类

    4,构造方法和static方法不能是抽象的

    下面为一个实例

    抽象类Person

     1 public abstract class Person {
     2     //私有属性性别
     3     private String sex;
     4     //有参构造
     5     public Person( String sex){
     6         this.sex=sex;
     7     }
     8     //抽象方法
     9     public abstract void doSomething();
    10     
    11 }

    子类Student

     1 public class Student extends Person{
     2 
     3     private String name;//名字
     4     private int age;//年龄
     5     //有参构造
     6     public  Student(int age){
     7         super("男");
     8         this.age=age;
     9     }
    10     public Student(int age,String name){
    11         this(age);
    12         this.name=name;
    13     }
    14     public void doSomething(){
    15         System.out.println("我是学生类实现抽象方法doSomething");
    16     }
    17 
    18 }

    子类Teacher

     1 public class Teacher extends Person {
     2     public Teacher(String sex) {
     3         super(sex);
     4     }
     5 
     6     public void doSomething(){
     7         System.out.println("我是老师类实现抽象方法doSomething");
     8     }
     9    
    10 }

    测试类Text

    1 public class Text {
    2 
    3     public static void main(String[] args) {
    4         Person p=new Student(12);
    5         p.doSomething();
    6         Person p1=new Teacher("男");
    7         p1.doSomething();
    8     }
    9 }

    控制台输出结果为:

    我是学生类实现抽象方法doSomething
    我是老师类实现抽象方法doSomething

    接口(interface)

    作用:专门用抽象方法来定义规范

    接口可以定义属性跟方法:

    属性public static final ,并且必须立马初始化,不写的话会默认加上 public static final如果要写不能跟他们冲突

    1 public static final String MY_AGE="";
    2 int AGE=6;//注意常量的命名规范

    方法

    1,必须全部是抽象方法,不能有非抽象方法,默认加上 public abstract注意第5条例外

    2,如果类要实现一个接口,必须实现这个接口里面的所有的抽象方法。 除非这个类是一个抽象类。

    3,接口不能直接实例化,也就是说不能跟new关键字一起使用。必须有实现这个接口的类来实例化。

    4,java里面类是不能多继承,接口可以多继承

    1 public interface MyInterface extends InterfaceA,InterfaceB {
    2 }

    如果一个类实现了MyInterface接口,那么它也要实现MyInterface继承的接口里的所有方法

     1 public class Person implements MyInterface{
     2     //实现MyInterface接口的方法
     3     @Override
     4     public void play(){
     5         System.out.println("三打一都被反杀,会不会玩?...");
     6     }
     7 
     8     //实现InterfaceA接口的方法
     9     @Override
    10     public void menthodA() {
    11         MyInterface.eat();
    12     }
    13 
    14     //实现InterfaceB接口的方法
    15     @Override
    16     public void menthodB() {
    17         
    18     }
    19 }

    5,还可以定义静态的非抽象方法。(JDK 1.8+) ,JDK 1.8之前是没有的。

    下面是一个体现接口的实例

    问题:本题模拟电脑插入U盘,创建一个接口类(即规范电脑和U盘的接口),使得任何一个牌子的U盘都能插入任何一个牌子的电脑,体会其中思想

    这是UsbInterface类

     1 public interface UsbInterface {
     2     
     3     public final static int WIDTH = 3 ;//
     4     final static public int LENGTH = 10 ;// 5     //读取数据
     6     void  readData();
     7     //写入数据
     8     void  writeData();
     9     
    10 }

    这是KingStone类(金士顿牌U盘)

     1 public class KingStone implements UsbInterface {
     2         //实现U盘的功能
     3     @Override
     4     public void readData() {
     5          System.out.println("--KingStone 优盘数据被读取------");
     6 
     7     }
     8 
     9     @Override
    10     public void writeData() {
    11          System.out.println("--KingStone 优盘写入数据------");
    12     }
    13 
    14 }

    这是SanDisk类(三星牌U盘)

     1 public class SanDisk implements UsbInterface {
     2 
     3     @Override
     4     public void readData() {
     5          System.out.println("--sandisk 优盘数据被读取------");
     6 
     7     }
     8 
     9     @Override
    10     public void writeData() {
    11          System.out.println("--sandisk 优盘写入数据------");
    12     }
    13 
    14 }

    这是DellComputer类(戴尔电脑)

     1 public class DellComputer {
     2     
     3     //判断长,宽是否符合要求
     4     public boolean push(UsbInterface s){
     5         return (s.WIDTH == 3  && s.LENGTH == 10) ;
     6     }
     7     
     8         //插入后准备读取数据
     9     public void read(UsbInterface s){
    10         System.out.println("dell 电脑要读取数据了。。。。。。"); 
    11         s.readData();
    12     }
    13     
    14 }

    这是测试类

     1 public class Demo03 {
     2 
     3     public static void main(String[] args) {
     4         
     5         
     6         DellComputer  dell  = new DellComputer();
     7         SanDisk u = new SanDisk();
     8         KingStone k = new KingStone();
     9         
    10         if(dell.push(u)){
    11             dell.read(u);
    12         }
    13         
    14         if(dell.push(k)){
    15             dell.read(k);
    16         }
    17         
    18     }
    19 
    20 }
  • 相关阅读:
    vs2015+opencv3.3.1 +Eigen 3.3.4 c++实现 薄膜插值 泊松图像编辑(v=0||Δf=0)
    vs2015+opencv3.3.1 实现 c++ 双边滤波器(Bilateral Filter)
    vs2015+opencv3.3.1 实现 c++ 彩色高斯滤波器(Gaussian Smoothing, Gaussian Blur, Gaussian Filter)
    vs2015+opencv3.3.1 实现 c++ 灰度高斯滤波器
    vs2015+opencv3.3.1 实现 c++ 直方图均衡化
    函数形参为基类数组,实参为继承类数组,下存在的问题------c++程序设计原理与实践(进阶篇)
    函数返回值string与返回值bool区别------c++程序设计原理与实践(进阶篇)
    (c++11)随机数------c++程序设计原理与实践(进阶篇)
    实现求解线性方程(矩阵、高斯消去法)------c++程序设计原理与实践(进阶篇)
    Centos ATI 显卡安装,“LCD 信号超出范围” 解决方法
  • 原文地址:https://www.cnblogs.com/sunzhiqiang/p/11693948.html
Copyright © 2020-2023  润新知