Learning_Java_Day_14-15

抽象类

当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类

注意事项

  1. abstract 只能修饰类和方法,不能修饰 属性和其他的
  2. 抽象类无法被实例化(new)
  3. 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为 abstract 类
  4. 抽象方法不能使用 private 、 final 和 static 来修饰,因为这些关键字都是和重写相违背的

最佳实现——模板设计模式

接口

接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来

  • jdk7.0 及以前接口里的所有方法都没有方法体
  • jdk8.0 及以后接口类可以有静态方法,默认实现方法,也就是说接口中可以有方法的具体实现,但需要有 default 关键字

注意事项

  1. 所有方法都为 public 方法,抽象方法可以省略 abstract 关键字
  2. 如果一个普通类要实现接口,必须实现该接口的所有抽象方法
  3. 抽象类实现接口,可以不用实现接口的方法
  4. 不可被 实例化(new)
  5. 一个类可以同时实现多个接口
  6. 接口中的属性只能为 final ,而且是 public static final 修饰符,如 int n = 0; 实则等价于 public static final int n = 0;
  7. 接口中属性的访问方式可以为 接口名.属性名,实现的类名.属性名,实现的类实例化的对象名.属性名
  8. 一个接口不能继承 其他的类,但可以继承多个别的接口,如 interface A extends B,C
  9. 修饰符只能是 public默认

多态特性

  1. 多态参数
  2. 多态数组
  3. 多态传递 如果 IS 继承了 IH 接口,而 Teacher 类实现了 IS 接口,那么,实际上就相当于 Teacher 类也实现了 IH 接口

接口 VS 继承

接口和继承解决的问题不同 继承的价值主要在于:解决代码的复用性和可维护性 接口的价值主要在于:设计,设计好各种规范(方法),让其它类去实现这些方法 接口比继承更加灵活,继承是满足 is-a 的关系,而接口只需满足 like-a 的关系 接口在一定程度上实现代码解耦(即 接口规范性 + 动态绑定)

举个形象的例子:老猴子是父类,小猴子是子类,鱼的游泳功能和鸟的飞翔功能是接口

内部类

定义在外部类局部位置上(比如方法内)

局部内部类(有类名)

局部内部类是定义在外部类的局部位置,比如方法中,并且有类名

注意事项

  1. 不能添加访问修饰符,但是可以使用 final 修饰
  2. 可以直接访问外部类的所有成员,包含私有的
  3. 作用域:仅在定义它的方法或代码块中
  4. 局部内部类—访问—->外部类的成员【访问方式:直接访问】
  5. 外部类—访问—>局部内部类的成员【访问方式:创建对象,再访问】(注意:必须在作用域内)
  6. 外部其他类—不能访问—–>局部内部类(因为局部内部类地位是一个局部变量)
  7. 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问,如 System.out.println("外部类的n2="+外部类名.this.n2)

匿名内部类(无类名 重点!!!)

1.本质是类 2. 是内部类 3. 没有名字(其实是系统分配名字而不显示也不能修改名字) 4. 还是一个对象

		new 类或接口(参数列表){
			//类体
		}

注意事项

  1. 只能使用一次
  2. 可以直接访问外部类的所有成员,包含私有的
  3. 作用域:仅在定义它的方法或代码块中
  4. 匿名内部类—访问—->外部类的成员【访问方式:直接访问】
  5. 外部类—访问—>匿名内部类的成员【访问方式:创建对象,再访问】(注意:必须在作用域内)
  6. 外部其他类—不能访问—–>匿名内部类(因为匿名内部类地位是一个局部变量)
  7. 如果外部类和匿名内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问,如 System.out.println("外部类的n2="+外部类名.this.n2)

最佳实践 当做实参直接传递,简洁高效

定义在外部类成员位置上

成员内部类(没有 static 修饰)

注意事项

  1. 可添加任意类型的访问修饰符,因为它的地位是一个成员
  2. 可以直接访问外部类的所有成员,包含私有的
  3. 作用域:和外部类的其他成员一样,为整个类体
  4. 成员内部类—访问—->外部类的成员【访问方式:直接访问】
  5. 外部类—访问—>成员内部类的成员【访问方式:创建对象,再访问】
  6. 外部其他类—访问—–>成员内部类
  7. 如果外部类和成员内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问,如 System.out.println("外部类的n2="+外部类名.this.n2)

静态内部类(使用 static 修饰)

注意事项

  1. 可添加任意类型的访问修饰符,因为它的地位是一个成员
  2. 可以直接访问外部类的所有成员,包含私有的,但不能直接访问非静态成员
  3. 作用域:和外部类的其他成员一样,为整个类体
  4. 静态内部类—访问—->外部类的成员【访问方式:直接访问】
  5. 外部类—访问—>静态内部类的成员【访问方式:创建对象,再访问】
  6. 外部其他类—访问—–>静态内部类
  7. 如果外部类和静态内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.成员)去访问,如 System.out.println("外部类的n2="+外部类名.n2)

类的五大成员

属性、方法、构造器、代码块、内部类

使用 Hugo 构建
主题 StackJimmy 设计