一、项目检查
*、用户注册功能(需求:在控制台输入用户名和密码,经检测以后,若成功,则输出:**注册成功。
public class Mesage { public String name; public String passWord1; public String passWord2; public Mesage(){} public Mesage(String name){ this.name = name; } public Mesage(String passWord1,String passWord2){ this.passWord1 = passWord1; this.passWord2 = passWord2; } } public interface Rule { //用户名检查是否合法 boolean inputName(String name); //两次输入的密码是否一致 boolean inputPass(String Password1,String Password2); }
import Homework1.User; import org.junit.Assert; import org.junit.Test; public class TestUser { User user = new User(); @Test public void Test_Name1(){ String userName = "zhangsan123"; boolean a1 = user.inputName(userName); Assert.assertEquals("用户名不合法",false,a1); } @Test public void Test_Name2(){ String userName = "123ZhangSan"; boolean a1 = user.inputName(userName); Assert.assertEquals("用户名不合法",false,a1); } @Test public void Test_Name3(){ String userName = "Zhang1San@#"; boolean a1 = user.inputName(userName); Assert.assertEquals("用户名不合法",false,a1); } @Test public void Test_Name4(){ String userName = "Zhang1San2"; boolean a1 = user.inputName(userName); Assert.assertEquals("用户名不合法",true,a1); } @Test public void Test_PassWord1(){ String b2 = "123456"; String b3 = "123456"; boolean b1 = user.inputPass(b2,b3); Assert.assertEquals("用户名不合法",true,b1); } @Test public void Test_PassWord2(){ String b2 = "123456x"; String b3 = "123456y"; boolean b1 = user.inputPass(b2,b3); Assert.assertEquals("用户名不合法",false,b1); } @Test public void Test_PassWord3(){ String b2 = "123"; String b3 = "123456"; boolean b1 = user.inputPass(b2,b3); Assert.assertEquals("用户名不合法",false,b1); } }
public class User extends Mesage implements Rule{
//用户名检查 public boolean inputName(String name){ boolean check = false; char[] a=name.toCharArray(); if ((Character.isUpperCase(a[0])||Character.isLowerCase(a[0]))){ for (int i=1;i<a.length;i++){ if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'||a[i]>='0'&&a[i]<='9'){ check = true; } else { check = false; } } } if (check){ for (int j=1;j<a.length;j++){ if (a[j]>='a'&&a[j]<='z'){ check = false; }else if (a[j]>='A'&&a[j]<='Z'){ check = true ; break ; }else if(a[j]>='0'&&a[j]<='9'){ continue; } } } if (check){ for (int j=1;j<a.length;j++){ if (a[j]>='A'&&a[j]<='Z'){ check = false; }else if (a[j]>='a'&&a[j]<='z'){ check = true ; break; }else if(a[j]>='0'&&a[j]<='9'){ continue; } } } return check; }
//密码检查 public boolean inputPass(String Password1,String Password2){ boolean check = false; if (Password1.equals(Password2)){ check = true; }else { check = false; } return check; } } public class Start { public static void main(String[] args) { User obc = new User(); Scanner input = new Scanner(System.in); System.out.println("》 》 》用户注册入口《 《 《"); System.out.println("规则:用户名开头必须是字母,必须含有大小写字母,可以有数字,不可以有其它特殊字符"); System.out.print("请输入用户名:"); obc.name = input.next(); while (!obc.inputName(obc.name)) { System.out.print("请重新输入用户名:"); obc.name = input.next(); } System.out.print("请输入密码:"); obc.passWord1 = input.next(); System.out.print("请再次确认密码:"); obc.passWord2 = input.next(); while (!obc.inputPass(obc.passWord1, obc.passWord2)){ System.out.println("两次输入密码不正确!"); System.out.print("请重新输入密码:"); obc.passWord1 = input.next(); System.out.print("请再次确认密码:"); obc.passWord2 = input.next(); } System.out.println("恭喜你,注册成功!"); } }
二、范型回顾:
1.范型1-数组回顾及优缺点
数组的特点:
1、属于引用数据类型。
2、只能保存同一种数据类型。
3、数组的长度一旦分配不可改变。
优点:可高效运行。
缺点:无法直接删除和增加元素。
2.范型2-ArrayList的使用及缺点分析
操作:
1、定义ArrayList对象
2、增加10,20,30三个元素。
3、修改第一个元素为100
4、删除最后一个元素
5、遍历所有元素,在增加100后输出。
说明:
1、list1目前的数据类型其实是0bject,
所以10和"abc"都可以加。
2、而在计算时,默认当作int数据类型来进行处理的。
3、"abc"无法被强转为int类型,所以出现错误:
...String cannot be cast to class Integer.
3.范型3-入门-用范型解决隐患问题
范型:
1、概念:将数据类型作为可以变化的“参数",就是"范型"。
2、先定义:<数据类型占位符>
3、后使用:在使用时只能是"引用"数据类型。
如:对于集合类(如ArrayList),如果没有指定范型,则默认为<0bject>。
小结:
1、范型定义就是写在<>中的一个占位符,通常是一个大写字母。
习惯上常用字母:E、T、K、V。
2、范型的使用是指在定义容器类(如ArrayList)时指定
具体的引用数据类型,如: Integer。
范型概念
Java 泛型(generics)是JDK 5中引入的一个新特性,
2、泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
3、泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。
这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
回顾:
1、范型定义:ArrayList<E>,其中字母E可自定义。
2、范型使用:ArrayList<Integer>。在使用时动态指定引用数据类型。
范型作用:
1、保证了类型的安全性。
说明:没有泛型,则容器中可以加入任何数据类型的元素,不安全。
2、避免强制转换
说明:消除源代码中的许多强制类型转换,减少了出错机会
3、提升性能
说明:避免了不必要的装箱、拆箱操作,提高程序的性能
4、提高了代码的重用性。
说明:没有范型,就要在定义类使用各种具体的数据类型。
4.范型4-定义-范型类
语法:public class 类名<字母>
5.范型5-定义-范型方法
1、在定义方法时,先定义范型参数并马上用在返回值或形参中。
这样的方法的就是范型方法。
2、范型方法与所在类是否为范型类无关。
范型:将数据类型作为可以变化的“参数",就是“范型"。
三种语法:
1、: <T> void方法名(T变量名)
2、:<T> T 方法名()
3、:<T> T 方法名(T 变量名)
说明:为简化描述,用T代表范型类型,下同。
6.范型6-定义-范型接口
范型接口:指在接口定义时指定范型。
定义
public interface Ishow<T> {
void show(T value);{}
7.范型7-通配符1-问号
1、List<?>就声明了List中包含的元素类型是未知的。
通配符所代表的其实是"一种数据类型",但具体的类型是未知的。
2、ListList<?>并不等同于List<0bject>。
List<0bject>集合中可以包含任何"多种数据类型"的元素。
8.范型8-通配符2-问号extends类
语法: List<? extends类>
作用:限定只能是某个类或者这个类子类呢。
List<? extends类>:
限制条件理解
1、可以接受的集合的数据类型为该类类型
2、或者为该类的子类类型
9.范型9-通配符3-问号super类
语法: List<?super类>
作用:限定只能是某个类或者这个类的"父类"
10.范型10-通配符4-问号extends接口
语法: List<?extends 接口>
作用:限定只能是某个接口
浙公网安备 33010602011771号