Interface(接口)
Interface是一个特殊的抽象类
Interface 里面的常量都是public,static,final的
里面的方法都是公开的抽象的。(public,abstract)
一个源文件可以有多个接口和类,但只能一个公开的接口或类。
接口不能创建对象,但是可以声明一个接口类型的引用 ,
接口存在的意义是被子类实现,用关键字implements
如果不想让子类也抽象,就要实现接口里面的所有抽象方法。
接口是用来被实现的(implements)
抽象类是用来被继承(extends)。
实现过程中注意访问权限。
接口之间可以继承。接口可以多继承。接口本身支持多继承,继承了父接口里功能的定义。
类可以既继承一个父类又实现多个接口
接口没有构造方法,不能创建对象。
接口作用:
1、多继承
接口是对类的共性进行再次抽象,抽象出类的副类型。
因为接口 次要类型,所以在类关系里不占一个节点,不会破坏类层次关系的树状结构
Class ee extends dd implements aa
2、标准(弱耦合)
一个接口就是一个标准
接口将标准的制定者,标准的实现者以及标准的使用者分离开,降低实现者和使用者的耦合。
接口是java中一种重要的降低耦合的工具。
接口可以屏蔽不同实现类的差异,当底层的实现尖更换后,不会对上层的使用者产生影响,体现在参数和返回值
――――――――――――――――――――――――――――――――――――
1. 接口回调:
先定义接口,然后先有使用者,再有实现者。
利用参数把实现者传给使用者,
使用者利用接口调用实现者里面相应的功能。
public class TestCallBack {
public static void main(String[] args){
Glass glass = new RedGlass();
//Glass glass = new BlueGlass();
Lamp lamp = new Lamp(glass);
lamp.powerOn();
}
}
interface Glass {
public void lightOn();
}
class RedGlass implements Glass {
public void lightOn(){
System.out.println("this red glass light!");
}
}
class BlueGlass implements Glass {
public void lightOn(){
System.out.println("this blue glass light!");
}
}
class Lamp {
Glass glass;
public Lamp(Glass glass){
this.glass = glass;
}
public void powerOn() {
glass.lightOn();
}
}
2. Object 是Java里所有类的直接或者间接父类。
//class Animal extends Object{}
//class Dog extends Animal{}
Object 类里面的所有的功能是所有Java类共有的。
Object 只有共有的功能没有共有的属性。
1)finalize():(protected void)
JVM调用垃圾回收器回收不用的内存前运行该方法。
不用的内存就是没有引用指向的对象。
JVM是做最少回收,不到万不得已,不启动垃圾回收,
尽可能的减少回收次数。
不要在finalize()中释放资源。
System.gc() <====> Runtime.getRuntime().gc()
以上方法是告诉JVM调用垃圾回收器回收不用的内存,
到底什么时候回收还是得看JVM。该方法不是强行调用垃圾回收。“回不回收要看虚拟机高不高兴了,不是一定会回收内存”。
String str=new String(“abc”);
2)toString():返回对象的字符串表现形式。
打印对象时,虚拟机自动调用toString()获取对象的字符串表现格式,
如果本类不提供(即覆盖)toString(),那么使用的是Object类里的相应方法,
打印的就是地址。
1) equals(Object obj):返回boolean类型
写equals的方法。(对象为null,同一对象,)
==是判断变量本身的值是否相等,引用类型数据判断的是地址。
equals判断的是对象内容是否相等。
对于自己的类,应该覆盖equals()。
覆盖时遵循的原则:
①自反性: a.equals(a) == true;
②对称性: a.equals(b) == b.equals(a) -----> true
③传递性: a.equals(b) ----> true
b.equals(c) ----> true
a.equals(c) ----> true
String str1=”hello” //放在字符串池中
String str2=new String(“hello”)// 分配一个新的内存空间。
public class TestString{//字符串是放在字符串池中的,用的时候去字符串池中找,
//不用的时候JVM会去字符串池销毁
public static void main(String[] args){
// String str1="Hello";
// String str2="Hello";
String str3=new String("Hello");//产生两个字符串对象,new和“”产生的,
//字符串池里有一个字符串对象是由""产生的
String str4=new String("Hello");//跟上边的一共产生三个字符串对象
//hello是去字符串池找的
// System.out.println(str1==str2);
//System.out.println(str1.equals(str2));
//System.out.println(str3==str4);
//System.out.println(str3.equals(str4));
String str5=new String("Hello");
String str6=str5;
str5+="World";
System.out.println(str5);
System.out.println(str6);
//String字符串空间一旦分配,是不能改变的,如果想改,只能新建空间
/*************************
***String str7 = "";
****for(int i = 1;i <= 100;i++){
**** str7 = str7+i+",";
****}
*************************/
//StringBuilder StringBuffer都表示字符串,这两个字符串空间是可以改的
/*StringBuilder sb = new StringBuilder("Hello");
sb.append(",");*/
}
类名.方法
System.gc();
System.out. ;
对象.变量
s.name
s.eat();
Package com.kettas.common
==和equals
1基本类型数据 :==(比值)
2引用类型数据:
== :比的是引用(地址)
Equals():如果覆盖了equals,比的是对象的内容
如果没有覆盖使用object类里的equals(),比的是地址。
String str2=”1234”;
Int i4=Intger.parseInt(str2);
String str3=Interger.toString(i4);
String str4=i4+””;
