接口

1. final关键字

1.1 final修饰属性

1.1.1 普通常量

常量 final修饰的属性 称之为常量 名字全部大写 多个单词下划线分割 通常在定义的时候赋值 或者在构造方法中赋值

  1. package com.qfedu.test1;
  2. /**
  3. * 常量
  4. * 只有final修饰的属性 称之为常量
  5. * 名字全部大写 多个单词下划线分割
  6. * 通常在定义的时候赋值 或者在构造方法中赋值
  7. * @author WHD
  8. *
  9. */
  10. public class TestFinalField {
  11. String name;
  12. final double PI = 3.14;
  13. final double NUM ;
  14. public TestFinalField() {
  15. NUM = 20;
  16. }
  17. public TestFinalField(String name) {
  18. NUM = 30;
  19. }
  20. }

1.1.2 静态常量

静态常量 名字全部大写 多个单词以下划线分割 通常在定义的时候赋值 或者在静态代码块中赋值 这两种赋值方式都是为了保证在使用之前有具体的值

  1. package com.qfedu.test1;
  2. /**
  3. * 静态常量
  4. * 名字全部大写 多个单词以下划线分割
  5. * 通常在定义的时候赋值 或者在静态代码块中赋值 这两种赋值方式都是为了保证在使用之前有具体的值
  6. *
  7. * @author WHD
  8. *
  9. */
  10. public class Calc {
  11. public final static double PI;
  12. static {
  13. PI = 3.14;
  14. }
  15. static final String COUNTRY_NAME = "中华人民共和国";
  16. double radio;
  17. public double around() {
  18. return PI * radio * 2;
  19. }
  20. public static void main(String[] args) {
  21. // pi = 3.24;
  22. }
  23. }

1.2 final修饰方法

final修饰方法 表示此方法可以被继承,不能被重写

  1. package com.qfedu.test1;
  2. /**
  3. * final修饰方法 表示此方法可以被继承,不能被重写
  4. * @author WHD
  5. *
  6. */
  7. public class TestFinalMethod {
  8. public final void m1() {
  9. System.out.println("final修饰的方法");
  10. }
  11. }
  12. class A extends TestFinalMethod{
  13. // public void m1() {
  14. // System.out.println("final修饰的方法");
  15. // }
  16. public static void main(String[] args) {
  17. A a = new A();
  18. a.m1();
  19. }
  20. }

1.3 final修饰类

final修饰的类不能被继承

  1. package com.qfedu.test1;
  2. /**
  3. * final修饰的类不能被继承
  4. * @author WHD
  5. *
  6. */
  7. public final class TestFinalClass {
  8. }
  9. //class B extends TestFinalClass{
  10. //
  11. //}

2. 接口

1.接口中默认都是全局抽象方法 不管是否书写 public abstract 都有这个效果 2.接口不能直接new对象 必须通过new实现类(子类)的方式创建对象 多态向上转型 3.实现类必须重写接口中的所有抽象方法,除非实现类也是抽象类或者接口 4.接口中不能写普通属性 默认都是全局静态常量 不管是否书写public static final都有这个效果 5.接口中不能写构造方法 6.接口可以继承多个接口 实现类可以实现多个接口 7.接口依然可以实现多态 实现的方式与之前一致

面试题:Java支持多继承吗? 不支持,但是我们可以通过接口继承多个接口的方式 模拟多继承的效果

  1. package com.qfedu.test6;
  2. /**
  3. * 打印机类
  4. * 组成部分
  5. * 墨盒
  6. * 纸张
  7. * @author WHD
  8. *
  9. */
  10. public class Printer {
  11. private InkBox inkBox;
  12. private Paper paper;
  13. public void setInkBox(InkBox inkBox) {
  14. this.inkBox = inkBox;
  15. }
  16. public InkBox getInkBox() {
  17. return inkBox;
  18. }
  19. public void setPaper(Paper paper) {
  20. this.paper = paper;
  21. }
  22. public Paper getPaper() {
  23. return paper;
  24. }
  25. public void print() {
  26. System.out.println("使用" +this.getInkBox().getInkBoxType()+ "在" + this.getPaper().getPaperType() +"纸张上打印");
  27. }
  28. }
  1. package com.qfedu.test6;
  2. public class BlackInkBox implements InkBox{
  3. @Override
  4. public String getInkBoxType() {
  5. return "黑色墨盒";
  6. }
  7. }
  1. package com.qfedu.test6;
  2. public class ColorInkBox implements InkBox{
  3. @Override
  4. public String getInkBoxType() {
  5. return "彩色墨盒";
  6. }
  7. }
  1. package com.qfedu.test6;
  2. public interface InkBox {
  3. String getInkBoxType();
  4. }
  1. package com.qfedu.test6;
  2. public interface Paper {
  3. String getPaperType();
  4. }
  1. package com.qfedu.test6;
  2. public class A4 implements Paper{
  3. @Override
  4. public String getPaperType() {
  5. return "A4";
  6. }
  7. }
  1. package com.qfedu.test6;
  2. public class B5 implements Paper{
  3. @Override
  4. public String getPaperType() {
  5. return "B5";
  6. }
  7. }
  1. package com.qfedu.test6;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Printer hp = new Printer();
  5. InkBox black = new BlackInkBox();
  6. InkBox color = new ColorInkBox();
  7. hp.setInkBox(color);
  8. Paper a4 = new A4();
  9. Paper b5 = new B5();
  10. hp.setPaper(b5);
  11. hp.print();
  12. }
  13. }