java基础 day13------内部类和常用类

1、内部类:定义在类的内部的类,叫做内部类
其中静态内部类和匿名内部类经常使用
内部类:在一个类的内部再定义一个完整的类。(注:内部类也会生成class文件)
//身体类(身体包括头部,其实我好像记得h5中好像头部和身体是各自的)
class Body{
class Header{
}
}

特点:内部类可以直接访问外部类的私有成员,而不破坏封装。


成员内部类:相当于成员变量或成员方法的,位置也与它们一致

  1. 成员内部类的实例化必须首先创建外部类的实例。
   //创建外部对象
   	Body body=new Body();
   	
   	//创建内部类对象
   	Header header=body.new Header();
//也可以直接一步进行创建
//Header header=new Body().new Header();
  1. 当外部类、内部类存在重名属性时,会优先访问内部类属性。(所以,当你需要外部类的重名的属性时,你要使用 “类名.this.属性名”)
  2. 成员内部类不能定义静态成员的(但是可以包含静态常量)

静态内部类:在成员内部类的基础上,定义类的时候,加上static(静态内部类相当于一个外部类,外部类可以有的内容,它都可以有)

  1. 不依赖外部类对象,可直接创建或通过类名进行访问,可声明静态成员。
//创建静态内部类对象
		Inner in=new Outer.Inner();//切记这里不是创建Outer对象,而只是表明了一种包含关系,如果创建的话就应该是new Outer()了
  1. 在静态内部类中调用外部类的属性,需要先创建外部类的对象,再进行调用
//调用外部类的属性(首先需要创建外部类的对象)
			Outer out=new Outer();
			System.out.println(out.name);

注:只能内部类才可以用static修饰,普通类不可以。


局部内部类:定义在方法的内部(作用范围仅限于当前方法)

匿名内部类:顾名思义就是没有名字的类

2、Object类:是所有类的超级父类,基类

  1. getClass()方法(返回值类型 Class)
//判断stu1与stu2是不是同一个类型
		Class class1 = stu1.getClass();
		Class class2=stu2.getClass();
		if(class1==class2) {
			System.out.println("属于同一个类型");
		}else {
			System.out.println("不属于同一个类型");
		}
  1. hashCode() (返回值类型 int)
//hashCode()
		System.out.println(stu1.hashCode());
  1. toString() (返回值类型为String ) 可以重写(当父类的方法满足不了子类的时候,重写父类的方法即可)
//toString()
		System.out.println(stu1.toString());
  1. equals() (返回值类型是布尔类型)
//equals() 比较两个对象的地址是否一样
		System.out.println(stu1.equals(stu2));

重写Object类的equals()方法,让比较的是内容。

	public boolean equals(Object obj) {
		//1.判断两个对象是否为同一个引用
		if(this==obj) {
			return true;
		}
		
		//2.判断obj是否为null
		if(obj==null) {
			return false;
		}
		
		//3.是否是同一个类型
//		if(this.getClass()==obj.getClass()) {
//			
//		}
		
		if(obj instanceof Student) {
			//4.强制类型转换
			Student s=(Student)obj;
			//5.比较属性
			if(s.getAge()==this.getAge()&&s.getName()==this.getName()) {
				return true;
			}
			
		}
		
		return false;
		
	}
//equals()
		Student stu4=new Student("小明", 20);
		Student stu5=new Student("小明", 20);
		System.out.println(stu4.equals(stu5));//true
  1. finalize()方法 该方法在Object中是个空方法,所以必须自己重写,它的作用是当对象判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。那么什么是垃圾对象呢?垃圾对象:没有有效的引用指向此对象时,为垃圾对象。垃圾回收:由GC销毁垃圾对象,释放数据存储空间。自动回收机制:JVM内存耗尽,一次性回收所有垃圾对象。
    手动回收机制:使用System.gc()方法:通知JVM进行垃圾回收。
new Student("a",10);//这个会被回收,因为它是垃圾对象
		Student s2=new Student("b",10);
		Student s3=new Student("c",10);
		System.gc();
		System.out.println("回收");

3、包装类:(8种基本数据类的包装类)
包装类也就是对8种基本的数据类型进行包装,也就是基本数据类型所对应的引用数据类型。注:基本数据类型保存在栈中,引用数据类型保存在堆中。
在这里插入图片描述

4、String类
一、

  1. 字符串一旦创建,就不可改变。
String name="hello";
name="zhangsan";
//name修改,是在方法区中的字符串池中重新开辟一份空间。而并不是把"hello"改成“zhangsan”。name指向“zhangsan”的空间
String name2="zhangsan";//此时就会直接指向方法区中字符串常量池的"zhangsan".
/**
这样的话就实现了字符串的共享
*/
  1. 字符串字面值存储在字符串池中,可以共享。
  2. String s=“Hello”;产生一个对象,字符串池中存储
  3. String s=new String(“Hello”);//产生两个对象,堆、池中各存储一个

常用方法

  1. public int length():返回字符串的长度
  2. public char charAt(int index):根据下标获取字符
  3. public boolean contains(String str):判断当前字符串中是否包含str
String str="窗前明月光,疑是地上霜,举头望明月,低头思故乡.";
		
		//1.length()返回字符串的长度
		System.out.println(str.length());//24
		//2.charAt(int index)返回某个位置的字符
		System.out.println(str.charAt(2));//明
		//3.contains(String str);判断是否包含某个字符串
		String s="十年生死两茫茫,不思量,自难忘.";
		System.out.println(str.contains(s));//false
  1. public char[] toCharArray()将字符串转换成数组
  2. public int indexOf(String str):查找str首次出现的下标,存在则返回该下标;不存在,则返回-1
  3. public inr lastIndexOf(String str):查找字符串在当前字符串中最后一次出现下标的索引。
String str1="人生就是一场旅行,旅行途中,你可以选择徒步,你可以选择骑车旅行,你可以选择绿皮火车,总之,这取决于你的选择";
		
		//4.toCharArray() 返回字符串对应的数组
		char[] chars=str1.toCharArray();
		System.out.println(chars);
		//5.indexOf()查找字符串首次出现的位置
		int index=str1.indexOf("人");
		System.out.println(index);//0
		//6.lastIndexOf()查找字符串最后出现的位置
		int index1=str1.lastIndexOf("你可以");
		System.out.println(index1);//32
  1. public String trim():去掉字符串前后的空格
  2. public String toUpperCase():将小写转成大写
  3. public boolean endWith(String str):判断字符串是否以str结尾
	String str2=" hello , I love my inner world ! ";
//		 7.public String trim():去掉字符串前后的空格
		String s1=str2.trim();//hello , I love my inner world !
		System.out.println(s1);
//		 8. public String toUpperCase():将小写转成大写  ;  toLowerCase()把大写转换成小写
		String s2=str2.toUpperCase();
		System.out.println(s2);// HELLO , I LOVE MY INNER WORLD ! 
//		 9. public boolean endWith(String str):判断字符串是否以str结尾
		boolean b=str2.endsWith("! ");
		System.out.println(b);//true
		
		boolean b1=str2.endsWith("!");
		System.out.println(b1);//false
  1. public String replace(char oldChar,char new Char):将旧字符串替换成新的字符串
  2. public String[] split(String str):根据str做拆分
		String str3="java 是 世界上 最好的 编程语言";
//		 10. public String replace(char oldChar,char new Char):将旧字符串替换成新的字符串
		String s3=str3.replace("java","php");
		System.out.println(s3);//php 是 世界上 最好的 编程语言
		//	 11. public String[] split(String str):根据str做拆分
		String [] s4=str3.split(" ");
		System.out.println(s4);//[Ljava.lang.String;@15db9742
		//遍历数组
		for(String s_1:s4) {
			System.out.println(s_1);
//			java
//			是
//			世界上
//			最好的
//			编程语言
		}
		

小案例:

/**
		 * 已知String str="this is a text";
		 * 1.将str中的text的单词单独获取出来
		 * 2.将str中的text替换成practice
		 * 3.在text前面插入一个easy
		 * 4.将每个单词的首字母改为大写
		 */
		
		String str="this is a text";
		// 1.将str中的text的单词单独获取出来
		String [] strs=str.split(" ");
		//遍历数组
		for(String s:strs) {
			System.out.println(s);
			/**
			 * 	this
				is
				a
				text
			 */
			
		}
		
		//2.将str中的text替换成practice
		String str_1=str.replace("text", "practice");
		System.out.println(str_1);//this is a practice
		//3.在text前面插入一个easy
		String str_2=str.replace("text", "easy text");
		System.out.println(str_2);//this is a easy text
		//4.将每个单词的首字母改为大写
		for(int i=0;i<strs.length;i++) {
			char firstName=strs[i].charAt(0);
			char upFirstName=Character.toUpperCase(firstName);
			
			String news=upFirstName+strs[i].substring(1);//subString()拼接
			System.out.print(news+" ");//This Is A Text 
		}
		

二、可变字符串 StringBuffer和StringBulider
StringBuffer和StringBulider都比String的效率要高,而且还比较节省内存。不同的是StringBuffer运行效率要比StringBulider慢,但是StringBuffer的线程更加安全。

  1. 常用方法
	StringBuffer sb=new StringBuffer();
		
		//StringBulider sb=new StringBulider();//与StringBuffer功能一样
		
		//1.append()追加字符
		sb.append("生活如一盏茶");
		System.out.println(sb);//生活如一盏茶
		System.out.println(sb.toString());//生活如一盏茶
		sb.append("越品越香");
		System.out.println(sb);//生活如一盏茶越品越香
		//2.insert()插入
		sb.insert(0, "生活点评:");
		System.out.println(sb);//生活点评:生活如一盏茶越品越香
		//3.replace()替换
		sb.replace(0, 5, "hello");
		System.out.println(sb);//hello生活如一盏茶越品越香
		//4.delete()删除
		sb.delete(0, 5);
		System.out.println(sb);//生活如一盏茶越品越香
		//5.delete()清空
		sb.delete(0, sb.length());
		System.out.println(sb);//无字符串
		System.out.println(sb.length());//0
  1. 验证StringBuffer与String之间的效率差异
long start=System.currentTimeMillis();
		String str="";
		for(int i=0;i<99999;i++) {
			str+=i;
		}
		long end=System.currentTimeMillis();
		System.out.println("耗时:"+(end-start));//耗时:22438
long start=System.currentTimeMillis();
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<99999;i++) {
			sb.append(i);
		}
		long end=System.currentTimeMillis();
		System.out.println("耗时:"+(end-start));//耗时:14

5、BigDecimal类

		double d1=1.0;
		double d2=0.9;
		System.out.println(d1-d2);//0.09999999999999998

很多实际应用中需要精确运算,而double是以近似值进行存储,不符合要求,所以需要借助BigDecimal
BigDecimal:位置在java.math包中,作用:精确计算浮点数。
创建方式:BigDecimal bd=new BigDecimal(“1.0”);


		//BigDecimal
		BigDecimal bd1 = new BigDecimal("1.0");
		BigDecimal bd2 = new BigDecimal("0.9");
		//substract()减法
		System.out.println(bd1.subtract(bd2));//0.1

方法:

  1. BigDecimal add(BigDecimal bd) 加
  2. BigDecimal substract(BigDecimal bd) 减
  3. BigDecimal divide(BigDecimal bd) 除
  4. BigDecimal multiply(BigDecimal bd) 乘

6.Date类

//1.创建Date对象
		
		//今天
		Date date=new Date();
		System.out.println(date);//Sun Sep 27 09:09:17 CST 2020
		
		//昨天
		Date date1=new Date(date.getTime()-24*60*60*1000);
		System.out.println(date1.toLocaleString());//2020-9-26 9:13:15
		
		//2.after   before
		System.out.println(date.after(date1));//true
		System.out.println(date1.before(date));//true
		System.out.println(date.before(date1));//false

7.Calendar
Calendar类提供了获取或设置各种日历字段的方法
构造方法:
protected Calendar():由于修饰符是protected,所以无法直接创建该对象,但是 该类提供了一个静态方法getInstance()

//创建Calendar对象
		Calendar calendar=Calendar.getInstance();
		//1.打印时间
		System.out.println(calendar.getTime().toLocaleString());//2020-9-27 9:42:18 
		//2.获取时间信息
		//获取年
		int year=calendar.get(Calendar.YEAR);
		System.out.println(year);//2020
		//月
		int month=calendar.get(Calendar.MONTH)+1;
		System.out.println(month);//9
		//日
		int day=calendar.get(Calendar.DAY_OF_MONTH);
		System.out.println(day);//27
		//小时
		int hour=calendar.get(Calendar.HOUR_OF_DAY);
		System.out.println(hour);//9
		//分钟
		int minutes=calendar.get(Calendar.MINUTE);
		System.out.println(minutes);//42
		//秒
		int seconds=calendar.get(Calendar.SECOND);
		System.out.println(seconds);//18
		
		System.out.println("当前时间为:"+year+"年"+month+"月"+day+"日"+hour+"时"+minutes+"分"+seconds+"秒");//当前时间为:2020年9月27日9时42分18秒
		
		//3.设置修改时间
		Calendar calendar2 = Calendar.getInstance();
		calendar2.set(Calendar.DAY_OF_MONTH, 10);
		System.out.println(calendar2.getTime().toLocaleString());//2020-9-10 9:54:10
		//4.add方法修改时间
		calendar2.add(Calendar.HOUR, 1);
		System.out.println(calendar2.getTime().toLocaleString());//2020-9-10 10:54:10
		//5.获取当前月天数最多和最少
		int days=calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);
		System.out.println("当前月最大一天:"+days+"号");//30号
		int days2=calendar2.getActualMinimum(Calendar.DAY_OF_MONTH);
		System.out.println("当前月最小一天:"+days2+"号");//1号

8.SimpleDateFormat类

//1.创建SimpleDateFormat对象
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		//2.创建Date
		Date date=new Date();
		//格式化date
		String str=sdf.format(date);
		System.out.println(str);//2020年09月27日 10:08:11

9.System类
System系统类,主要用于获取系统的属性数据和其他操作,构造方法是私有的。

  1. static void arraycopy() 复制数组
  2. static long currentTimeMillis(); 获取当前系统时间,返回的是毫秒值(主要用于计算某段代码的用时)
  3. static void gc(); 建议JVM赶快启动垃圾回收期回收垃圾
  4. static void exit(int status); 退出JVM,如果参数是0代表正常退出JVM,非0代表异常退出JVM
//1.arraycopy()实现数组的复制
		
//		System.arraycopy(src, srcPos, dest, destPos, length);
		//src 源数组
		//srcPos :从哪个位置开始复制
		//dest:目标数组
		//destPos:目标数组的位置
		//length:复制的长度
		int [] arr= {20,322,23,24,7,8,4,2,23,675,645};
		int [] dest=new int[11];
		System.arraycopy(arr, 0, dest, 0, arr.length);
		for(int i:dest) {
			System.out.print(i+" ");//20 322 23 24 7 8 4 2 23 675 645 
		}
		//其他的方法在上面都有用过,在这里不再赘述。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值