package package1;
import package2.studentManage.domain.Student;
import java.util.ArrayList;
public class M10 {
public static void main(String[] args) {
ArrayList<Student> s = new ArrayList<>();//放到成员位置,并私有化,不让外类随便访问
Student s1 = new Student("1", "1", "1", "1");
Student s2 = new Student("2", "2", "2", "2");
s.add(s1);
s.add(s2);
Student[] stu1 = new Student[s.size()];
/* if (s.get(0)==null){
return null;
}//------------如果s.size()==0,则for循环走不了,返回的是空的stu1,为null
*/
for (int i = 0; i < s.size(); i++) {//stu1和s的长度一样
for (int j = 0; j < stu1.length; j++) {
stu1[j] = s.get(i);
}------------千万要注意循环中的循环,外循环是1进来的,内循环要走完所有循环才会结束,然后外循环再加1,再进入内循环重新走完所有内循环,这样出来的结果全部都是2222
}
for (int i = 0; i < stu1.length; i++) {
System.out.println(stu1[i].getSid()+stu1[i].getName()+stu1[i].getAge()+stu1[i].getBirthday());
}
}
}
for (int i = 0; i < s.size(); i++) {//stu1和s的长度一样
for (int j = 0; j < stu1.length; j++) {
stu1[j] = s.get(i);
}------------千万要注意循环中的循环,外循环是1进来的,内循环要走完所有循环才会结束,然后外循环再加1,再进入内循环重新走完所有内循环,这样出来的结果全部都是2222
数组→集合
数组缺点:
1.容器长度固定
2.没有提供增删改查的方法
在修改时需要注意的点:
从数组切换到集合时,尽量保证Dao中返回给Service的数据类型不变动,以免需要重新编辑Service
接口:
(接口+实现类+创建实现类对象)(实现类重写接口的方法,实现类对象用来调用方法)
当一个类中所有方法都是抽象方法,我们可将其定义为接口,接口是一种引用数据类型
接口存在的意义:
1.规则定义
2.程序的扩展性(功能扩展)-----实现多个接口,可以有多种方法
接口用关键字interface定义
public interface 接口名{ }
接口不能实例化(接口里都是抽象方法,没有具体功能,创建了也毫无意义)
接口和类之间是实现关系,记住不是继承关系!!!用implements关键字表示
public class 类名 implements 接口名 { }
接口的子类(即实现类)-------------------实现类取名方式:接口名+Impl
1.要么重写接口中所有抽象方法
2.要么自己变成抽象类
可多实现(当多个接口出现方法重名问题,因其都是抽象类,未重写的,统一按一个算,最终由实现类重写)
public class 类名 implements 接口1 , 接口2 { }
接口中成员特点:
成员变量:只能是常量(自定义常量,因为被final修饰)
系统默认修饰符:public static final (static表明可以用接口名.调用成员变量,final表明只能赋值一次)
为什么成员变量要设计成常量呢?
可以理解为经常用到的变量(固定的值)
构造方法:无 --------检测方式:可以在接口内自行定义构造方法,会编译报错
(实现类中默认的super() ,是继承自object)
成员方法:只能是抽象类
默认修饰符:public abstract (但JDK8和JDK9有新特性)
[JDK8,+∞):只对成员方法进行改进
如果接口升级,所有该接口的实现类,全部都必须重写,否则报错
针对 在接口有变动,新增方法,又不对实现类代码进行修改 这一问题
允许接口中定义带有方法体的方法(非抽象),但需要使用default关键字
作用:解决接口升级问题
格式:(接口所有权限符都为public,除了抽取出来的语句才用private修饰)
public default 返回值类型 方法名(参数){ }
public default 可以省略,系统会自动加上
接口中的default方法,可以被实现类重写,但不能带default(默认方法不是抽象方法,所以不强制重写)
若实现类实现两个以上的接口,接口中又重名的默认方法(),那么实现类必须重写该方法
接口中允许定义static方法(不能是static default)(个人理解是为了方便其他static的调用,或自身接口名.调用更简洁)
格式:
public static 返回值类型 方法名(参数){ }
public 可省略
注意:只能用接口名.调用,不允许用实现类对象名或实现类名.调用
[JDK9,+∞):方法只为inter接口服务,不许外类访问(一般 用于相同内容的抽取)
格式:
private void show() { }
private static void method() { }
-----静态的私有方法和非静态的私有方法作用一样,只是因为在JDK8中允许定义静态方法,而静态方法里只允许调用静态成员
这时默认方法a和b中存在着相同语句sout("我是重复的内容"),此时可以抽取出来
private void show(){sout("我是重复的内容")}
public default void a(){
sout("ssss");
sout("我是重复的内容") → 改为 show();即可
}
public default void b(){
sout("qqqqqq");
sout("我是重复的内容") → 改为 show();即可
}
接口的使用思路:(注意JDK版本)
1.如果发现一个类中所有方法都是抽象方法,那么可以将该类该进为一个接口
2.涉及到接口大面积更新方法,而不想去修改每一个实现类,就可将更新的方法定义为带有方法体的默认方法
3.希望默认方法调整更整洁,可考虑设计为static静态方法(需去掉default)
4.默认方法中出现重复代码,可考虑抽取出私有方法(需去掉default)
类和类:继承关系
类和接口:实现关系,但类也可继承和实现都有,当父类和接口有重名方法时,优先使用父类
ps:若接口和接口重名时,实现类必须重写,用自己的
接口和接口:继承关系,可单继承和多继承
格式:public interface interC extends interA , interB {}
若接口A和B有重名方法,接口C必须重写
抽象类转接口:
public abstract class A → public interface A
编译(编写)阶段报错
运行阶段报错
java的接口中为什么不能存在静态代码块?
在类中,静态代码块的作用通常是给类中的静态成员方法初始化,
而在接口中,所有的变量都被默认定义成final了,也就是常量。
常量在声明时就必须为其初始化,所以静态代码块在接口中就没有存在的必要了。
所以在接口中放一个静态代码块时IDEA会报错:not allowed in interface