抽象 接口 静态代理
- 抽象类
- 专门是用来被继承的
-
语法 : 抽象类不可以被直接实例化,抽象类可以拥有抽象方法
- 抽象类不可以被final继承
1 public abstract class testPM { 2 String name; 3 4 public testPM(String name) { 5 this.name = name; 6 } 7 //定义抽象方法 8 //抽象方法专门被用来重写的 9 //不需要代码的具体实现 :用{} 后面跟个分号就行了 10 public abstract void study(); 11 12 public void study(int day) { 13 14 } 15 }
抽象类继承抽象类
1 public class abtest extends testPM{ 2 //继承自抽象类 必须实现抽象类里面的所有抽象方法 3 @Override 4 public void study() { 5 6 } 7 8 //如果抽象类里面没有无参构造,必须指明调用哪个有参构造 9 public abtest() { 10 super(""); 11 } 12 }
实体类继承抽象类
1 package day06; 2 3 public abstract class abtest2 extends testPM{ 4 public abtest2() { 5 // TODO Auto-generated constructor stub 6 super(""); 7 } 8 9 @Override 10 public void study() { 11 // TODO Auto-generated method stub 12 13 } 14 }
- 接口
- 使用关键字interface声明接口
- 作用 : 对所有子类的方法(行为)进行规范
- 接口不能直接实例化对象
- 接口中不能有构造方法
- 声明方法:接口中声明的方法默认使用public abstract修饰
1 public abstract void test(); 2 //void test1(); //也可以
- 声明属性 : 在接口中的属性默认是public static final
1 String a = ""; 2 //public static final String b = "";
- 实体方法
- 接口只能声明default访问类型的实体方法
1 void f(); 2 default void t() {}
public interface Truck { //接口 //使用关键字interface声明接口 //作用 : 对所有子类的方法(行为)进行规范 //接口不能直接实例化对象 //接口中不能有构造方法 //声明方法:接口中声明的方法默认使用public abstract修饰 public abstract void test(); //void test1(); //也可以 //声明属性 : 在接口中的属性默认是public static final String a = ""; //public static final String b = ""; //实体方法 //接口只能声明default访问类型的实体方法 void f(); default void t() {} }
1 public interface Truck2 { 2 String a = ""; 3 default void f() {} 4 default void t() {} 5 }
1 package day06; 2 3 public class BigTruck implements Truck,Truck2{ 4 //使用implements实现接口 5 //实现类必须重写,接口中的抽象方法 6 //java中支持多实现,使用逗号隔开 7 //抽象犯法重名可以,但是提方法重名就不行 8 9 @Override 10 public void test() { 11 // TODO Auto-generated method stub 12 13 } 14 15 @Override 16 public void f() { 17 // TODO Auto-generated method stub 18 this.t(); 19 } 20 21 @Override 22 public void t() { 23 // TODO Auto-generated method stub 24 Truck.super.t(); 25 } 26 27 28 }
- 声明一个图形接口,有个画图的方法
- 三个实现类,矩形,圆形,三角形
- 编辑一个测试方法,从控制台输入所需的图形
- 调用指定类实例,调用指定类实例的画图方法
1 package day06; 2 3 import java.util.Scanner; 4 5 public class GraphTest { 6 public static void main(String[] args) { 7 System.out.println("开始你的表演!"); 8 Scanner sc = new Scanner(System.in); 9 String inputString = sc.next(); 10 if(inputString.equals("三角形")) { 11 Triangle triangle = new Triangle(); 12 triangle.draw(); 13 } 14 else if (inputString.equals("矩形")) { 15 Rectangle rectangle = new Rectangle(); 16 rectangle.draw(); 17 } 18 else if (inputString.equals("圆形")) { 19 Round round = new Round(); 20 round.draw(); 21 } 22 else { 23 System.out.println("输入有误,请重新输入"); 24 } 25 } 26 }
1 package day06; 2 3 public interface Graph { 4 public abstract void draw(); 5 }
package day06; public class Round implements Graph{ public void draw() { // TODO Auto-generated method stub System.out.println("wow! 你打印了一个圆形"); } }
1 package day06; 2 3 public class Triangle implements Graph{ 4 public void draw() { 5 // TODO Auto-generated method stub 6 System.out.println("wow! 你打印了一个三角形"); 7 } 8 }
1 package day06; 2 3 public class Rectangle implements Graph{ 4 public void draw() { 5 // TODO Auto-generated method stub 6 System.out.println("wow! 你打印了一个矩形"); 7 } 8 }
- 静态代理
- 生产者和代理者都实现了同一个接口
- 代理者对生产者进行了一个调用
1 package day06; 2 3 public class Test { 4 public static void main(String[] args) { 5 Rectangle rect=new Rectangle(); 6 Shape rp=new RectangleProxy(rect); 7 String str=rp.draw(); 8 System.out.println(str); 9 } 10 }
1 package day06; 2 3 public interface Shape { 4 5 String draw(); 6 }
1 package day06; 2 3 public class RectangleProxy implements Shape { 4 private Rectangle rect; 5 6 7 public RectangleProxy(Rectangle rect) { 8 super(); 9 this.rect = rect; 10 } 11 12 13 @Override 14 public String draw() { 15 // TODO Auto-generated method stub 16 String s=rect.draw(); 17 System.out.println("对"+s+"进行涂色"); 18 return "涂色后的"+s; 19 } 20 21 }
1 package day06; 2 3 public class Rectangle implements Shape { 4 5 @Override 6 public String draw() { 7 // TODO Auto-generated method stub 8 System.out.println("画出一个矩形"); 9 return "矩形"; 10 } 11 12 }