JAVA编程思想学习笔记5-chap13-15-斗之气5段
1.String对象不可变,一旦发生字符变换或者变长度,一定是新建了一个String
private final char value[];
2.字符串+与+=:唯二操作符重载
- "aaa" + "bbb" + "ccc"执行过程会创建StringBuilder对象
public class TestString {
public static void main(String[] args) {
String str = "aaa";
String s = "bbb" + str + "ccc" + "ddd";
System.out.println(s);
}
}
- javap -c TestString得到:

3.注意StringBuilder对象在toString():避免循环内多次创建StringBuilder引起低效率问题
4.String.split(String regex):通过正则表达式分割 String.replaceFirst() String.replaceAll(String regex, String obj)
5.正则表达式


6.java.util.regex Pattern与Matcher
- Pattern编译正则表达式
- Matcher匹配正则表达式
public static void main(String[] args ) {
Pattern p1 = Pattern.compile("!");
print(Arrays.toString(p1.split("abc!def!fgh!")));
Pattern p = Pattern.compile("abc+");
Matcher m = p.matcher("abcabcabccacbb");
while(m.find()) {
print("match:" + m.group() + "at" + m.start() + "to" + (m.end() - 1));
}
m.reset("abcefg");
while(m.find()) {
print("match:" + m.group() + "at" + m.start() + "to" + (m.end() - 1));
}
}
7.使用一个类需要完成三步
- 加载:类加载器执行,并创建Class对象
- 链接:验证字节码,为静态域分配存储空间
- 初始化:如果具有基类,则对其初始化,执行静态初始化器和静态初始化块
8.获取Class对象的方式
- Class.forName("类名")
- 对象.getClass()
- 类.class:使用.class创建Class对象的引用时,不会进行初始化
- 包装器.Type
9.类存在继承关系,不代表其Class对象同样具备继承关系
10.RTTI表现形式
- 传统的类型转化,如Shape从List<Shape>拿出时会从Object转回Shape
- 代表对象类型的Class对象:可用于反射机制
- instanceof(Class.isInstance()):运行时类型判断
11.动态代理
package com.chengjie; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; interface Subject {
void service();
} class RealSubject implements Subject{
@Override
public void service() {
System.out.println("RealSubject service!");
}
} public class DynamicProxyImpl implements InvocationHandler {
//
private Subject sub; public DynamicProxyImpl(Subject sub) {
this.sub = sub;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(sub, args);
} public static void main(String[] args) {
//创建被代理对象
Subject subject = new RealSubject(); //注册进动态代理中
DynamicProxyImpl dpl = new DynamicProxyImpl(subject); //创建代理对象
Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[] {Subject.class}, dpl);
proxy.service();
}
}
12.通过RTTI(如instance)可能会增加代码耦合度,可以通过将实现设置为包访问权限实现隐藏,但是通过反射依旧可以调用私有方法
13.泛型类、接口、方法
14.通配符:List<? extends Shape>表示具有任何从Shape继承的类型的列表,这里谈论的是存储类型的关系,非List得关系
JAVA编程思想学习笔记5-chap13-15-斗之气5段的更多相关文章
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- Java编程思想学习笔记——类型信息
前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定 ...
- Java编程思想学习笔记——注解
前言 在Android开发的过程中,我们为了减少重复代码的编写,会使用类似ButterKnife,AndroidAnnotations 这类依赖注解库.代码示例如下: //不使用 Button btn ...
- Java编程思想学习笔记——枚举类型
前言 关键字enum可以将一组具名的值有限集合创建一种为新的类型,而这些具名的值可以作为常规的程序组件使用. 正文 基本enum特性 调用enum的values()方法可以遍历enum实例,value ...
- Java编程思想 学习笔记1
一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...
- [Java编程思想-学习笔记]第1章 对象导论
1.1 抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...
- Java编程思想 学习笔记11
十一.持有对象 通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...
- Java编程思想 学习笔记12
十二.通过异常处理错误 Java的基本理念是“结构不佳的代码不能运行”. Java中的异常处理的目的在于通过使用少于目前数量的代码来简化大型.可靠的程序的生成,并且通过这种方式可以使你更加自信:你的 ...
- Java编程思想 学习笔记10
十.内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性.然而必须要了解,内部类和组合是 ...
- Java编程思想 学习笔记7
七.复用类 1.组合语法 在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法叫做组合. 类中域为基本类型时能够自动被初始化为零.对象引用被初始化为null. 编译器不是简单地为 ...
随机推荐
- IIS 使用域账户访问SQL 需要配置
打开应用程序的 Web.config 文件并添加以下元素: <authentication mode="Windows" /> <identity imper ...
- .NET Core开发日志——Filter
ASP.NET Core MVC中的Filter作用是在请求处理管道的某些阶段之前或之后可以运行特定的代码. Filter特性在之前的ASP.NET MVC中已经出现,但过去只有Authorizati ...
- 非节点主机通过内网远程管理docker swarm集群
这是今天使用 docker swarm 遇到的一个问题,终于在睡觉前解决了,在这篇随笔中记录一下. 在 docker swarm 集群的 manager 节点上用 docker cli 命令可以正常管 ...
- [No000014E]提问的智慧How To Ask Questions The Smart Way
原文版本历史 目录 声明 简介 在提问之前 当你提问时 慎选提问的论坛 Stack Overflow 网站和 IRC 论坛 第二步,使用项目邮件列表 使用有意义且描述明确的标题 使问题容易回复 用清晰 ...
- shell脚本的基本结构以及如何执行
1.shell脚本通常以.sh为后缀,不是说不带这个.sh脚本就不会执行,而是大家一种通用的命名规范而已 2.shell脚本中的第一行一定是:#! /bin/bash.该命令说明,该文件使用的是bas ...
- 安装和配置hive
1.上传hive.mysql.mysql driver到服务器/mnt目录下: [root@chavin mnt]# ll mysql-5.6.24-linux-glibc2.5-x86_64.tar ...
- C和C指针小记(二)-注释,三字母词,编译选项
课后的几个问题: 1) int x/*blah blah*/y; 会有什么问题? 答:编译器报错,语句中不应该有多行注释 单行注释也应该放到语句后面或者独自占一行. 2)打出下面一行字符串(包括引号) ...
- Microsoft .NET Framework
Microsoft .NET Framework是用于Windows的新托管代码编程模型.它将强大的功能与新技术结合起来,用于构建具有视觉上引人注目的用户体验的应用程序,实现跨技术边界的无缝通信,并且 ...
- PHP-之POSIX系列函数和兼容Perl系列函数比较
PHP有两种正则系列函数 POSIX 系列和兼容Perl系列的函数 在PHP大于5.3使用POSIX系列函数会报E_DEPRECATED 错误, POSIX系列函数在大于5.3版本不建议使用,PHP7 ...
- iOS只给矩形两个边加圆角
- (void)updataTopCornerRadius { CGRect clipRect = CGRectMake(, , self.headPhotoIv.width, self.headPh ...