抽象类(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 }