学生系统数组改集合、接口interface

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值