java自学之路-day10
JAVA10
Eclipse快捷键补充
l 选中类Ctrl T 继承树
l Ctrl 或者f3 查看源码 多态会跳转到调用父类中
l Java中lang包中的所有类 不需要导包 直接用 例如 System String
l Ecplise 中的Jre System Library是默认的eclipse依赖jre的类库 在该位置可以查找到平常使用的String 类 Random类 Math类
l Jdk 包括 jre和开发工具,jre包括jvm 和运行时所需要的核心类库
l 运行 helloworld 运行了本类的同时还运行了System类等核心类库
rt装了平时用到的核心类的.class文件
java中的文档注释和制作
- 为了让使用者能够明白程序的意思
- 文档注释
- /** 回车键 类的文档注释
作者
类的功能
@标记作者 版本
- 方法的文档注释
/** 回车
功能
参数
返回值
- 注释在源码中 class文件没有注释 需要使用工具把注释变为说明书
- Javadoc.exe
- Eclipse中的用法
Export—java—Javadoc—选中要需要打说明书的包—finsh
找到index 点击
注释必须写在自动生成的下边或者上面
生成jar包
- 怎么用一个类或多个类
- 打成 jar包
- Jar.exe
- Export—java—JAR File –选中需要打的包—finish
- 里面只有.class文件
- 之前都是直接在path中改 不好操作 容易改错
- 新建系统变量 JAVA_HOME
- 路径为 jdk的目录
- Path中添加%JAVA_HOME%\bin;
JAVA_HOME配置
%%表示引用
导入jar包
l 命令行导入
l 设置classpath 告知jvm去哪个路径下找可以运行的class
l set classpath
l eclipse怎么导入jar包
new—floder—lib—拷贝jar包到lib中——右键buildpath—add to buildpath
和使用命令行设置一样
类中的权限修饰符
l public 公共访问 修饰类 方法成员变量
l protected 受保护访问子类中访问 方法 成员变量
l 默认 什么也不写 默认访问 类 方法 成员变量
l Private 私有访问 方法 成员变量
l Static 静态修饰符 方法成员变量
l Final 最终修饰符 类 方法 成员变量 局部变量
l Abstract 抽象修饰符 类 方法
l Abstract 和private不能同时用
l Abstract 和static 不能同时使用
l Abstract 和final不能同时使用
l 修饰类 最常见是public
l 修饰成员变量 最常见的是private
l 构造方法 最常见的是 public
l 成员方法 最常见得是 public static abstract
局部变量和成员变量设计解析
l 如果是属于事物的属性就用成员变量 计算长方形的面积和周长
l 如果是属于事物功能方法的属性就用局部变量 计算两个数的乘积和求和
l 如果没有使用非静态变量就定义静态方法
类作为方法的参数和返回值
l 作为方法的参数
- 写在方法的参数列表中
- 利用类的引用变量用来调用方法
- 一个对象有两个变量来指向 一般对象最为参数
- 匿名对象作为参数
l 作为方法的返回值
- 一般对象作为参数
- 匿名对象作为参数
抽象类型作为方法的参数和返回值
l 作为方法的参数
- 抽象类作为参数 没有对象
- 实际传递的是子类的对象实例
- 调用的的方法是子类实现的方法
- 可以传递多种子类对象 多态调用的扩展性
l 作为方法的返回值
- 抽象类作为返回值 void改为是抽象类
- 没有对象 只能返回子类的对象
- 接收的类型应该为 抽象类类型
- 但缺点是 不知道返回的是哪一个子类对象
- 可以在方法中加参数 再加入if条件句等用来选择返回哪一个子类对象
接口作为方法的参数和返回值
l 作为方法的参数
- 传递的还是实现类的对象实例
- 调用的也是实现类的实现方法
- 多态传递子类对象也可以
- 调用接口中的常量
a) 可以直接用接口名调用
l 作为方法的返回值
- 返回的也是实现类的对象 多态的调用
- 接收的也还是接口的类型
- 调用的实现类的方法
- API中很多接口对象都是用get来获得的,而不是用new出来的
- 对于调用者来讲简化了代码
- 日历类
抽象类作为方法的返回值案例
a) 是一个抽象类
b) 导包 util
c) 已知子类 重新抽象方法
d) 非抽象方法 直接继承使用
e) 静态get方法 获得Calendar子类对象
f)
g)
h) 不需要知道子类是什么
五星酒店案例
- 介绍
a) 酒店中多名员工 一名经理(特有奖金) 一名厨师 两名服务员
b) VIP服务
c) 调用员工功能
d) 调用VIP服务
l 分析
- 员工类 共性 父类
- 厨师 服务员 经理(特有奖金) 各有的特性 子类
- VIP服务 额外方法 接口
- 酒店 使用者 测试类
总结
l 修饰符
定义的时候用的
类 public
内部类可以当做一个成员来讲
这里类常指外部类
成员 private
方法 public
l 自定义数据类型作为返回值和参数
类
抽象类
接口
API
引入
- SUN公司做好的
- 一般不需要知道怎么实现的
- 知道怎么使用就行
- src.zip 源码文件
- 可以查看源码
- API文档
- 查找方式
软件包 String java.lang
显示按钮 索引
Object类 常用类
- 所有类都是他的子类
- 构造方法 Object();
- 接口是否继承object
否
接口没有构造器没有访问object类的构造器
equals()方法
a) Object类中的方法之一
b) 用来进行比较是否与此对象相等
c) 方法形式参数是object类型 因此所有的类型都可以作为实参
d) 所有类都继承Object类 所以 任何类的对象都可以来调用equals方法来使用
e) 非静态方法
f) 返回值是布尔值
g) 比较内存图
i. this 是方法调用者
ii. obj 表示被比较的对象
iii. Object 类是顶层类 其引用变量可以指向任意类的实例对象的内存地址
iv. == 比较两个对象内存的地址
v. 结果为false返回给方法调用
vi. 没有意义 因为两个对象内存地址肯定不一样 没有可比性
l 重写equals
- 比较对象成员变量
- this 改为 this.age
- obj不能直接调用传过来对象的特有属性
因为Object obj=另一个对象 是多态上转型,父类不能调用子类特有属性
- 所以需要改为 向下转型为另一个对象的类型才可以调用
- 弊端:
只能传递相应的对象 如果传递其他类型比如数组就会抛出异常或出错
- 所以需要进行判断是否为对应的对象类型 instanceof
- 另外还需要进行非空判断 返回false 和同一个对象判断 返回true
ToString方法
l 返回值是String类型
l 输出语句中输出的是对象时默认调用对象的toString方法
l System.out.println(对象p); 和System.out.println(对象p.toString);相同 输出对象的内存地址
l 重写方法toString
- 返回对象的成员变量
- 打印Random类的对象是地址 打印Scanner类的的对象不是地址
- 因为Scanner重写了ToString方法
- 概念和特性
- 特点
String类
一切皆对象
字符串是一个事物也是一个对象
类是描述事物的 String类就是描述字符串的
- 有很多方法来操作字符串
- 所有“ ”都是一个String类对象
- String str =”ddd”
String 类名
Str 引用类型的变量
“ ”是对象实例
不用new
打印str 也没有打印出地址 因为也是String类对toString重写了
- String 常量
- 字符串是一个常量 不可更改
- 字符串对象不变 而不是引用类型变量不变 引用类型变量可以重复赋值
- 内存图
字符串是一个对象
运行的时候在堆内存
本质是一个字符的数组
“abcd”相当于char value[]={a,,b,c,d}
String 类中是 private final char value [];
所以是常量
- 内存图
- Main方法进栈
- 定义Str 常量 abcd
- 退内存中有常量池
- 常量池中有很多常量
字符型常量有52个
需要一个itacat时从常量池中拿出来用
本质是一个字符数组 str指向字符数组空间地址 由于重写了toString方法 就输出了itcast
如果又新建了一个str变量=abcde 那么就会重新开辟一个char数组内存,重新指向一个新数组内存地址, 输出就会改变
- 创建方式
- String str1=new String(“abc”);
- String str2=new String(“abc”);
- str1==str2
- str1.equal(str2)
- 内存图
- String str1=new String(“abc”);
新建了两个对象
一个是 new String();
一个是 字符数组 value[]
New String 保存的是 value[]的内存地址
所以输出的是abc
- String str2=new String(“abc”);
检测是否有abc数组 检测到有 则直接指向value数组的内存地址
所以输出 str1==str2 因为地址相同所以 输出 true
而 .equals 因为父类String重写了equals方法 用来比较字符串中的每个字符是否相同,而不是比较地址
- String类构造方法
- String(byte[ ] bytes)
a) 通过使用平台的默认字符集指定byte数组,构造一个新的String
b) 中文操作系统 默认编码表是 GBK
c) 将定义的byte数组中的元素在编码表中进行查询 然后构造出来一个全新的字符串
d) 如果是负数 查询GBK 两个字节一个汉字
- String(byte[] bytes,int offset,int length)
a) 前面是一个字节数组 后面的截取的范围 一个int表示起始索引 一个表示 截取个数
- String(char[] value){};
a) 将字符数组转为字符串 字符数组的参数 不查询编码表
- String(char[] value,int offset.int count)
a) 前面是一个字符数组 后面的截取的范围 一个int表示起始索引 一个表示 截取个数
- String(””)
- String类的查找功能
- length(); 返回int 字符串的长度
- 获取部分字符串
a) substring(int beginIndex,int endindex)
b) 开始索引 和 结束索引 包含头部不包含尾部
c) 返回一个新的字符串 需要重新用变量接收
d) 前面索引必须大于后面索引
e) substring(int beginIndex); 包含头部 后面的全要
- startwith(String prefix);
测试字符串是否以指定的前缀字符串开始
返回一个布尔值
- endwith(String prefix);
测试字符串是否是一个字符串的后缀
返回一个布尔值
- contains(String xxx)
判断一个字符串中,是否包含另一个字符串
- indexof(char ch)
查找一个字符,在另一个字符中第一次出现的索引
返回 -1表示没有包含
- getBytes()
将字符串转成字节数组
功能和构造方法相反
返回一个字节数组
数组里面是对应的查询编码表
- chartAt(int index)
返回索引上的字符
- toCharArray()
将字符串转成字符数组
功能和构造方法相反
返回一个字符数组
不查询编码表
- equals()
是否相同
equalsIgnorecase(String s)
是否相同忽略大小写
- 练习
StringBuffer类
1.概念
- 字符串缓冲区 提高字符串效率
- 内部是可变数组 类的父类内部定义了个字节数组char数组 没有final
- 默认容量是16个字符
- String不可变 一个“”就代表一个数组 相加之后又是一个新数组 消耗资源
- StringBuffer 可以扩容
- 默认容量 由构造器调用父类构造方法传递16创建默认数组
2.方法
- append(类型 变量名)
a) 可以添加任何类型变量
b) 返回值是StringBuffer
StringBuffer buffer=new StringBuffer();
buffer.append(6);
System.out.println(buffer);
c) Append 方法源码是返回this;
谁调用append就返回谁
buffer.append(6).append("2522");
方法调用链
- delete(int start,int end)
a) 删除指定索引区间的字符 包头不包尾
b) 返回StringBuffer
c) 删除全部 0 到length
- Insert(int index,任意类型)
添加任意类型数据到指定位置
a) 可以多一位不可以多两位
- replace(int start,int end,String str)
替换范围内的字符串 包头不包尾
- reverse();
将缓冲区内的字符翻转
- toString
继承Object类重写的toString方法
将可变的缓冲区对象转换为不可变String对象
StringBuilder
l 提供一个和StringBuffer兼容的API
l 不同
StringBuilder线程不安全 运行快
StringBuffer线程安全 运行慢
所以在使用单线程时使用StringBuilder比较好
练习
改变数组输出格式为【2,1,2】