面对对象(接口)

 一.  接口(interface),是一种引用数据类型。

   interface 差不多= = abstract class

  1)接口是has a (继承是is a):“像”我中的一种,是继承体系之外的,用于功能扩展!想扩展就实现,不想就不用实现。
  2)接口中只能声明抽象方法和常量且声明格式都是固定的,定义的所有变量都是static final类型的,只不过可以省略。
注意:接口中声明常量和抽象方法的格式是固定的

1 public interface Test {
2 /*public abstract final*/int SPEED=100;//声明常量
3 /*public abstract 省略了,写也对*/void showInfo();//声明抽象方法
4 }

   3)接口中的方法都是公共抽象方法

1 public interface MyInterface {
2     public abstract void showInfo();
3     void showInfo3();
4     
5     // 推荐写法
6     public void showInfo2();
7 }

 

二.接口的多态现象

  1)接口不能有构造器,因为不能实例化何以初始化,接口只能被“实现”。

  2)具体类实现了一个接口,则必须实现全部的抽象方法,若没有全部实现,则该类为抽象类。所以说,接口约定了具体类的方法,约定了类的外部行为。

  3)具体类可以同时实现多个接口,就是多继承现象。

  4)多重继承:实现类Student具备了驾驶能力,实现类Teacher也具备了驾驶能力,原因是都实现了Drive,两个实现类的能力得到了增强。

  5)接口用implements 表实现,实际是继承关系,可有多个接口(实现),继承用extends 只能有一个继承关系。

  6)一个类既可以继承的同时,又“实现”接口:class A extends B implements C , D;

  7)类与类之间是继承关系,类与接口之间是实现关系,接口与接口之间是继承关系,且只有接口之间可以多继承,即:interface A{},interface B{},interface C extends A , B 但接口多继承时要注意,要避免A、B接口中有方法名相同、参数列表相同,但返回值类 型不相同的情况,因为被具体类实现时,不确定调用哪个方法。

三. 抽象类和接口的异同比较

 1.abstract class和interface有什么区别?

  1)从编程的角度:abstract class在java语言中表示的是一种继承关系,一个类只能使用一次继承关系。而一个类可以实现多个interface。
  2)从问题域角度:abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的约定(协议)而已。

2.抽象类和接口的异同

  1)抽象类和接口都是引用数据类型,他们都不能创建对象,都可以定义抽象方法,都可以实现多态;但是抽象类可以定义非抽象方法,而接口中定义的都是抽象方法。

  2)抽象类和接口都具有传递性。抽象类是单根性(单继承),而接口是多继承;重要的是:抽象类和子类解决的是模块内的问题(代码重用,重写,多态)而接口解决的是模块间的问题。

四.内部类

 在类内部定义的类为成员内部类,在方法里定义的类为局部内部类,被static修饰的为静态内部类。一个类中可有多个内部类。

1)内部类主要用于,封装一个类的声明在类的内部,减少类的暴露。
2)内部类的实例化:实例化时不需要出写对象,非要写的话为:new 外部类名.内部类名();而不是外部类名.new 内部类名()。

 

当内部类定义在外部类的成员位置上,而且非私有,则在外部其他类中可以直接建立内部类对象。格式:外部类名.内部类名变量名= 外部类对象.内部类对象;
Outer.Inner in = new Outer().new Inner();

 

 1 public class Test01 {
 2     public static void main(String[] args) {
 3         
 4         // 【1】创建外部类对象
 5         Outer outer = new Outer();
 6         // 【2】创建内部类对象
 7         Inner inner = outer.new Inner();
 8         inner.showInfo();
 9     }
10 }

3)内部类中可以访问外部类的私有变量

 1 public class Outer {
 2     
 3     private String name = "Outer";
 4     
 5     class Inner{
 6         
 7         public void showInfo() {
 8             System.out.println(name);
 9         }
10         
11     }
12 }

特殊情况:重名,外部类和内部类的变量同名

 1 public class Outer {
 2     
 3     private String name = "Outer";
 4     
 5     class Inner{
 6         
 7         private String name = "Inner";
 8         
 9         public void showInfo() {
10             // String name = "show info";
11             
12             // 访问外部类的私有成员
13             System.out.println(this.name);
14             
15             // 访问外部类的私有成员
16             System.out.println(Outer.this.name);
17             
18         }
19     }
20 }

 

注意事项:
  当内部类中定义了静态成员,该内部类必须是static的。
  当外部类中的静态方法访问内部类时,内部类也必须是static的。
4)内部类想调用外部类的成员,需要使用:外部类名.this.成员,即Outter.this表示外部类的对象。如果写this.成员= =成员,调用的还是内部类的成员(属性或方法)。

 

posted @ 2019-04-25 20:12  abcdjava  阅读(162)  评论(0编辑  收藏  举报