@System类&抽象类与接口的区别&Date类
增强for循环:
String [ ] arr=“abcde”;
for(String s:arr){
System.out.println(s);
}
增强for循环的好处是不计入循环次数,所以执行速度快效率高,但是也有弊端,增强for循环不可控,从第一个元素遍历到最后一个元素,而且不记入循环次数。
for循环:
- 迭代for循环(普通for循环):可以控制循环次数
- for each(增强for循环):运行速度快,但是循环次数不可控。
if循环和for循环的嵌套最好不要超过三层,因为超过三层以后很容易会有逻辑上的漏洞。
正则表达式:用来校验字符串的规则。
regex表示正则的类。
例题:
判断用户输入的字符串,要求:2位到5位,由数字,字母,下划线组成,不允许有其他字符。
如果不使用正则表达式,那么代码将及其冗长且易出错;
package com;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
char[] arr=str.toCharArray();
if(str.length()>=2&&str.length()<=5) {
boolean flag=false;
for(char s:arr) {
if(!(s>='a'&&s<='z'||s>='A'&&s<='Z')) {
if(!Character.isDigit(s)) {
if(!(s=='_')) {
flag=true;
}
}
}
}
if(flag) {
System.out.println("不合法");
}
else {
System.out.println("合法");
}
}
else {
System.out.println("不合法");
}
}
}
而使用了正则表达式以后,代码会简洁很多
package com;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
String regex="[0-9a-zA-Z_]{2,5}";
boolean result=str.matches(regex);
System.out.println(result);
}
}
使用了正则表达式的代码,简洁,逻辑清晰,不易出错,这就是正则表达式存在的意义。
正则表达式 [该位置允许出现的字符]{该字符可以出现的次数}
元字符:
.表示任何字符
\d表示数字
\D表示非数字
\s表示空白字符 space
\S表示非空白字符
\w表示单词字符 (数字 字母) word
\W表示非单词字符
*任意多次
+至少一次
?至多一次
matches 匹配 校验方法
使用正则表达式来简单校验手机号 规则: 以1开头,第二位为 3,5,7,8
1[3578]\d{9}另一种非主流写法
1[(3)|(5)|(7)|(8)]\d{9};
使用正则表达式来简单的校验邮箱:
[0-9]\w*@\w+\.com
类只能单继承,也就是说一个类只能继承一个父类,而一个接口,却可以继承多个接口,原因如下:
首先:接口中的方法都是抽象方法,都没有被实现,而抽象类中有的方法不是抽象方法,如果一个类可以继承多个类,恰好这多个类中都有同名的非抽象方法,那么调用时该调用哪一个方法就不知道了,这也是为什么类只能继承一个类的原因,下面将用简单的代码来说明:、
abstract class T{
public viod fun();
}
abstract class T2{
public void fun();
}
如果有一个子类同时集成了T 和T2
class Zi extends T,T2{
那么它在调用fun()方法时系统就无法知道它调用的是哪一个父类的fun()方法。
}
下面用接口来说明一下:
interface Y{
abstract void fun();
}
interface Y2{
abstract void fun();
}
interface Y3 extends Y,Y2{
因为父接口的两个fun()方法都是抽象的,都没有被实现,所以这两个方法是完全相同的两个方法,调用哪一个都是一样的,所以接口可以继承多个接口。
}
下面来介绍一次抽象类和接口的区别:
抽象类:为同一事物,有“血缘关系”
接口: 许多事物都具有的共性功能
拿缉毒犬来举一个例子
abstract class Dog{
//狗的属性和功能
}
abstract class Pig{
//猪 的属性和功能
}
interface JD{
public void jd(); //缉毒方法
}
interface DM{
public void dm(); //导盲方法
}class JDDog extends Dog implements JD{ //这是一条缉毒犬
public void jd();
}
class DMDog extends Dog implements DM{ //这是一条导盲犬
public void dm();
}
class JDPig extends Pig implements JD{ //这是一只缉毒猪
public void jd();
}
缉毒犬有缉毒的功能,但是其他犬没有缉毒的功能,所以将狗的属性,功能写在Dog类中,将缉毒的方法
写在缉毒接口中,不光有缉毒犬,还有缉毒猪,这样缉毒猪也可以实现缉毒接口。还有导盲犬,实现导盲
的接口。各个动物都写在抽象类中,特有的功能写在接口中
假如每个抽象类都是竖着的个体,那么接口就是一个横着贯穿这些抽象类的东西。可以用一幅图来形象的
描述
错误流的输出是随机的,不一定在哪出现