07.第十章:面向对象的思考

类的抽象是指将类的实现和类的使用分离开。
实现的细节被封装并且对用户隐藏 , 这被称为类的封装 。
面向过程的范式重点在于设计方法 。 面向对象的范式将数据和方法耦合在一起构成对象 。

  • 类的关系:关联 、 聚合 、 组合以及继承 。
    • 关联
  • 聚集和组合

示例学习:设计栈
用数组实现:


/**
 * 用数组实现一个栈
 */
public class StackOfIntegers {
    //定义了栈的数组
    private int[] elements;
    //size表示栈内元素大小,size-1就是目前的栈顶元素
    private int size;
    //设置默认的数组大小
    private static final int DEFAULT_CAPACITY=16;

    public StackOfIntegers(){
        elements=new int[DEFAULT_CAPACITY];
    }
    //入栈
    public void push(int value){
        if(size>=elements.length) {
            //如果size>=数组的大小,就将数组的大小扩容
            int[] temp = new int[elements.length * 2];
            System.arraycopy(elements,0,temp,0,elements.length);
            elements=temp;
        }
        elements[size]=value;
        size++;
    }

    //出栈
    public int pop(){
        //要弹出的元素目前在栈顶,size是共有的元素长度,下标是size-1
        int number= elements[size-1];
        //弹出后,size长度减少一个
        size--;
        return number;

    }

    //判栈空
    public boolean empty(){
        return size==0;
    }

    public static void main(String[] args){
        StackOfIntegers stackOfIntegers=new StackOfIntegers();
        for(int i=0;i<10;i++)
            stackOfIntegers.push(i);
        while (!stackOfIntegers.empty())
            System.out.print(stackOfIntegers.pop()+" ");
    }

}

2.数值包装类

出于对性能的考虑 , 在 Java 中基本数据类型不作为对象使用 。 因为处理对象需要额外的系统开销 , 所以 , 如果将基本数据类型当作对象 , 就会给语言性能带来负面影响 。 然而 ,Java 中的许多方法需要将对象作为参数 。 Java 提供了一个方便的办法 , 即将基本数据类型并入对象或包装成对象 ( 例如 , 将 int 包装成 Integer 类 , 将 double 包装成 Double 类 , 将char 包装成 Character 类 ) 。 通过使用包装类 , 可以将基本数据类型值作为对象处理 。 Java为基本数据类型提供了 Boolean 、 Character 、 Double 、 Float 、 Byte 、 Short 、 Integer • 和Long 等包装类 。 这些包装类都打包在 java . lang 包里 。

  • 数值包装类有一个有用的静态方法 valueOf(String s ) 。 该方法创建一个新对象 , 并将它初始化为指定字符串表示的值 。 例如 ,


  • Integer 类中的 parselnt 方法将一个数值字符串转换为一个 int 值 ,而且使用过 Double 类中的 parseDouble 方法将一个数值字符串转变为一个 double 值 。 每个数值包装类都有两个重载的方法 , 将数值字符串转换为正确的以 10 ( 十进制 ) 或指定值为基数 ( 例如 , 2 为二进制 , 8 为八进制 , 16 为十六进制 ) 的数值 。
3.基本类型和包装类类型之间的自动转换

将基本类型值转换为包装类对象的过程称为装箱 ( boxing ) , 相反的转换过程称为开箱 Java 允许基本类型和包装类类型之间进行自动转换 。 如果一个基本类型值出现在需要对象的环境中 , 编译器会将基本类型值进行自动装箱 ; 如果一个对象出现在需要基本类型值的环境中 , 编译器会将对象进行自动开箱 。

4.String类
1)不可变字符串

String 对象是不可变的 , 它的内容是不能改变的。
String s=“Java”;
s=“HTML”;


第一条语句创建了一个内容为 java的 String 对象 , 并将其引用賦值给S,第二条语句创建了一个内容为 " HTML " 的新 String 对象 , 并将其引用賦值给 s 。 陚值后第一个 String 对象仍然存在 , 但是不能再访问它 , 因为变量 s 现在指向了新的对象 。

2)限定字符串

因为字符串在程序设计中是不可变的 , 但同时又会频繁地使用 , 所以 Java 虚拟机为了提高效率并节约内存 , 对具有相同字符序列的字符串直接量使用同一个实例 。 这样的实例称为限定的 ( interned ) 字符串 。

3)字符串的替换和分离
4)正则表达式
  • 匹配字符串使用String类中的maches方法
    " Java is fun " . matches ( " Java . * " )
  • 正则表达式的语法
  • 例1:社会安全号的模式是 XXX - XX - XXX , 其中 X 是一位数字。
    [\d]{3}-[\d]{2}-[\d]{3}
    解析:[\d]表示数字,{3}表示前面的模式出现次数,在这里就是3个数字。

  • 例2:偶数以数字 0 、 2 、 4 、 6 或者 8 结尾
    [\d][02468]
    解析:[\d]
    表示可以有0到多个数字,[02468]表示0或2或4或6或8

  • 例3:电话号码的模式是 ( XXX ) XXX - XXXX , 这里 X 是一位数字 , 并且第一位数字不能为 0
    \([1-9][//d]{2}\)[\d]{3}-[\d]{4}

  • 例4:假定姓由最多 25 个字母组成 , 并且第一个字母为大写形式
    [A-Z][//d]{1,24}

  • 例5:Java 标识符必须以字母 、 下划线 ( - ) , 或者美元符号 ( $ ) 开始,不能以数字开头 。
    标识符是一个由字母 、 数字 、 下划线 ( - ) 和美元符号组成的字符序列 。
    [a-zA-Z_$][\w]*

  • 替换和分割字符串

System . out . println ( " Java Java Java " .replaceAll(" v \\ w " , " wi " ) );
Jawi Jawi Jawi
System . out . println ( " Java Java Java " . replaceFirst( '' v\\w " , " wi " ) ) ;
Jawi Java Java 
5)字符串与数组之间的转换
  • 为了将字符串转换成一个字符数组 , 可以使用 toCharArray() 方法
    char [ ] chars = " Java " . toCharArray ();
  • 使用方法 getChars ( int srcBegin . int srcEnd , char [ ] dst , int dstBegin ) 将下标从 srcBegin 到 srcEnd - 1 的子串复制到字符数组 dst 中下标从 dstBegin 开始的位置。


  • 为了将一个字符数组转换成一个字符串 , 应该使用构造方法 String ( Char [] ) 或者方法valueof ( char [ ] )
String str=new String(new char[]{'J','a','v','a'});
String str=String.valueOf(new char[]{'J','a','v','a'});
6)将字符和数值转换成字符串
  • 可以使用 Double . parseDouble ( str ) 或者 Integer.parselnt ( str ) 将一个字符串转换为一个 double 值或者一个 int 值。
  • 为了将 double 值 5 . 44 转换成字符串 , 可以使用 String . valueof ( 5 . 44 ) 。
5.StringBuilder 和 StringBuffer 类

— 般来说 , 只要使用字符串的地方 , 都可以使用 StringBuilder / StringBuffer类 。StringBuilder/StringBuffer类比 String 类更灵活 。 可以给一个 StringBuilder或 StringBuffer 中添加 、 插入或追加新的内容 , 但是 String 对象一旦创建 , 它的值就确定了 。
StringBuilder:线程非安全的
StringBuffer:线程安全的。
如果是多任务并发访问 ,就使用 StringBuffer。

  • 示例学习
    判断回文串时忽略既非字母又非数字的字符。
package java_04_基础习题练习.第十章_面向对象的思考;

import java.util.Scanner;



/**
 * 判断回文串时忽略既非字母又非数字的字符
 */
public class HuiwenIgnoreNonwd {
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        String s=input.nextLine();
        System.out.print("忽略非字母又非数字的字符后"+s+"是回文串吗?"+isHuiWen(s));
    }

    private static boolean isHuiWen(String s) {
        //调用过滤方法返回新串
        String filters=filter(s);
        return filters.equals(reverse(filters));
    }

    private static String filter(String s) {
        StringBuilder stringBuilder=new StringBuilder();
        for(int i=0;i<s.length();i++){
            //如果字母是数字或字符
            char c=s.charAt(i);
            if(Character.isLetterOrDigit(c))
                stringBuilder.append(c);
        }
        return stringBuilder.toString();
    }

    private static String reverse(String s){
        StringBuilder stringBuilder=new StringBuilder(s);
        return stringBuilder.reverse().toString();
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,565评论 18 399
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,857评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • 看见鬼的少女(十一) 1 我盯着资料上那一串数字,要不要给林天歌打电话? 如果是他指定我来策划这次展览,那么他是有...
    艾偲怡阅读 1,156评论 17 26
  • 一日去食堂。我:“有馒头吗?”食堂阿姨:“有!”我:“有花卷吗?”食堂阿姨:“有!”我:“有千层饼吗?”食堂阿姨:...
    杀生丸殿下绝杀阅读 277评论 0 0