接口
为什么需要接口?与抽象类的区别?
- 接口就是比“抽象类”还抽象的“抽象类”,可以更加规范的对子类进行约束。全面实现了:规范和具体实现的分离。
- 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是……则必须能……”的思想。
- 接口的本质是契约
- 开发项目往往都是面向接口编程。
如何定义接口?
-
[访问修饰符]interface 接口名 [extends 父接口1,父接口2]{
常量定义 //总是 public static final
方法定义 //总是 public abstract
} -
子类通过implements来实现接口中的规范
-
接口不能创建实例,但是可以用于声明引用变量类型(类似于上一节多态图片)
-
一个类实现了接口,必须实现其中所有的方法,并且这些方法只能是public的
-
接口支持多继承,则类在继承该接口时也需实现继承过程中所有方法。
package testInterface;
public interface MyInterface {//接口中只有常量和抽象方法
/*public static final*/ int MaxSpeed=1200;//接口中这仨修饰词默认有
/*public abstract*/public void test01();
public int test02(int a,int b);
}
package testInterface;
import java.util.Scanner;
public class MyClass implements MyInterface{
@Override
public void test01() {
System.out.println(MyInterface.MaxSpeed);
}
@Override
public int test02(int a, int b) {
return a+b;
}
}
package abstractClass;
import java.util.Scanner;
import testInterface.MyClass;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a ,b ;
System.out.println("input a number:");
Scanner input=new Scanner(System.in);
a=input.nextInt();
System.out.println("input a number:");
Scanner input2=new Scanner(System.in);
b=input2.nextInt();
MyClass myClass=new MyClass();
// myClass.test01();
System.out.println("resule:"+myClass.test02(a,b));
}
}
回调(callback)
package testCallback;
public class darwFrame {
public static void darwFrame(MyFrame f) {//传入父类对象f
System.out.println("启动线程");
System.out.println("增加循环");
System.out.println("查看消息栈");
//画窗口
f.paint();//具体实现根据f对象来定
System.out.println("启动缓存,增加效率");
}
public static void main(String[] args) {
darwFrame(new GameFrame01());
}
}
package testCallback;
public class MyFrame {
public void paint() {
// TODO Auto-generated method stub
System.out.println("开始画图了");
}
}
class GameFrame01 extends MyFrame{
@Override
public void paint() {
// TODO Auto-generated method stub
System.out.println("游戏画图01");
}
}
class GameFrame02 extends MyFrame{
@Override
public void paint() {
// TODO Auto-generated method stub
System.out.println("游戏画图02");
}
}
数组
- 数组是相同数据类型的有序集合
- 数组也是对象,数组元素相当于对象的成员变量
- 数组长度是确定的,不可变的。
基本语法
package testArray;
import to100.Car;
public class test02 {
public static void main(String[] args) {
//声明
int[] a;
int b[];
//创建数组对象
a=new int[3];
b=new int[3];
//初始化
//1.默认初始化:数组元素相当于对象的成员变量,默认值和成员变量的规则一样
//2.动态初始化
a[0]=252;
a[1]=222;
a[2]=242;
//3.静态初始化
int c[]={11,12,33,44};
Car2[] cars={new Car2("bwm"),
new Car2("b"),
new Car2("b")};
}
}
字符串
字符串:不可变字符序列
String str3=“def"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。
String str3 = “def”; 先在内存中找是不是有"def"这个对象,如果有,就让str指向那个"def”.如果内存里没有"def",就创建一个新的对象保存"def". String str=new String (“abcd”) 就是不管内存里是不是已经有"abcd"这个对象,都新建一个对象保存"abcd"。
由String类中equals的源码可知,该方法判断的是2个对象的内容是否相等。
所以上图中2次调用equal都为true。
由下图的内存分析图可知 2次等于的调用结果不同,(等于 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。)