Java学习第四周(2)--面向对象第四天

学习目标:
1.基本数据类型的包装类
2.String类、StringBuffer类、StringBuilder类

3.内部类

一:基本数据类型的包装类

装箱:将基本数据类型包装为对应的包装类对象

拆箱:将包装类对象转换成对应的基本数据类型

eg.   Integer a=100;   // 自动装箱
int b=a;   // 自动拆箱

二:字符串相关类

1. String类
(1) String代表字符串类型,字符串的内容本身不可改变,字符串存储于“字符串常量池”中。
(2)String的实例化方式
     a:直接赋值法:
         eg:  String str=“Hello World”;

     b:通过new操作符实例化:
         eg: String str=new String(“Hello World”);

个人理解:在new实例化的时候,首先在栈内存中划分一块内存存放str的地址,然后在堆内存中的字符串常量池划分一块地址存放“Hello World”,这个内容是不可变的,当进行实例化后,在堆内存里划分了一块区域存放“Hello World”的复制版,这时声明的str对象指向复制的内容,原内容不变

(3)一个字符串就是一个String类的匿名对象(在堆内存中开辟了空间,但在栈内存中并没有引用指向的对象)。

(4)字符串常用方法

[1].public String(byte[] bytes 或 byte[] bytes,Charset charset)
  使用平台的默认字符集 或 指定字符 解码,将字节数组转换为字符串
[2].public char charAt(int index)
  根据索引位置获取字符串中的某个字符
[3].public boolean contains(CharSequence s)
  判断当前对象代表的字符串是否包含参数字符串内容
[4].public boolean equals(Object anObject)
  判断字符串内容是否相同
[5].public byte[] getBytes()
  将字符串转换为字节数组

eg.  byte[] b=str.getBytes();

[6].public char[] toCharArray()

   将字符串转换为字符数组

[7].public String toLower(/Upper)Case()
   将字符串转换为小(/大)写
[8].public int (last)indexOf (String str)
  (从后往前找参数字符串)返回参数字符串在当前字符串中的索引位置 
[9].public int length()
   返回当前字符串的长度

[10].public String trim()
   返回一个字符串,这个字符串删除了前导和尾随空格
[11].public String substring(int beginIndex  或   int beginIndex,int endIndex )
   从beginIndex索引位置开始,到字符串末尾  或  到endIndex-1,截取字符串
[12].public String[] split(String regex)
   通过指定的正则表达式拆分字符串,将拆分后的结果作为一个字符串数组返回

课堂练习:统计出字符串“want you to know one thing”
   中字母n和字母o的出现次数

public static void main(String[] args) {
String str="want you to know one thing";
int a=0;
int b=0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='n'){
a++;
}
if(str.charAt(i)=='o'){
b++;
}
}
System.out.println("字母n和字母o的出现次数分别是:"+a+","+b);
}


2. StringBuffer类:

(1)StringBuffer代表可变的字符序列。
  StringBuffer称为字符串缓冲区,它的工作原理是:预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。
   (2)StringBuffer是可变对象,这个是与String最大的不同(如果连续操作String对象,则会产生大量的“垃圾”,而且“断开-连接”很频繁。)
3.StringBuilder类
   StringBuilder和StringBuffer功能几乎是一样的,只是 StringBuilder是线程不安全的

eg.

public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("中国").append("香水").append("Java");
System.out.println("反转之前:");
System.out.println(sb.toString());
sb.reverse();  
System.out.println("反转之后:");
System.out.println(sb.toString());


三:内部类

1.在类的内部定义另一个类。如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer则称为外部类。
2.内部类的定义格式   public class 外部类{

                                            public class  内部类  {....}

                                   }
3.内部类在编译完成后也会产生.class文件,而文件名称则是”外部类名称$内部类名称.class”

4.使用内部类的原因:

(1) 可以方便地访问外部类的私有属性
(2) 减少了类文件编译后的产生的字节码文件的大小

5.分类 

(1)成员内部类

成员内部类中不能定义static变量,成员内部类持有外部类的引用

外部实例化成员内部类的格式:外部类.内部类  内部类对象=外部类实例.new 内部类();

eg.

public class Outer {
   private String name="中国人";
   // 成员内部类
   class MemberInner{
  public void method(){
  System.out.println("内部类可以访问外部类的私有属性:"+name);
  }
   }
   public MemberInner getMemberInstance(){
  return new MemberInner();
   }
}


public static void main(String[] args) {
Outer out=new Outer();
out.getMemberInstance().method();           // 通过在外部类中的成员方法中获取内部类对象
Outer.MemberInner in=out.new MemberInner();      //外部实例化成员内部类
in.method();
}


(2)静态内部类

如果一个内部类使用static声明,则此内部类就称为静态内部类。可以通过外部类.内部类来访问。

静态内部类不会持有外部类的引用,创建时可以不用创建外部类对象

外部实例化静态内部类对象的格式:外部类.内部类  内部类对象= new  外部类.内部类();

eg.

public class Outer {
   private String name="中国";
   private static int population=14;
   
   static class StaticInner{
  public void method(){
  System.out.println("静态内部类直接访问外部类的static属性:"+population);
  Outer out=new Outer();
  System.out.println("在静态内部类中通过外部类对象访问非static属性:"+out.name);
  }
   } 
   public static StaticInner getStaticInner(){
  return new StaticInner();
   }
}


public static void main(String[] args) {
        Outer.StaticInner in=new Outer.StaticInner();
        in.method();
}


(3)局域内部类

局域内部类是定义在一个方法中的内嵌类,所以类的作用范围仅限于该方法中,而类生成的对象也只能在该方法中使用。局域内部类不能包含静态成员。
注意:局域内部类要想访问包含其的方法中的参数,则方法中的参数前必须加上final关键字(JDK环境<=1.7)。

(4)匿名内部类

如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类

eg.

public interface Jumping {
    public void jump();
}


public static void main(String[] args) {
Jumping j=new Jumping(){
public void jump() {
System.out.println("某人跳楼了...");
}
};
j.jump();
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值