首页 > 其他 > 详细

常用类

时间:2020-07-29 01:40:37      阅读:56      评论:0      收藏:0      [点我收藏+]

常用类

内部类的分类

成员内部类

静态内部类

局部内部类

匿名内部类

什么是内部类

概念 在一个类的内部在定义一个完整的类

class Outer
{
class Inner
{
       
}
   
}

内部类也会生成一个class文件。

特点:1 编译之后可以生成独立的字节码文件

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

public class Body
{
  private String name;
  class Header
  {
      public void show()
      {
          System.out.println(name);
      }
?
  }
}

3 可以为外部类提供必要的功能组件

成员内部类

在类的内部定义,与实例变量 实例方法同级别的类

外部类的一个实例部分。创建内部类对象时,必须依赖外部类对象

Outer out = new Outer;
Inner in = out.new Inner;
    public static void main(String[] args) {
//       //1 先创建一个外部类对象
//       Outer outer = new Outer();
//       //2 创建内部类对象
//       Outer.Inner inner = outer.new Inner();
?
      //一步到位
      Outer.Inner inner = new Outer().new Inner();
       
      inner.show();
  }

 

当外部类 内部类存在同名的属性时,会优先访问内部类的属性;这时要想访问外部类的属性时要在属性名前面加Outer.this.

 

成员内部类不能定义静态成员,但是可以包含静态常量(final)

 

静态内部类

不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。 相当于一个外部类

普通的类不能加static 只有静态内部类才能加static访问。

public class TestOuter {
  public static void main(String[] args) {
      //直接创建静态内部类对象
      Outer02.Inner inner = new Outer02.Inner();
      //调用方法
      inner.show();
  }
}
//外部类
public class Outer02 {
  private String name = "xxx";
  private int age = 18;
  //静态内部类:级别和外部类相同
  static class Inner
  {
      private String address = "上海";
      private String phone = "111";
      //静态成员
      private static int count = 1000;
      public void show()
      {
          //调用外部类的属性
          //1 创建外部类对象
          Outer02 outer = new Outer02();
          //2 调用外部类对象的属性
          System.out.println(outer.name);
          //调用静态内部类的属性和方法
          System.out.println(address);
          System.out.println(phone);
          //调用静态内部类的静态属性
          System.out.println(Inner.count);
      }
  }
}

局部内部类

定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。

先需要知道的一点是:内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法的执行完毕就被销毁.

public class Outer {
  private String name = "刘德华";
  private int age = 35 ;
  public void show()
  {
      //定义局部变量
      String address = "深圳";
      //局部内部类:注意不能加任何访问修饰符
      class Inner
      {
          //局部内部类的属性
          private String phone = "15588888888";
          private String email = "liutao@qq.com";
          public void show2()
          {
              //访问外部类的属性
              System.out.println(Outer.this.name);
              System.out.println(Outer.this.age);
              //访问内部类的属性
              System.out.println(this.phone);
              System.out.println(this.email);
              //访问局部变量,jdk1.7要求,变量必须是常量,1.8之后可以省略final
              System.out.println(address);
?
?
          }
      }
      //创建局部内部类对象
      Inner inner = new Inner();
      inner.show2();
  }

局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。

匿名内部类

没有类名的局部内部类(一切特征都与局部内部类相同)。

必须集成一个父类或者实现一个接口。

定义类 实现类 创建对象的语法合并,只能创建一个该类的对象

优点:减少代码量

缺点:可读性差

Usb usb = new Usb()
{
  public void service() {
      System.out.println("连接电脑成功,风扇开始工作了.....");
  }
};
usb.service();

 

Object类

超类 基类,所有类的直接或间接父类,位于继承树的最顶层。

 

任何类,如果没有extends显示继承某个类,都默认直接继承Object类,否则为间接继承。

 

Object类中所定义的方法,是所有对象都具备的方法。

 

Object类型可以存储任何对象。

? 作为参数,可以接受任何对象。

? 作为返回值,可以返回任何对象。

 

getClass()方法

public final Class<?> getClass(){}

 

返回引用中存储的实际对象类型

 

应用:通常用于判断两个引用中实际存储对象类型是否一致。

Student s1 = new Student("aaa",20);
Student s2 = new Student("bbb",22);
//判断s1和s2是不是同一个类型
Class class1 = s1.getClass();
Class class2 = s2.getClass();
if(class1 == class2)
{
  System.out.println("s1和s2属于同一个类型");
}
else
{
  System.out.println("s1和s2不是同一个类型");
}

hashCode()方法

public int hashCode(){}

返回该对象的哈希吗值

哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值

一般情况下对象相同返回相同哈希码

 

 

toString()方法

public String to String(){}

返回该对象的字符串表示(表现形式)。

可以根据程序需求覆盖该方法,如:展示对象各个属性值。

重写toString()方法 alt+ins 选择toString

 

equals()方法

public boolean equals(Object obj){}

默认实现为(this == obj),比较两个对象地址是否相同

可进行覆盖,比较两个对象的内容是否相同。

equals方法覆盖步骤

比较两个引用是否指向同一个对象。

判断obj是否为null

判断两个引用指向的实际类型是否一致

强制类型转换

依次比较各个属性是否相同

public boolean equals(Object obj) {
      //判断两个对象是否是同一个引用
      if (this == obj) return true;
      //判断obj是否为null
      if (obj == null ) return false;
      //判断是否同一个类型
/*       if(this.getClass()==obj.getClass())
      {
?
      }*/
      //instanceof 判断对象是否是某种类型
      if(obj instanceof Student)
      {
          //4强制类型转换
          Student s =(Student)obj;
          //5比较属性
          if(this.name.equals(s.getName())&&this.age==s.age) return true;
          else return false;
      }
          return false;
  }

 

finalize()方法

当对象判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。

垃圾对象:没有有效引用指向此对象时,为垃圾对象。

垃圾回收:由GC销毁垃圾对象,释放存储空间。

自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。

手动回收机制:使用System.gc();通知JVM执行垃圾回收。

public static void main(String[] args) {
  new Student("aaa",20);
  new Student("bbb",20);
  new Student("ccc",20);
  new Student("ddd",20);
  new Student("eee",20);
  //回收垃圾
  System.gc();
  System.out.println("回收垃圾");
?
}

 

包装类

什么是包装类?

基本数据类型所对应的引用数据类型。

Object类可同意所有数据,包装类默认的值是null。

 

类型转换与装箱、拆箱

8种包装类提供不同类型间的转换方式

? Number父类中提供的6个共性方法

? parseXXX()静态方法

注意:需保证类型兼容,不然会出现NumFormatException异常

//装箱和拆箱
int num = 10;
//类型转换:装箱:基本类型转成引用类型
int num1 = 18;
//使用Integer类创建对象
Integer integer1 = new Integer(num1);
Integer integer2 = Integer.valueOf(num1);
System.out.println("装箱");
System.out.println(integer1);
System.out.println(integer2);
//类型转换:拆箱:引用类型转成基本类型
Integer integer3 = new Integer(100);
int num2 = integer3.intValue();
System.out.println("拆箱");
System.out.println(num2);
?
//JDK1.5之后,提供了自动装箱和拆箱
int age = 30;
//自动装箱
Integer integer4 = age;
System.out.println("自动装箱");
System.out.println(integer4);
//自动拆箱
int age2 = integer4;
System.out.println("自动拆箱");
System.out.println(age2);
int n1 = 100;
// 1.1使用+号实现
String s1 = n1+"";
// 1.2使用Integer中的toString()方法
String s2 = Integer.toString(n1);
System.out.println(s1);
System.out.println(s2);
?
//2 字符串转成基本类型
String str = "150";
//使用Internet.parseXXX();
int n2 = Integer.parseInt(str);
System.out.println(n2);
?
//boolean字符串形式转成基本类型,"true"------>true     非"true"------------>false
String str2 = "true";
boolean b1 = Boolean.parseBoolean(str2);
System.out.println(b1);

 

整数缓冲区

java预先创建了256个常用的整数包装类型对象

在实际应用当中,对已创建的对象进行复用。(-128到127)

//面试题
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
?
?
System.out.println(integer1==integer2);
?
Integer integer3 = 100;//自动装箱
Integer integer4 = 100;
System.out.println(integer3==integer4);
?
Integer integer5 = 200;
Integer integer6 = 200;
System.out.println(integer5==integer6);

只要调用Integer.valuein(),并且数值在整数缓冲区的范围内(-128到127)之间,这两个Integer类型就是相等的。

String类

String

字符串是常量,创建之后不可改变。

字符串字面值存储在字符串池中,可以共享。

String s = "Hello";产生一个对象,字符串池中存储。

String s =new String("Hello");//产生两个对象,堆、池中各一个。

技术分享图片

常用方法

public int length(); 返回字符串的长度

public char charArt(int index); 根据下标获取字符

public boolean contains(String str);判断当前字符串是否包含str

public char[] toCharArray(); 字符串转换为数组

public int indexOf(String str); 查找str首次出现的下标,存在,则返回该下表;不存在,则返回-1

public int lastIndexOf(String str); 查找字符串在当前字符串中最后一次出现的下表索引

public String trim(); 去掉字符串前后的空格

public String toUpperCase(); 将小写转换为大写

public boolean endWith(String str); 判断字符串是否以str结尾

public String replace(char oldChar,char newChar); 将旧字符串替换成新字符串

public String[] split(String str); 根据str作拆分

System.out.println("-------------字符串方法的使用1-------------");
?
//字符串方法的使用
//1. length();返回字符串的长度
//2. charArt(int index);返回某个位置的字符
//3. contains(String str);判断是否包含某个子字符串
String content = "Java是世界上最好的编程语言,Java,Java真香";
System.out.println(content.length());
System.out.println(content.charAt(10));
System.out.println(content.contains("编程语言"));
?
System.out.println("-------------字符串方法的使用2-------------");
//4. toCharArray();返回字符串对应的数组
//5. indexOf();返回子字符串首次出现的位置
//6. lastIndexOf();返回字符串最后一次出现的位置
?
System.out.println(Arrays.toString(content.toCharArray()));
System.out.println(content.indexOf("Java"));
System.out.println(content.indexOf("Java",4));
System.out.println(content.lastIndexOf("Java"));
System.out.println("-------------字符串方法的使用3-------------");
//7. trim();去掉字符串前后的空格
//8. toUpperCase();把小写转换为大写 toLowerCase();大写转换为小写
//9. endWith(str);判断是否以str结尾 startWith(str);判断是否以str开头
?
String content2 = "   hello World     ";
System.out.println(content2.trim());
System.out.println(content2.toUpperCase());
System.out.println(content2.toLowerCase());
String filename = "hello.java";
System.out.println(filename.endsWith(".java"));
System.out.println(filename.startsWith("hello"));
System.out.println("-------------字符串方法的使用4-------------");
//10. replace(char old,char new); 用新的字符或字符串替换旧的字符或字符串
//11. split(); 对字符串进行拆分
?
System.out.println(content.replace("Java","php"));
?
String say = "java is the best programing language";
String[] arr = say.split("[ ,]+");
System.out.println(arr.length);
for(String string:arr)
{
  System.out.println(string);
}
?
//补充两个方法equals 、compareTo();比较大小
System.out.println("--------------补充-----------------");
String s1 = "hello";
String s2 = "Hello";
System.out.println(s1.equals(s2));
System.out.println(s1.equalsIgnoreCase(s2));//忽略大小写
?
String s3 = "abc"; //97 98 99
String s4 = "xyz"; //120 121 122
System.out.println(s3.compareTo(s4));//结果-23
?
String s5 = "abc";
String s6 = "abcxyz";
System.out.println(s5.compareTo(s6));//结果-3

案例演示

需求:

? 已知String str = " this is a text";

? 1.将str中的单词单独提取出来

? 2.将str中的text替换为practice

? 3.在text前插入一个easy

? 4.将每个单词的首字母改为大写

String str = "this is a text";
//1.将str中的单词单独提取出来
System.out.println("----------将str中的单词单独提取出来----------");
String[] arr = str.split(" ");
for (String s :arr
    )
{
  System.out.println(s);
?
}
//2.将str中的text替换为practice
System.out.println("----------将str中的text替换为practice----------");
String str2 = str.replace("text","practice");
System.out.println(str2);
?
//3.在text前插入一个easy
System.out.println("----------在text前插入一个easy----------");
String str3 = str.replace("text","easy text");
System.out.println(str3);
?
//4.将每个单词的首字母改为大写
for (int i = 0; i < arr.length; i++)
{
  char first = arr[i].charAt(0);
  //把第一个字符转成大写
  char upperfirst = Character.toUpperCase(first);
?
  String news = upperfirst+arr[i].substring(1);
  System.out.println(news);
?
?
}

 

可变字符串

StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全。

StringBuilder:可变长字符串,JDK5.0提供,运行效率快,线程不安全。

StringBuffer sb = new StringBuffer();
//1 append();追加
sb.append("Java世界第一");
System.out.println(sb.toString());
sb.append("Java真香");
System.out.println(sb.toString());
//2 insert();插入
sb.insert(0,"我在最前面");
System.out.println(sb.toString());
?
//3 replace();替换
sb.replace(0,5,"hello");
System.out.println(sb.toString());
?
//4 delete();删除
sb.delete(0,5);
System.out.println(sb.toString());
?
//5 reverse();翻转
sb.reverse();
System.out.println(sb.toString());
?
//清空
sb.delete(0,sb.length());
System.out.println(sb.toString());
/**
* 验证StringBuilder效率高于String
*
* */
public class Demo06 {
  public static void main(String[] args) {
      long start = System.currentTimeMillis();
/*       String string = "";
      for (int i = 0; i <99999 ; i++) {
          string+=i;
?
      }
      System.out.println(string);*/
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i <99999 ; i++) {
          sb.append(i);
?
      }
      long end = System.currentTimeMillis();
      System.out.println(end-start);
  }

BigDecimal

思考:一下程序输出是多少

public static void main(String[] args) {
  double d1 = 1.0;
  double d2 = 0.9;
  System.out.println(d1-d2);
}
0.09999999999999998

很多实际应用中更需要精确运算,而double是近似值存储,不在符合要求,需要BigDecimal。

位置:java.math包中

作用:精确计算浮点数

创建方式:BigDecimal bd = new BigDecimal(“1.0”);

方法:

? BigDecimal add(BigDecimal bd) 加

BigDecimal subtract(BigDecimal bd) 减

? BigDecimal mutiply(BigDecimal bd 乘

? BigDecimal divide(BigDecimal bd 除

 

除法:divide(BigDecimal bd,int scal,RoundingMode mode);

 

参数scale:精确到小数点后几位

 

参数mode:

? 指定小数部分的取舍模式,通常采用四舍五入的模式。

? 取值为BigDecimal.ROUND_HALF_UP。

?

?

 double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1-d2);
?
//BigDecimal,大的浮点数精确计算
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
//减法
BigDecimal r1 = bd1.subtract(bd2);
System.out.println(r1);
?
//加法
BigDecimal r2 = bd1.add(bd2);
System.out.println(r2);
?
//乘法
BigDecimal r3 = bd1.multiply(bd2);
System.out.println(r3);
?
//除法
BigDecimal r4 = new BigDecimal("1.4").subtract(new BigDecimal("0.5")).divide(new BigDecimal("0.9"));
System.out.println(r4);

//保留几位小数
BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP);
System.out.println(r5);

 

 

Date

Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法已经被Calendar类中的方法所取代。

 

时间单位

? 1秒=1000毫秒

? 1毫秒=1000微秒

? 1微秒=1000纳秒

//1.创建date对象
//今天
Date date1 = new Date();
System.out.println(date1.toString());
System.out.println(date1.toLocaleString());
//昨天
Date date2 = new Date(date1.getTime()-(60*60*24*1000));
System.out.println(date2.toLocaleString());
//2.方法after before
System.out.println(date1.after(date2));
System.out.println(date1.before(date2));
?
//比较 compareTo();
int d = date1.compareTo(date2);
System.out.println(d);
?
//比较是否相等equals
System.out.println(date1.equals(date2));          

Calendar

Calendar提供了获取或设置各种日历字段的方法。

构造方法

? protected Calendar();由于修饰符是protected所以无法直接创建该对象

 

方法名说明
static Calendar getInstance() 使用默认时区和区域获取日历
void set(int year,int month,int date,int hourofday,int minute,int second) 设置日期的年、月、日、时、分、秒
int get(int field) 返回给定日历字段的值。字段比如年、月、日等
void setTime(Date date) 用给定的Date设置此日历的时间。Date-Calendar
Date getTime() 返回一个Date类表示此日历的时间。Calendar-Date
void add(int field,int amount) 按照日历的规则,给指定字段添加或减少时间量
long getTimeInMIllies() 毫秒为单位返回该日历的时间值
public static void main(String[] args) {
  //1.创建Calendar对象
  Calendar claendar = Calendar.getInstance();
  System.out.println(claendar.getTime().toLocaleString());
  System.out.println(claendar.getTimeInMillis());
  //2.获取时间信息
  //获取年
  int year = claendar.get(claendar.YEAR);
  //月
  int month = claendar.get(claendar.MONTH);
  //日
  int day = claendar.get(claendar.DATE);
  //小时
  int hour = claendar.get(claendar.HOUR_OF_DAY);
  //分钟
  int minute = claendar.get(claendar.MINUTE);
  //秒
  int second = claendar.get(claendar.SECOND);
  System.out.println(year+"年"+(month+1)+"月"+day+"日"+hour+"时"+minute+"分"+second+"秒");
  //3.修改时间
  Calendar calendar2 = Calendar.getInstance();
  calendar2.set(Calendar.DAY_OF_MONTH,5);
  System.out.println(calendar2.getTime().toLocaleString());
?
  //4.add方法修改时间
  calendar2.add(Calendar.HOUR,1);
  System.out.println(calendar2.getTime().toLocaleString());
?
  //5.补充方法
  int max = calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);
  int min = calendar2.getActualMinimum(Calendar.DAY_OF_MONTH);
  System.out.println(max);
  System.out.println(min);
?
}

 

SimpleDateFormat

SimpleDateFormat是一个以语言环境有关的方式来格式化和解析日期的具体类。

进行格式化(日期 -> 文本)、解析(文本 -> 日期)。

常用的时间模式字母

字母日期或时间示例
y 2019
M 08
d 10
H 1天中小时数(0-23) 22
m 分钟 16
s 59
S 毫秒 167
public static void main(String[] args) throws Exception{
  //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);
  //解析(把字符串转换成日期)
  Date date2 = sdf.parse("1990年08月09日 11:11:23");
  System.out.println(date2);
}

 

System类

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

方法名说明
static void array copy(...) 复制数组
static long currentTimeMillis; 获取当前时间,返回的是毫秒值
static void gc(); 建议JVM赶快启动垃圾回收机制
static void exit(int status); 退出JVM,如果参数是0表示正常退出JVM,非0表示异常退出JVM
public static void main(String[] args) {
  //arraycopy:数组的复制
  //src:原数组
  //srcPos:从哪个位置开始复制
  //dest:目标数组
  //destPos:目标数组的位置
  //length:复制的长度
  int[] arr = {1,33,55,23,12,55,23};
  int[] dest = new int[8];
  System.arraycopy(arr,0,dest,0,arr.length);
  for (int i = 0; i < dest.length; i++) {
      System.out.println(dest[i]);
?
  }
  //Arrays.copyOf(original,newLength)
  System.out.println(System.currentTimeMillis());
  long start = System.currentTimeMillis();
  for (int i = 0; i < 9999999 ; i++) {
      for (int j = 0; j < 9999999; j++) {
          int result = i+j;
?
      }
?
  }
  long end = System.currentTimeMillis();
  System.out.println(end-start);
?
  //System.gc();告诉垃圾回收器回收
  new Student("aaa",19);
  new Student("bbb",19);
  new Student("ccc",19);
?
  System.gc();
?
  //4.退出JVM
  System.exit(0);
  System.out.println("程序结束了");
}

 

常用类

原文:https://www.cnblogs.com/noblehacker/p/13394331.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!