chap11-常用类


一.内部类

  • 概念

    在一个类的内部再定义一个完整的类

      class Outer{
      	class Inner{
      	
      	}
      }
    

    特点:编译后可以生产Outer$Inner.class

    作用:内部类可以直接访问外部类的私有成员,不破坏封装,内部类可以作为外部类提供必要的功能组件

  • 内部类的分类:成员内部类、静态内部类、局部内部类、匿名内部类(对比变量)

    • 成员内部类(对比成员变量)

      定义位置:类的内部,方法的外部

      语法:

        class Outer{
        	class Inner{
        	
        	}
        }
      

      创建对象

        //创建外部类对象
        Outer o = new Outer();
        //创建内部类对象---依靠外部类对象
        Outer.Inner i = o.new Inner();
      

      注意:

          外部类成员和内部类成员重名时,优先使用内部类成员

          外部类成员和内部类成员重名时,使用Outer.this.属性/方法(),访问外部类的外部类成员

    • 静态内部类(类变量)

      • 定义位置:类的内部,方法的外部,使用static进行修饰

      • 语法:

          class Outer{
          	static class Inner{
          	}
          }
        
      • 创建对象:

          //依靠外部类类名
          Outer.Inner i = new Outer.Inner();
        
      • 注意:

            静态内部类只能访问外部类的静态成员,不能访问外部类的非静态成员

    • 局部内部类(对比局部变量)

      • 定义位置:方法的内部

      • 语法:

          class Outer{
          	public void m(){
          		class Inner{
        
          		}
          	}
          }
        
      • 创建对象:

          Inner i = new Inner();
        
      • 注意:

            局部内部类访问当前方法的局部变量时,此时局部变量默认final(jdk1.8隐式添加final;需要保证镀锡的生命周期和局部变量的声明周期保持一致)

    • 匿名内部类(特殊的局部内部类)

      • 定义位置:方法内部

      • 语法:(有继承父类或者接口)

          //创建对象和定义类同步完成
          父类名|接口名  对象名 = new 父类名|接口名(){
          		//类的属性
          		//类的方法
          }
        
      • 注意:

            必须继承父类或者实现接口

            创建对象和定义类同步完成

            匿名内部类只能创建一个对象

二.Lambda表达式

  • 概念:函数式接口的实现类定义及创建对象的简写形式

  • 语法:

      类型  引用名=(参数) ->{方法实现};
      ->左侧:代表接口的实现类的形参
      ->右侧:代表接口实现类的方法实现
    
  • 注意:

        如果方法有参数,参数类型可以省略,有系统自动推断出参数类型

        如果参数有一个,小括号也可以省略

        如果方法实现只有一条语句时,可以省略{}

        如果方法只有一个返回值,可以省略return

三.Object类

  • 概念:所有类的根类、超类、基类、所有类的直接或者间接父类,如果显示定义父类,隐式继承Object

    • 作用:管理所有数据

      使用Object作为参数;接受Object+所有对象

      使用Object作为返回值;可以返回Object+所有对象

  • 常用方法:

    • getClass():返回运行时类

        ia.getClass()==ca.getClass()//通常用来判断两个引用指向的对象类型是否相同
      
    • hashCode():返回对象的哈希码值(十进制的地址)

        Integer.toHexString(十进制);//十进制值转十六进制
      
    • toString():返回对象形式的字符串表示形式

        //toString()通常重写,返回对象的属性值(给开发人员用于测试使用)
        @Override
        public String toString() {
        		return "Worker [name=" + name + ", age=" + age + ", salary=" +salary + "]";
        }
      
    • equals(Object o):判断两个对象是否相同

        ==:对比基本数据比值;对比对象比地址
        equals()重写前比地址;通常重写比对象内容
        //重写equals()
        public boolean equals(Object obj){
        	//自反性:判断obj是不是当前对象
        	if(this==obj)return true;
        	//非空性:判断参数是否为null
        	if(obj==null)return false;
        	//类型判断:判断当前对象的类型是否参数相同
        	if(this.getClass()!=obj.getClass())return false;
        	//强转 obj转为本类类型
        	Dog d=(Dog)obj;
        //逐一比较属性:引用类型用equals(),基本类型==
        if(this.breed.equals(d.breed)&&this.age==d.age&&this.weight==d.weight)return true;
        	return false;
        }
      
    • finalize():垃圾回收器(GC)回收垃圾对象时执行的方法

      垃圾对象:没有引用指向的对象

      垃圾回收时机:

        自动回收:当jvm无法为新创建的对象开辟空间时,自动进行垃圾回收
        手动回收:System.gc(),等到程序空闲时执行垃圾回收
      

       

        问题:
        		final、finalize、finally有什么区别?
      

    四.包装类

    • 概念:
      为了使Object可以管理所有的数据包括基本类型,为八种基本类型的数据提供对应的对象类型
    基本类型包装类
    byteByte
    shortShort
    intInteger
    longLong
    floatFloat
    doubleDouble
    charCharacter
    booleanBoolean
    • 转换

        // int---->Integer
        int i=10;
        //使用构造方法将int转为Integer
        Integer i1=new Integer(i);
        //使用Integer类中静态valueOf(int)将int转为Integer
        Integer i2 = Integer.valueOf(i);
      
        //Integer---->int
        //使用intValue()将Integer转为int
        int i3 = i1.intValue();
      
        //String---->Integer
        String s="234";
        //使用构造方法将String转为Integer
        Integer i4 = new Integer(s);
        //java.lang.NumberformatException:数字格式异常
        //原因:不是数字类型的值转换为数字
        //使用Integer类中静态valueOf(String)将String转为Integer
        Integer i5 = Integer.valueOf(s);
        
        //Integer---->String
        //使用toString()将Integer转为String
        String s1 = i5.toString();
        String s2=i5+"";
        
        //int---->String
        String s3=i+"";
        
        //String---->int
        //使用Integer类中静态parseInt(String)将String转为int
        int i6 = Integer.parseInt(s);
      
    • 自动装拆箱

      • 从jdk5.0之后,java为基本类型和包装类型的转换提供自动转换机制

          Integer i7=10;//把基本类型转为包装类型-->自动装箱
          int i8=i7;//把包装类型转为基本类型-->自动拆箱
        
    • 数字缓冲区

      把常用的-128~127区间内的256个数字在底层创建一个数组,用于多次使用,数组称为数字缓冲区

        public static Integer valueOf(int i) {
        		//判断i>=-128&&i<=127
        		if (i >= -128 && i <= 127)
        			//返回底层创建数组中的元素
        			return IntegerCache.cache[i + (-IntegerCache.low)];
        		//如果不在范围内重新创建对象进行返回
        		return new Integer(i);
        }	
      

      在这里插入图片描述

      • 作用:用于区分有效数据和无效数据

        所有对象的属性都应该是包装类

        (equals进行比较时,属性逐一比较都是用equals())

五.String类

  • 常用方法

      //charAt(int i):返回指定下标i对应的字符
      char c = s.charAt(1);
      System.out.println(c);
      
      //compareTo(String s):比较两个字符串
      System.out.println(s.compareTo(s1));
      
      //contains(String s):判断字符串是否包含子串s
      System.out.println(s.contains("Hello"));
      
      //startsWith(String s):判断字符串是否以s开头
      System.out.println(s.startsWith("Hello"));
      
      //endsWith(String s):判断字符串是否以s结尾
      System.out.println(s.endsWith("ld"));
      
      //indexOf(String s):返回字符串中s第一次出现的下标
      System.out.println(s.indexOf("l"));
      
      //lastIndexOf(String s):返回字符串中s最后一次出现的下标
      System.out.println(s.lastIndexOf("l"));
      
      //length():返回字符串的长度
      System.out.println(s.length());
      
      //isEmpty():判断字符串是否为null
      System.out.println(s1.isEmpty());
      
      //replaceAll(String s1,String s2): 将字符串中所有的S1更换为S2
      System.out.println(s.replaceAll("l", "k"));
      
      //split(String s):以s为界限拆分字符串
      String s2="aa:bb:cc:dd:ee";
      String[] ss = s2.split(":");
      for(int i=0;i<ss.length;i++) {
      	System.out.println(ss[i]);
      }
      
      //substring(int i1,int i2):获取字符串中从i1开始到i2下标之前的字符串
      String s3 = s.substring(2, 5);
      System.out.println(s3);
      
      //toCharArray():将字符串转为字符数组
      char[] cs = s.toCharArray();
      for(int i=0;i<cs.length;i++) {
      	System.out.print(cs[i]+" ");
      }
      System.out.println();
      
      //toLowerCase():把字符串中字母转为小写
      System.out.println(s.toLowerCase());
      
      //toUpperCase():把字符串中字母转为大写
      System.out.println(s.toUpperCase());
      
      //trim():删除字符串前后空格
      String s4="      abc       def               ";
      System.out.println(s4.trim());
    
  • 不可变长字符串

    • 一旦创建,长度不可变
      在这里插入图片描述

        问题:String s="Hello"和String s=new String("Hello")的区别?
        答:String s="Hello":创建在串池中,引用指向串池中的Hello,如果串池中存在Hello直接使用,不在创建
        String s=new String("Hello"):new就是在堆空间开辟空间,创建String对象 ,同时查看串池中是否出现Hello,
        如果没有创建Hello对象放在串池里,然后使引用指向堆空间数据,如果串池中存在Hello,无需再串池中创建Hello,
        使引用指向堆空间中创建的对象
      
  • 可变长字符串

    使用append进行拼接

      问题:StringBuilder、String、StringBuffer在拼接字符串时的区别?
      答:String:进行拼接时,产生大量中间字符串,影响拼接效率,JDK1.8之后,进行拼接自动使用StringBuilder
      StringBuilder:JDK5.0的产物,线程不安全,效率高
      StringBuffer:JDK1.0的产物,线程安全,效率低
    

 
 
 
 

看完如果对你有帮助,感谢点赞支持!
                                           在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值