常用类

一.内部类

内部类的意义:就是不破坏外部类的封装性的同时,访问内部类的private权限。

1.成员内部类

  • 可以操作外部类的私有属性

  • 创建内部类对象时必须依赖外部类对象。

  • 他的级别和外部类的方法和属性是一个级别

  • 当外部类和成员内部类有相同属性,会优先访问内部类。

  • 成员内部类不能定义静态成员,但可以包含静态常量(private static final )
    在这里插入图片描述

内部类编译会生成独立的字节码文件。如Test.class(外部类),Test&dome.class(内部类)
在这里插入图片描述
在这里插入图片描述

//创建成员内部类对象
外部类 A对象 = new 外部类();
内部类 inner对象 = A对象.new 内部类()
inner.in();//内部类方法 

//一句话写法
内部类 inner = new 外部类().new 内部类(); 

2.静态内部类

  • 静态内部类的级别和外部类一样

  • 静态内部类内可以有静态成员

  • 静态内部类要访问外部类的属性需要创建外部类对象

  • 只有内部类才可以加静态修饰符
    在这里插入图片描述
    静态内部类可以不用先创建外部类对象

 //静态内部类的创建
    外部类.内部类 inter=new 外部类.内部类();
    外部类.内部类.方法();

3.局部内部类

  • 定义在外部类的方法中

  • 作用范围只在方法中可以用

  • 方法中的属性和局部内部类不能加访问权限修饰符

  • 局部内部类里可以直接访问外部类属性。和方法一样

public class Student{
    //属性
    private name ="外部类的属性";
    //方法
    public void show(){
        final String Myname='局部变量'
        
        //局部内部类
        class Inter{
            //局部内部类的属性
            private String name="局部内部类的属性";
           
            public void show2(){
            	  int name = "局部内部类的方法中局部变量";
            	  //访问外部类的属性
                  System.out.println(Sudent.this.name);
                  System.out.println(new Student().name);
                  //访问局部内部类的属性
                  System.out.println(this.name);
                  //访问局部内部类的方法中的局部变量
                  System.out.println(name);
                    
            //访问方法局部变量 jdk1.7必须是常量,jdk1.8自动添加final
            //加final可以访问局部变量,但必须要和局部内部类的属性和方法中的变量名不同。
            //要修改final修饰的局部变量,要转换为单数组.
                  /*
1.为什么局部内部类和匿名内部类只能访问final修饰的局部变量?(可能是因为生命周期)
2.为什么在局部内部类中无法访问同名局部变量,但外部类中可以通过类名.this.属性的方式访问?
3.为什么加上数组就可以进行修改了?													
				  */
                  System.out.println(Myname);
            }
        }
        //创建局部内部类对象来调用方法show2
        new Inter().show2()
    }
    
}


//使用
public static void mian(String[] args){
    //创建外部类对象
    Student student = new Student();
    //通过show方法来使用局部内部类
    student.show()
} 

4.匿名内部类

  • 没有类名的局部内部类

  • 和局部内部类基本相同

  • 匿名内部类其实有名字是编译器帮我们自动生成的,可以在编译好的class文件中找到他。

  • 继承一个父类或实现一个接口

public class Outer{
public static void main(String[] args){
	 Userservice u = new Userservice(){
       public void Hello(){
         //使用匿名类进行方法重写
       }
   };
	u.Hello()
}
   new Innter().add();//匿名对象  
}
class Innter{ //一个java文件只能有一个public class
   public void add(){
       System.out.println("Test");
   }
} 
interface Userservice{
    void Hello();
} 

二.Object类

Object类是所有类的超集,所有的类都直接或间接的继承Object

  • 作为参数,可以接收任何对象。
  • 作为返回值,可以返回任何对象。
  • 作为类型,可以存储任何对象。

Object中的方法

clone()//创建一个对象的副本
notify()
notifyAll()
wait()//
getClass()//返回一个类的运行时类。
hashCode()//返回对象的哈希值
toString()//返回包名和 @ 16位哈希值 。//建议所有子类重写此方法
equals()//比较的是地址
//重写equals方法
public bollean equals(Object obj){
    //1.判断两个对象是否是同一个引用
    if(this==obj){
        return true;
    }
    //2.判断是否为空
    if(obj==Null){
        return false;
    }
    //3.判断是否是同一个类型
    if(obj instanceof Student){
        Student s=(Student)obj;
        
        //4.比较属性
          if(this.name.equals(s.getName())&&this.age==s.getAge()){
              return true;
          }
    }
    return false;
} 
finalize()//当对象被判定为垃圾对象,jvm去调用的 手动回收垃圾,System.gc();
new Sudent('a',23);//标记 垃圾对象

三.包装类

包装器类是引用类型
Object可统一所有数据,包装器类的默认值是NULL。

8种包装类

  1. Byte

  2. Short

  3. Integer

  4. Long

  5. Float

  6. Double

  7. Boolean

  8. Character

包装类和基本类型转换

Number提高6种共性方法

1.装箱和拆箱&自动装箱和拆箱
//装箱 :将基本类型转换成引用类型
Integer integer = new Integer(23);
Integer integer = Integer.valueOf(234);
//拆箱
int int1 = Integer.intValue();

//JDK1.5后 可以使用自动装箱和拆箱
int int2 = 234;
Integer integer = int2;
int int2 = integer;
/*
		在查看class文件后可以看出其实也使用了valueOf
*/
2.基本类型和字符串之间的转换
//使用字符串拼接
int n1 = 100;
String s1 = n1+"";
//使用Integer的toString方法
String s2 = Integer.toString(n1);
//toString(n1,16);//16进制

//使用boolean true和非true
String s1 = "true";
boolean b1 = Boolean.parseBoolean(s1);
System.out.println(b1);
3.整数缓冲区
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1 == integer2);
//结果为:false 因为引入类型存储在堆中。
Integer integer3 = 100;
Integer integer4 = 100;
System.out.println(integer3 == integer4);
//结果:true
Integer integer5 = 129;//通过查看valueOf源码的办法
Integer integer6 = 129;
System.out.println(integer5 == integer6);
//结果:false Integer在堆中的数组缓冲区大小-128 ~ 127如果有就使用缓冲区中的。 

四.String类

  • 字符串是常量,不可改变性。
  • 字符串字面值在字符串池中,可以共享(地址指向相同的值)。
//在栈中会有一个name指向方法区中的字符串常量池中test值,在赋值时会在常量池中找如果有就会直接用
String name = "test";
//张三赋值给name时,并没有修改数据,只是在常量池中重写开辟了一个张三的值,然后name指向它。
name = "张三";

创建字符串时有两种方式

//1.字面值
String name = "test";
//2.创建对象
String name = new String("test");
//创建对象的方式会在堆中创建一个对象,这个对象指向的是常量池中的值。而name是一个指向是一个地址。

String std1 = new String("test");
String std2 = new String("test");
System.out.println(std1 == std2);
//结果为false
//String中的equals方法重写了
System.out.println(std1.equals(std2));
//结果为true // 比的是地址

字符串常用的方法

int length()//返回字符的长度
char charAt()//通过下标获取字符
boolean contains(String stu)//判断当前字符串中是否包含stu
char[] toCharArray() //将字符串转换成字符数组
int indexOf();//返回字符首次出现的位置
int lastIndexOf();//返回字符最后出现的位置
String toUpperCase();//将小写转换为大写
String toLowerCase();//将大写转为小写
String trim();//字符去调前后的空格
boolean endWith()//判断字符串以什么结尾
String replace()//替换 把旧字符串替换成新字符串
String split(String stu);//根据stu做拆分

//字符串的equals方法可以比较字符大小写
String name = "zhang";
String name1 = "ZHANG";
System.out.println(name.equals(name1));
//忽略大小写
System.out.println(name.equalsIgnoreCase(name1));

//compareTo
String name = "abc";
String name1 = "xyz";
System.out.println(name.compareTo(name1));
//比较name的第一个字符的ascll码表中的数字减去name1中的第一个字符的数字,返回一个int

String name = "abc";
String name1 = "abcxyz";
//如出现上述情况就会比较字符串的长度
可变字符串
  • StringBuffer:可变长字符串,JDK1.0提供,运行效率慢,线程安全。
  • StringBuilder:可变长字符串,JDK5.0,运行效率快,线程不安全。
StringBuffer stringBuffer = new StringBuffer();
//1.append 追加
stringBuffer.append("java");
System.out.println(stringBuffer.toString);
//2.insert 选择位置添加
stringBuffer.insert(0,'学习');
//3.replace 替换
stringBuffer.replace(0,4,"hello");
//4.delete 删除
/**
 * StringBuffer和StringBuilder和执行效率
 *
 */

public class String03 {
    public static void main(String[] args) {
        //开始时间
        long start = System.currentTimeMillis();

//        String s1="";
//        for (int i = 0; i <99999 ; i++) {
//            s1+=i;
//        }


        StringBuffer s2=new StringBuffer();
        for (int i = 0; i < 99999; i++) {
            s2.append(i);
        }

//        StringBuilder s3=new StringBuilder();
//        for (int i = 0; i < 99999; i++) {
//            s3.append(i);
//        }
//
        long end = System.currentTimeMillis();
        System.out.println("用时:"+(end-start));
    }
}

经测试StringBuffer和StringBuilder差别不是很大(可能是运算量不够大导致的)但都比String字符串快,而且结果非常明显。

五.Math工具类

BigDecimal的使用

double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);
double s1 = (1.4-0.5)/0.9;
//结果为:0.09999999999999998
//在特殊场和中不允许有误查,如金融方面所有需要使用BigDecimal
//BigDecimal用法
BigDecimal bd1=new BigDecimal("1.0"); 
BigDecimal bd2=new BigDecimal("0.9");

//减发
BigDecimal s1=bd1.subtract(bd2);//结果:0.1 

//加法
BigDecimal s2=bd1.add(bd2);

//乘法
BigDecimal s3=bd1.multiply(bd2);

//除法
BigDecimal s4=bd1.divide(bd2);

BigDecimal s5= new BigDecimal("1.4").subtract(new BigDecimal("1.0")); 

六.System类

方法名说名
static void arraycopy()复制数组
static long currentTimeMillis()获取系统时间返回毫秒数
static void gc()建议JVM启动垃圾回收器
static void exit(int status)退出JVM 是0正常退出,非0是异常退出
System.arraycopy(源数组,从那个位置,目标数组,目标数组的位置,复制的长度);

native 本地方法 没有方法体是用C/C++实现的

Arrays.copyOf()的源代码是用的arraycopy 

七.时间日期类

Date类中的大部分方法都已经被Calendar类中的方法所取代

时间单位

  • 1秒 = 1000毫秒
  • 1毫秒 = 1000微秒
  • 1微秒 = 1000纳秒

Calendar类

Calendar类无法通过构造方法来创建对象。修饰成受保护的,要创建对象需要调用静态方法
static Calendar getInstance()

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

字符串→日期解析 日期→字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YJiaStudy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值