知识回顾:
1) 面向对象,面向过程,面向接口
a) 老牌,传统,思考方式:面向过程,思考方式和日常我们考虑问题一样。遇到需求频繁修改时,设计就崩溃。因为用户他不是软件人员,他说不清一些潜在需求,导致做出来的东西和他理解是不同。软件返工,甚至软件失败。
b) 面向对象是主流思考方式,它想的“多”,超出用户需求,从而提前做了些用户潜在需求中内容。所以当用户提出需求变更,新的需求时,其实我们提前做好了。这就是面向对象优势。
c) 举例:用户第一次需求,查询出现在讲课的老师姓名。面向过程思考,就把老师姓名给他完成任务。面向对象思考,它会做很多事情。老师姓名、年龄、籍贯、工作单位、家庭地址、家庭成员。。。。思考准备内容更多。新的需求,用户又说,我想知道这个老师他的家庭情况。第一种面向过程都加入新的代码,第二种思考已经做好了,直接返回就可以。
d) 面向接口和面向过程、面向对象根本不是一回事,不能一起比较。它们描述不同东西。面向过程、面向对象是一种软件设计思考方式,关注问题点不同。而面向接口只是具体编程一个策略。比如:接口来定义规范,厂商去实现规范。它的作用规范,例如:JDBC规范,sun公司java就提供很多接口,mysql数据库厂商根据这些接口规范要求,去实现具体数据库访问。
2) 面向对象是设计思想,具体要完成软件需要载体。在java中称为class。
a) 类,描述一类事物抽象,People,Cat(蓝图,图纸,死的) b) 对象,具体的事物,哪个人?哪个猫。(实例,活动) c) 类 对象
= new 类();Cat cat = new Cat();
3) 类的结构
a) 成员变量,保存类中数据,name=”tony”,tony是数据,name保存数据 b) 普通方法,加工处理,work(),算法
c) 构造方法,用来创建对象(new)和设置成员变量初始化值,构造方法只执行一个
i. 默认无参构造,如果没有其他方法java编译器会自动加默认构造,死记;自己写默认构造可以。
ii. 有参构造,不但创建对象,而且设置成员变量初始化值
4) 成员变量和局部变量(声明周期)
a) 在类同级声明的这些变量,称为成员变量。类在创建时,这些成员变量也被创建,类(对象)没有其他地方调用,当对象结束时,这些成员变量也随之消亡。
b) 在方法体内,包括方法的参数,都是局部变量。当方法结束局部变量就消失。
c) 应该定义尽量小生命周期(作用域)变量早消亡,它所占用的内存就早腾出来。就可以放其他的应用程序的变量。
5) 方法:实参和形参
a) 实际的参数,具体的值。work(“tony”); b) 形式的参数,临时中间变量,不是具体值。public void
work(String name){ name }
6) static和非静态方法调用
a) 少于static b) static可以不用new创建对象,而直接调用,HelloWorld.hello();
c) 非static就必须先创建对象,才可以调用 new HelloWorld(); hw.hello();
7)this上下文变量,单纯的看this不知道它是哪个类?
People,Cat类,在Cat类中使用this,this就代表Cat,在People类中使用this,this就代表People
一般情况下是隐性使用,声明成员变量name,就可以在类中各个普通、构造方法中使用name,此时这个name,真实this.name。
当一个方法内,它的参数和成员变量同名。要区分它们:this.name=name;前面name就是成员变量,后面name是参数。
8) pojo 简单的java对象(纯粹java对象)
a) 一堆的私有属性,用户不能直接访问这些成员变量,必须通过set去设置,通过get去获取。好处封装细节,set过程和get过程都是开发者控制的,对于使用用户根本不知道过程中干了什么事情?如果直接使用成员变量,用户干的过程都是透明。你设置什么它就是什么name=”abc”。如果通过set后,判断如果是abc,改成a1b2c3(假定),用户是不知道实际值被篡改。
b) 一堆get/set方法,扩展性很好,安全性,结构松耦合。程序更加灵活
c) 为了测试方便,观察对象中成员变量的值是否正确,可以toString()方法
今天内容:
- ) 字符串处理,日期、浮点数
- ) 自己写一些转换工具类(方法)api
- ) 字符串和字符差异
a) String,存储多个字符
b) Char,存储一个字符
2) Jdk/jre
-
Java提供非常丰富基础工具类,在jdk,一部分jre。 JDK,java deveploer
-
kit,java语言开发者工具包 JRE,java runtime enverment,java运行时环境
-
JAVA_API_CN.CHM
-
Java 2 SE(标准工具库,直接利用写好的工具类,开发就更加快速,不用自己写)jdk java 2
-
EE(javaWeb、tomcat web中间件、三大框架、微服务)企业级开发 java 2 ME(嵌入式,智能家居)
-
java自身已经有些没落,但是java是一个开放平台,指定很多规范j2ee,各个厂家为之实现替代jdk很多功能,扩展它的很多功能。自身狭义java没落,但是广义java方兴未艾,非常类。互联网架构,扩展java,根在java,调用javase/ee,Dubbo阿里,MyCat数据库增强,lucene+solr全文检索,Haddop、Spark、Storm、Flink等都是java语言写的,必须依赖使用java
api,JDK
2)在java世界中万物皆对象?
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
//包装类似父类
Byte b = 10;
//打印b的类名
System.out.println( b.getClass().getName());
//打印b的父类(superClass)
System.out.println( b.getClass().getSuperclass());
System.out.println( b.getClass().getSuperclass().getSuperclass());
Integer i = 10;
System.out.println( i.getClass().getName() );
System.out.println( i.getClass().getSimpleName() );
System.out.println( i.getClass().getSuperclass() );
System.out.println( i.getClass().getSuperclass().getSuperclass());
Double d = 10D; //d明确告知它是一个浮点数,大小写都可以
System.out.println( d.getClass().getName() );
System.out.println( d.getClass().getSuperclass() );
System.out.println( d.getClass().getSuperclass().getSuperclass() );
Character c = 'a'; //它就直接继承Object类,就没有爷爷了
System.out.println( c.getClass().getName() );
System.out.println( c.getClass().getSuperclass() );
System.out.println( c.getClass().getSuperclass().getSuperclass());
Cat cat = new Cat(); //自己定义类,它有父亲吗?
System.out.println( cat.getClass().getSuperclass() );
}
}
在java中所有类它都是继承自Object类,它的父类也叫超类,SuperClass 问题:java中为何这样设计呢?从一个点去看
我们写的Cat没有写toString()方法,但是它怎么有呢? 但是cat对象有toString()方法cn.tedu.Cat@659e0bfd cn.tedu.Cat,类的全路径,包名.类名 @
659e0bfd(0x11),就可以理解为它在内存中的地址
我们自己写的类,悄悄继承Object类,继承后,Object的一些方法(财产)直接我们也可以使用。在Object类中定义toString方法。
3) 字符串处理一些工具类方法
- …可变参数,可以支持2个参数,3个参数,n个参数(新版本才支持方式)
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
Integer i = 100;
//最普通方法,结构不清晰,4个部分在拼串
System.out.println("整数的值是"+i+",它的父类是:"+i.getClass().getSuperclass());
//清晰结构format,这种方式术语叫做占位符
System.out.println(
String
.format("整数的值是%s,它的父类是:%s", i , i.getClass().getSuperclass() )
);
}
}
Concat字符串连接
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String s1 = "中国"; // u8
String s2 = "deflaskdfjalwkejfoaiwjef;oaiwjefoaijeoijeofaiwjefoaijweofiajeoi";
System.out.println(s1 + s2); // 连接符,字符串拼接
System.out.println(s1.concat(s2));
System.out.println(s1.length());
System.out.println(s2.length());
// 这个字符串中前后有空格,中间有空格
String s = " 中国这次疫情发展非常快, 策略实施也非常快 ,封城,封街道,封小区,避免病毒传播 ";
System.out.println(s);
System.out.println(s.trim());
String c = "中国新疫情";
System.out.println(c.charAt(0)); // java规定第一个0
System.out.println(c.charAt(1));
System.out.println(c.charAt(4));
String e = "cat";
// 获的首字母
System.out.println(e.charAt(0));
System.out.println(e.toUpperCase());
System.out.println(e.toLowerCase());
// 截取字符串 sub子串,从开始位置到最后at
System.out.println(e.substring(1));
// 首字母大写 Cat
e = "tonychen";
// 第一步:获取首字母
System.out.println(); // 换行,空一行
String a1 = e.charAt(0) + ""; // 技巧,java会自动按字符串来转换
System.out.println(a1);
// 第二步:首字母大写
String a2 = a1.toUpperCase();
System.out.println(a2);
// 第三步:截取后面字符串
String a3 = e.substring(1);
System.out.println(a3);
// 第四步:拼接字符串
System.out.println(a2 + a3);
}
}
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
//要求:135-728-01415
String phone = "13572801415";
//第一步截取字符串,3个子串,中间使用-连接
String s1 = phone.substring(0,3);
String s2 = phone.substring(3,6);
String s3 = phone.substring(6);
String s = s1 + "-" + s2 + "-" + s3;
System.out.println(s);
}
}
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String email = "wq@tedu.cn";
//不能固定位置截取字符串,找特征地方
//先找到@不固定位置,格式是固定
int pos = email.indexOf("@");
System.out.println(pos);
String s1 = email.substring(0, pos); //@前面位置
String s2 = email.substring(pos+1); //@后面位置
System.out.println( s1 );
System.out.println( s2 );
}
}
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String filename = "girl.gif";
//需求:获取后缀名称,带.mp4
//获取最后一个点的位置
int pos = filename.lastIndexOf(".");
System.out.println(pos);
System.out.println( filename.substring(pos) );
}
}
小结:
- 万物皆对象,在java中所有类都是Object的子类,都是它儿孙。如果自己创建类没有写,java会自动默认Object是它的超类Superclass
- 包装类型,Number(byte/short/int/long/float/double),Object(char/boolean)
- 字符串,在开发中使用最频繁。Jdk有很多占用方法来支持字符串处理(jdk/jre)java.lang.*
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String phone = "13572801415";
String s1 = phone.substring(6);
System.out.println(s1);
String s2 = phone.substring(6,11);
System.out.println(s2);
}
}
3) this是谁,是类还是对象
this代表对象,习惯this代表类。(两种说法都可以) Cat cat = new Cat();
this代表cat,习惯说法this代表Cat类。
4) 包装类型和基本类型区别?
基本类型就没有额外方法,哪里来的getClass方法? 包装类型 Charater c,包装类型,它带有getClass()
5) java没有数据库,说法错误,
java访问数据库,通过jdbc,标准结构方式去访问mysql,oracle
阿里云,它提供电脑,你远程使用,阿里云上可以部署数据库,你就可以访问数据库,但是它可以部署很多东西,nginx、redis、rabbitmq、kafka等等,这些都可以放在阿里云上。它可以提供服务,也可以提供这些程序。
阿里云和数据库没有本质关系,不可直接进行比较。没有可比性。
6) get方法里的return作用?
public Integer get(Integer x, Integer y){ return x+y; } return
就是返回的作用。把x+y结果返回给调用这个方法的地方。 Integer z = get(10,20);,把30赋值给z变量
7)pos为什么要+1
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String email = "chenzs@tedu.cn";
int pos = email.indexOf("@");
System.out.println(pos);
String name = email.substring(0, pos);
System.out.println(name);
//注意我只要tedu.cn,不要@
String mail = email.substring(pos+1);
System.out.println(mail);
}
}
7) Integer I = new Integer(10);
8) String.format格式化
a) 一般情况下都使用字符串拼接(汽车) b) Java又提供一种方式format(骑自行车) c) Format通过占位符表达
%s,有几个占位符,必须有几个参数 d) Jdk高版本,1,7、1.8才提供这种方式支持,参数个数不固定,String, Object …
args
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String who = "小王";
String something = "吃香蕉"
String s = "%s回家%s"; //根据参数顺序挨个替换
//拼写字符串方式
//方式一
System.out.println( who + "回家" + something);
//方式二
System.out.println( String.format(s, who, something ) );
}
}
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String song = "liuyu.ly.mp4.123";
//需求:获取.mp4
int pos = song.lastIndexOf("."); //找出最后一个位置
String s = song.substring(0, pos);
//s="liuyu.ly.mp4"
System.out.println(s);
pos = s.lastIndexOf(".");
String s1 = s.substring(pos);
System.out.println(s1);
}
}
9) 什么时候用int,什么时候用Integer
Int 基本类型,它没有额外方法,它占内存小 Integer 保证类型,它有很多额外方法,它占用内存大。
在开发中尽量使用基本类型,运算速度快, 一般的原则: 在类的成员变量使用包装类型Integer 在方法中的变量使用基本类型 public
int add(int x, int y){} public Integer add(Integer x, Integer y){}
10)work是一个普通方法,newPeople(构造方法参数)
11)endsWith和startsWith
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
//需求:判断文件是否以.class结尾,答案:是true,否false
String className = "HelloWorld.class";
boolean b1 = className.endsWith(".class");
boolean b2 = className.endsWith(".java");
if(b1) {
System.out.println( className+" 这个文件是一个字节码文件");
}else if(b2) {
System.out.println( className+" 这个文件是一个源代码文件");
}
//需求:以tony开头
String name = "xtonychen";
boolean b = name.startsWith("tony");
System.out.println(b);
}
}
12)repalce
package cn.tedu;
public class TestArea {
//实现磁盘文件获取它对应类的包路径+类名
public static void main(String[] args) {
//需求:替换,把.替换/
String name = "cn.tedu.Cat"; //包路径,类名
name = name.replace(".", "/");
System.out.println(name);
//需求:把\\斜杠替换成/,
String path = "D:\\java\\ws\\power7\\hello\\src\\cn\\tedu\\Cat.java";
path = path.replace("\\", "/");
System.out.println(path);
//D:/java/ws/power7/hello/src/cn/tedu/Cat.java,把前面src之前目录包括src都去掉
int pos = path.indexOf("src/")+4;
System.out.println(pos);
path = path.substring(pos);
System.out.println(path);
pos = path.lastIndexOf(".");
path = path.substring(0,pos);
System.out.println(path);
path = path.replace("/",".");
System.out.println(path);
}
}
13)split拆分,它的参数regex,不是普遍字符串,正则表达式
正则表达式,里面.是有自己含义,代表每个字符,java中提供转义字符,
告诉代码,这是一个普通.不是正则表达式中的.。
.就叫转义字符,\.,又出现问题\是正则表达式特殊符号
记住结论:正则表达式中要表示是一个普通的.,就\.即可
14) 身份证解析
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
//需求:解析身份证号码
//总共18,六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。
String cardNo = "61011319801014214x";
System.out.println("身份证号:" + cardNo);
String addressNo = cardNo.substring(0,6);
System.out.println("地址码:"+addressNo);
String birthday = ""; //中文格式:1980年3月4号
//怎么干掉月和日前面可能是0
String year = cardNo.substring(6,10);
//利用整数会自动把前面0去掉,字符串007,转换整数7
String month = cardNo.substring(10,12);
int m = Integer.parseInt(month); //这个parseInt方法把字符串转换整数
month = m+""; //数值和字符串拼接,自动转换成字符串类型
String day = cardNo.substring(12,14);
int d = Integer.parseInt(day);
day = d+""; //这样就把零去掉了
birthday = year;
System.out.println("出生年月:"+birthday+"年"+month+"月"+day+"日");
//又一个技巧,利用倒数4位,去掉最后一位
String serNo = cardNo.substring( cardNo.length()-4, cardNo.length()-1);
System.out.println("顺序号:"+serNo); //211
String sex = cardNo.substring( cardNo.length()-2, cardNo.length()-1 ); //顺序号最后一位是奇数男,偶数女
int i = Integer.parseInt(sex); //把字符串转换整型
if(i%2==1) { //取余数,如果余数1,说明是奇数
sex = "男";
}else if(i%2==0) { //取余数,如果余数0,说明是偶数
sex = "女";
}
System.out.println("性别:"+sex);
String checkNo = cardNo.substring( cardNo.length()-1 );
System.out.println("验证码:" + checkNo);
}
}
15) 姓名隐蔽处理
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
//需求:很多名字,把中间字变成*,如果是两个把后面字变成*
//生活中,有些重要人名信息不完全展现,把其中字变成*
//定义一个字符串数组,x[],中括号数组
//等号右边数组初始化,数组元素直接使用逗号隔开
String[] names = {"周星驰","黄渤","孙俪","童安格","王杰","周华健"};
//数组遍历foreach
for(String s : names) {
String s1 = s.substring(0,1);
String s2 = s.substring(1,2);
String s3 = s.substring(2);
//System.out.println(s1+","+s2+","+s3);
String name = s1+"*"+s3;
System.out.println(name);
}
}
}
问题:
1)valueOf和parseInt有什么区别?
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
int x = 100;
//把整数类型转换字符串
String s = String.valueOf(x);
System.out.println(s);
String s1 = "1000";
//把字符串s1,转换整数类型int的y
int y = Integer.parseInt(s1);
System.out.println(y);
}
}
2)foreach()
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
int[] a = {1,2,3,6,7,8,10}; //声明一个整形数组
for(int i : a) {
System.out.println(i);
}
//怎么知道for循环结束呢?
//可以得到数组大小
System.out.println("数组长度为:" + a.length);
//总共遍历7次后,就结束for循环
}
}
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String[] names = {"周星驰","黄渤"}; //,"孙俪","童安格","王杰","周华健"
for(String name : names) {
//System.out.println(name.charAt(1));
//注意repalce支持,两个参数都是char类型
//name = name.replace( name.charAt(1) , '*'); //写法1
name = name.replace( name.charAt(1)+"", "***"); //写法2,写法2更加灵活
System.out.println(name);
}
}
}
3)for和foreach循环
package cn.tedu;
public class TestArea {
public static void main(String[] args) {
String[] names = {"周星驰","黄渤","孙俪","童安格","王杰","周华健"}; //
for(String name : names) {
//System.out.println(name.charAt(1));
//注意repalce支持,两个参数都是char类型
//name = name.replace( name.charAt(1) , '*'); //写法1
name = name.replace( name.charAt(1)+"", "***"); //写法2,写法2更加灵活
System.out.println(name);
}
//使用for循环怎么实现?
for(int i=0; i<names.length; i++) { //利用数组长度,作为循环结束条件
//数组是有下标值,names[0],0就叫做下标
System.out.println(names[i]);
}
//两种实现都可以,写哪个没有太大区别,显然foreach循环方式代码更加简洁!
}
}