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 }

 

posted @ 2019-10-17 18:39  红·林  阅读(183)  评论(0编辑  收藏  举报