抽象类

  1. /*
  2. 通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;
  3. 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;
  4. 如果不实现抽象方法,则该子类仍是一个抽象类;
  5. 面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。
  6. */
  7. public class Object1{
  8. public static void main(String[] args) {
  9. Person p = new Student();
  10. p.run();
  11. }
  12. }
  13. // abstract修饰的类叫抽象类
  14. abstract class Person{
  15. public abstract void run(); // 抽象方法
  16. }
  17. class Student extends Person{
  18. @Override
  19. public void run() {
  20. System.out.println("Student.run");
  21. }
  22. }

接口

  1. // 抽象类与接口的对比
  2. abstract class interface
  3. 继承 只能extends一个class 可以implements多个interface
  4. 字段 可以定义实例字段 不能定义实例字段
  5. 抽象方法 可以定义抽象方法 可以定义抽象方法
  6. 非抽象方法 可以定义非抽象方法 可以定义default方法
  7. // 接口的继承
  8. interface Hello {
  9. void hello();
  10. }
  11. interface Person extends Hello {
  12. void run();
  13. String getName();
  14. }
  15. // default方法
  16. public class Object1{
  17. public static void main(String[] args) {
  18. Person p = new Student("xiao wang");
  19. p.run();
  20. }
  21. }
  22. interface Person{
  23. String getName(); // 可以省略前面修饰的public abstract
  24. /*
  25. * default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。
  26. * 如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。*/
  27. default void run() {
  28. System.out.println(getName() + " run");
  29. }
  30. }
  31. // 实现接口需要用到implements关键字,
  32. // 一个类可以实现多个接口class Student implements Person Hello{
  33. class Student implements Person {
  34. private String name;
  35. public Student(String name){
  36. this.name = name;
  37. }
  38. public String getName(){
  39. return this.name;
  40. }
  41. }

静态字段和静态方法

  1. // 静态字段实例
  2. public class Object1{
  3. public static void main(String[] args) {
  4. Person p = new Person("小王",21);
  5. Person m = new Person("小帅",24);
  6. //p.number = 100;
  7. //System.out.println(p.number);
  8. //m.number = 1000;
  9. //System.out.println(m.number);
  10. /*
  11. * 通过演示我们发现 实例变量.静态字段 能够去访问静态字段;实例变量并没有该字段,
  12. * 这是因为编译器会根据实例类型自动转换为 类名.静态字段 来访问静态对象
  13. * 因此,建议直接用 类名.静态字段 来访问静态对象*/
  14. Person.number = 100;
  15. System.out.println(Person.number);
  16. }
  17. }
  18. class Person{
  19. public String name;
  20. public int age;
  21. public static int number; // 静态字段
  22. public Person(String name, int age){
  23. this.name = name;
  24. this.age = age;
  25. }
  26. }
  27. // 静态方法
  28. // 调用静态方法不需要实例,无法访问this,但可以访问静态字段和其他静态方法;
  29. public class Object1{
  30. public static void main(String[] args) {
  31. Person.setNumber(100);
  32. System.out.println(Person.number);
  33. }
  34. }
  35. class Person{
  36. public static int number;
  37. // 用static修饰的方法称为静态方法
  38. public static void setNumber(int value){
  39. number = value;
  40. }
  41. }
  42. // 接口的静态字段
  43. // 接口不能定义实例字段。但是可以有静态字段
  44. public interface Person {
  45. //public static final int MALE = 1;
  46. //public static final int FEMALE = 2;
  47. // 编译器会自动加上public statc final:
  48. int MALE = 1;
  49. int FEMALE = 2;
  50. }