学习java---面向对象(下)

知识回顾:

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()方法

今天内容:

  1. ) 字符串处理,日期、浮点数
  2. ) 自己写一些转换工具类(方法)api
  3. ) 字符串和字符差异
    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 = "[email protected]";
		//不能固定位置截取字符串,找特征地方		
		//先找到@不固定位置,格式是固定
		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 = "[email protected]";
		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循环方式代码更加简洁!
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章