接口
在进入接口学习提几个重要的关键字。
一.static
-
static修饰类中的属性(成员变量)
static是一个修饰符,可以修饰类中的属性、方法、类中的代码块。
1.1 static修饰的属性在内存中只存在一份,可以理解为共享。静态的成员可以通过对象去去访问,也可以用类名.静态成员去访问。如果让代码写的规范,我们对静态成员的调用都采用类名.静态成员去访问。
注意:静态成员和非静态成员的区别,静态成员一般都是在类加载的过程中分配内存空间,而非静态成员都是在有了对象之后我们才可以用对象去访问。这里切记类加载的过程都是在创建对象之前就已经发生了,不管创建多少个对象,类加载只需要做一次。
1.2 在上述可以看到我一直在说类加载,这个概念我在这里总结一下,我们知道我们写的源程序一般都保存在一个.java文件上面,我们在运行程序的时候是需要将我们的程序进行编译成.class文件然后通过一个类加载器加载到JVM内存中,并为这个类分配空间。这里附一个图片加深一下理解:
-
static用来修饰类中的方法成员
这里可以类比static修饰成员变量,非静态的方法必须创建对象然后才能调用,静态方法可以通过类名.方法名()。因为静态的方法可以在所有的对象创建之前去调用的,但是静态方法中可以访问静态的成员,在非静态的方法中可以访问静态的成员。这里切记不能弄反了,静态的方法中是不能去访问非静态的成员,因为这里静态方法是在创建对象之前就加载出来,如果去调用非静态方法的话就会出现错误,说的通俗一点就是出生了的小孩去找未出生的小孩耍。这种是严重的逻辑错误。
扩展一下:如果一个类中没有属性的定义,此时创建多个该类的对象没有太大的意义,所有这里我们可以将类中的方法设计为static类型,无需创建对象去调用,直接用类名去打点调就可以了。我们把这些类称为一个”工具类“ -
static用来修饰代码块
普通代码块写在{
JAVA语句;
}这种写法很少,提一下即可。
如果我们使用static进行修饰代码块,这种叫”静态代码块“,在静态代码块中不能访问属于对象的成员,因为它是在类加载的过程中就自动执行这一块内容。静态代码块可以访问静态的成员变量,这里类比静态方法的访问。(已经出生的小孩找还未出生的小孩耍)
静态代码块有什么用呢???
答:可以帮助我们进行一些初始化的准备工作,例如读取一些配置信息。
二.final
它表示最终的,可以修饰类、类中的成员变量、类中的方法、方法中的局部变量。
- 被final修饰的类是不能被继承,常见的有String类
- final可以修饰一个成员变量,赋值后不能被改变
- final可以修饰方法成员,如果父类中有一个方法被final定义后,子类是不能对它进行覆盖的。
- final还可以修饰方法中的局部变量,被final修饰的局部变量在方法中是不能对他做值的修改操做的。
切记:如果final修饰的是一个引用类型的变量。也就是存放在栈中这个地址不能被改变,但是在存放在堆中的值可以被改变。所以如果堆中的值改变后,虽然引用类型的指向地址没有改变,但是值发生了变化。
三.接口
接口的定义:比抽象还抽象的一种行为。
- 接口中只能做方法的规范,因此在接口中方法定义时需要加上public abstract。但是我们在接口中可以省略;
- 如果有一个类去implements接口,这个类我们叫做实现类,但是在我心里我把实现类当做子类去理解。
- 接口也是多态的一种表现形式,多态分为两种:继承多态与接口多态
- 接口和继承不一样,继承只能单继承,但是接口可以多实现。多实现是针对某种需求的,如一个人的身份可能有多种,他的行为就可能出现多种。
- 把一个类定义为一个父类给子类去继承,父类的行为和属性一定是抽象了它所有子类的共性。如果不能同时找到某些类的共同父类的话,可以进行行为的抽象,这种抽象我们可以做成一个接口。
- 接口中我们不能定义常规属性,接口中定义的属性都是常量的,一般用public static final修饰
补充一下接口的作用:
- 如果在开发中有很多的常量信息,我们可以把这些常量统一定义在一个相同的位置,方便管理。这个位置就是——接口,用接口去定义常量我们称为”常量接口“,因为在接口中的属性默认为final类型。常量接口定义的规范例子:
public interface Constants {
public static final String SYS_CONFIG1="aaa";
public static final String SYS_CONFIG2="bbb";
}
切记:
接口中是不能定义构造方法的,也不能直接创建对象。这里我把抽象类拿出来做一个总结
- 抽象类和接口一样不能直接去创建对象,但是抽象类中可以有构造方法,而接口没有。虽然不能直接去创建对象,但是我们一般会去new子类对象(或者实现类)去创建对象。
- 抽象类中可以定义成员变量,而接口中的成员变量都是final类型的。
- 抽象类中可以定义抽象方法和普通方法,抽象方法去约束子类必须实现这个方法,普通方法可以选择。在接口中的方法只能是抽象方法,但是呢,注意啊但是啊,在JAVA高版本加入了新特性我们可以定义默认的方法,使用default关键字去声明,这样我们就不会强制对实现类实现接口中的方法了。