实训笔记6.12
- 6.12
- 一、座右铭
- 二、知识回顾
- 2.1 面向对象的两大核心概念:类和对象
- 2.2 面向对象的三大特征
- 封装性
- 继承性
- 多态性-必须在继承之上
- 抽象性
- 2.3 面向对象的常用关键字
- 2.4 Java设计模式中适配器模式
- 2.4.1 接口适配器
- 2.4.2 类适配器
- 2.4.3 对象适配器
- 三、Java常用类
- 3.1 Object类
- 3.1.1 类的概念
- 3.1.2 Object类提供的方法
- 3.2 Java中的String类、StringBuffer类、StringBuilder类
- 3.2.1 String类
- 3.2.2 String字符串的创建方式
- 3.2.3 String字符串常用的一些方法
- 3.3.4 StringBuffer和StringBuilder
- 四、补充知识点
- 4.1 Eclipse如何打jar包,如何运行jar包
- 4.2 JavaDOC文档
6.12
一、座右铭
我的故事你说,我的文字我落,我值几两你定,我去何方我挑。
二、知识回顾
2.1 面向对象的两大核心概念:类和对象
类的声明
访问控制修饰符 [final|abstract] class ClassName extends FatherClass implements FatherInterface... {
类的组成:
1.属性:
访问控制修饰符 [static] [final] 数据类型 属性名 [=属性值];
属性的默认值-属性的默认初始化问题
2.方法:
访问控制修饰符 [static] [final] [abstract] 返回值类型 方法名(形参列表) throws xxxException{
方法体
}
方法重载:两同三不同
3.构造器
访问控制修饰符 类名(形参列表) {
构造体;
}
构造器的作用是用来创建本类的某一个实例对象
构造器的默认值问题
类名 对象名 = new 构造器名(实参列表);
4.代码块
[static] {}
代码块是Java类中唯一的一块可以自动执行的代码块,代码块的调用时机:
本类构造方法的“第一行“—this和super调用的构造器之后,”第二行“—构造体之前。
public Student(){
super();
this.name = “zs”;
}
5.内部类
访问控制修饰符 [static] [fianl] [abstract] class ClassName extends xxx implements xxxx{}
匿名内部类:没有名字的类,用类的父类或者父接口当作类名去定义
}
2.2 面向对象的三大特征
封装性
访问控制修饰符的分类、访问控制修饰符的权限、访问控制修饰符可以声明的位置-可以修饰的内容
protected的权限虽然能被不同包下的子类使用,子类需要通过super关键字来进行调用使用。
继承性
子类和父类的关系:is a,
继承中的方法重写问题:不同类(父子类)当中、方法名和形参列表必须相同,返回值类型必须相同、子类的重写的方法的权限不能、子类的返回值类型必须是父类方法的返回值类型或者父类返回值的子类、子类方法的访问控制修饰符的权限必须大于等于父类方法的访问控制修饰符权限
子类的构造器的调用问题。
Java中超类问题
多态性-必须在继承之上
编译时类型和运行时类型、只有方法的多态、必须进行方法重写、向上转型和向下转型
抽象性
抽象类、抽象方法
抽象类有两种子类:抽象子类,非抽象子类
接口:has a
接口有三种子类:
-
子接口:继承
-
抽象子类:实现
-
非抽象子类:实现
2.3 面向对象的常用关键字
- static:属性、方法、代码块、内部类
- final:类别、属性、方法
- this 和 super:创建一个Java对象之后,堆区中每一个对象会多出两个属性
- package和import
- instanceof 判断某一个对象的运行时类是不是某个Java类的类型或者子类
对象名 instanceof 类名
-
abstract
-
enum
2.4 Java设计模式中适配器模式
适配器就是将原先无法直接使用的某个接口或者类通过适配器模式转换为可以使用的接口或者类。适配器模式的好处就是可以再不改变原有代码的基础之上也可以实现相关的功能。
适配器模式分为:类适配器、对象适配器、接口适配器。
2.4.1 接口适配器
接口中有很多的抽象方法,但是再使用接口的时候我们只关注其中某一个方法,其他方法我们不需要,但是因为接口的特性,如果我们要使用这个接口,必须重写接口中所有方法。
创建一个接口的适配器,接口的适配器是一个Java类,适配器需要将接口的所有抽象方法给重写了,但是重写之后只做空实现,后期如果使用接口,只需要继承适配器类。
Java中GUI中有很多接口适配器,MouseAdpter
2.4.2 类适配器
有一个电压220V实现手机充电的效果电源适配器将220V的电压转换成为可以充电的东西。
让适配器类继承被适配器
package com.sxuek.designmodel;
public class U {
public void out() {
System.out.println("220V");
}
}
interface Chongdian{
void chongdian();
}
class ChrageAapter extends U implements Chongdian{
@Override
public void chongdian(){
out();
//xxxxxxx
}
}
2.4.3 对象适配器
让被适配的类称为适配器的一个属性。
三、Java常用类
3.1 Object类
3.1.1 类的概念
Object类是Java中超类,Java中的任何一个类最终都会直接或者间接的继承自Object类.
Object类当中定义了Java中所有类必须具有的公有方法。
3.1.2 Object类提供的方法
方法名 | 返回值类型 | 说明 |
---|---|---|
getClass() | Class | 获取某个对象的运行时类 |
toString() | String | 打印对象时,对象会默认调用toString方法,返回这个返回的执行结果。 默认情况下Object类提供的方法返回的是对象的地址。这个方法我们一般是需要重写的。 |
equals(Object o) | boolean | 比较两个引用数据类型的值是否相等的。 默认情况下,Object类提供的这个方法底层默认实现也是== 如果你定义的某个类你想比较两个对象的属性值相等 那么需要重写equals方法,重写分为以下几步: 如下图 |
hashCode() | int | Java中equals方法确实可以比较对象的值相等关系,但是equals再某些情况下有点繁琐 所有在Java当中某些情况下 判断两个对象的值相等的时候 可以使用hashCode来完成—Set集合、Map集合当中hashCode方法 返回的是一个int类型的值 值默认情况下返回的是对象在堆区的地址值 如果两个对象通过equals方法返回的是true 那么hashCode方法返回的值必须一致 所以如果我们要重写equals方法时必须重写hashCode方法 保证两者返回的效果是一致的 一般情况下 hashCode重写时,只需要把对象中属性值转为数字即可 【注意】如果两个对象通过equals方法返回true 那么他们的hashCode方法返回的值一定是一致的 如果两个对象的hashCode方法的值是一样的,他们的equals不一定为true |
代码示例:
package com.sxuek.object;
import java.util.Objects;
public class Student {
private String name;
private int age;
private String sex;
@Override
public int hashCode() {
return Objects.hash(age, name, sex);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
return age == other.age && Objects.equals(name, other.name) && Objects.equals(sex, other.sex);
}
// @Override
// public boolean equals(Object obj) {
// if(obj == null) {
// return false;
// }
//
// if(this == obj) {
// return true;
// }
//
// if(obj instanceof Student) {
// Student student = (Student)obj;
// if(this.name.equals(student.name) && this.age == student.age && this.sex.equals(student.sex)) {
// return true;
// }else {
// return false;
// }
// }else {
// return false;
// }
// }
//
// @Override
// public int hashCode() {
// return Objects.hash(name,age,sex);
// }
}
流程图:
-
矩形楠圆-开始或者结束
-
矩形-正常的流程
-
菱形-分支流程
-
平行四边形-输入和输出
3.2 Java中的String类、StringBuffer类、StringBuilder类
3.2.1 String类
String类是Java中的一个最终类,被final修饰的一个类,表示一个字符串序列的。
String创建的字符串是不能更改的,字符串的值一旦被创建出来,在内存中是唯一的,如果给字符串拼接或者是修改了值,也只是在内存中开辟了一块新的空间赋予新的数据,而原有的字符串不受任何的影响。
3.2.2 String字符串的创建方式
- 直接创建字符串
String s = "zs";
- 使用String类中的构造器进行创建—构造器创建的字符串是在堆区,然后再指向字符串常量池中。
String s = new String("zs");
String s = new String(char[]);
3.2.3 String字符串常用的一些方法
序号 | 方法名 | 返回值类型 | 说明 |
---|---|---|---|
1 | length() | int | 获取字符串的长度 |
2 | isEmpty() | boolean | 判断字符串是否为空字符串 注意判断引用数据类型是不是nu11值使用==判断 |
3 | toCharArray() | char[] | 将字符串转换为字符数组 |
4 | charAt(int index) | char | 获取字符串的某个索引位置的字符 |
5 | getBytes(String charsetName) | byte[] | 将字符串以指定的编码集转换为字节数组 |
6 | toUpperCase() | String | 将所有字符全部大写 |
7 | toLowerCase() | String | 将所有字符全部小写 |
8 | trim() | String | 去除字符串两端的空格 |
9 | split(String splitstring) | String[] | 以指定的分隔符将字符串切割得到一个字符数组 |
10 | substring(int,int) | String | 对字符串进行截取返回一个新的字符串 如果传递两个值,第一个代表起始索引, 第二个值代表终止索引, 左闭右开 |
11 | equals(Object s) | boolean | 判断两个字符串值相等 |
12 | equalsIgnoreCase (String s) | boolean | 判断两个字符串是否相等,略大小写 |
13 | startWith(String s) | boolean | 判断字符串是否是以指定的字符串作开头的 |
14 | intern() | String | 返回当前字符串在堆区字符串常量池中的值 字符串中有一个规则: 一旦字符串在进行拼接的时候, 拼接两端只要出现一个变量, 字符串拼接的结果指向的地址都是堆区的地址, 而非字符串常量池中的地址。 |
3.3.4 StringBuffer和StringBuilder
String类底层是一个不可变的字符序列,每一次对字符串的值进行操作修改都会给我们返回一个新的字符串对象,原有的字符串不受任何的影响的。为了避免堆区的浪费,Java提供了两个可变的字符序列。
StringBuffer和StringBuilder底层都维护了一个可变的字符数组,每一次对字符串的值进行更改,都会对原有的字符数组进行更改。
StringBuffer和StringBuilder只能通过构造器进行创建。
声明语法 | 说明 |
---|---|
new xxxx() | 底层创建一个长度为16的字符数组 |
new xxxx(int capacity) | 底层创建一个长度为capacity的字符数组 |
new xxx(String str) | 底层会创建一个str.length+16的字符数组 |
StringBuffer和StringBuilder添加数据需要通过append方法来追加字符串数据,而且两者的动态扩容也是在append方法中声明的
代码示例:
package com.sxuek.string;
public class Demo02 {
public static void main(String[] args) {
/**
* 创建一个长度为16的字符数组
*/
// StringBuffer sb = new StringBuffer();
/**
* StringBuffer正常底层扩容的时候,扩容原先长度的2倍+2
* 如果扩容之后还放不下字符串,那么扩容称为所需要的长度
* 如果所需要的长度<0 或者是所需要的长度大于了MAX_ARRAY_SIZE=Integer.MAX_VALUE-8,那么执行hugeCapacity方法确定数组的长度
* StringBuffer和StringBuilder最多可以存放Integer.MAX_VALUE个字符。
*/
// for (long i = 0; i<= Math.pow(2, 32);i++) {
// sb.append("a");
// }
// StringBuilder sb1 = new StringBuilder();
// sb1.append("a");
test();
}
static void test() {
test();
}
}
四、补充知识点
4.1 Eclipse如何打jar包,如何运行jar包
Java当中编写的Java代码,Java类、方法、接口这些东西就是项目中相关内容,到时候我们需要把代码提供给甲方、或者是我们需要运行我们编写的代码,我们总不能给甲方安装一个Eclipse开发环境,然后在开发环境中运行。我们一般是将编写好的Java代码
打包称为一个jar包(是Java中一种特殊的压缩包,压缩包中存放的是Java中所有class二进制字节码文件以及项目中一些静态资源),把jar包给了甲方或者我们直接运行jar包就ok了。
打包方式:项目名-→export→java-→jar file
运行方式:在命令行执行命令运行
命令 | 说明 |
---|---|
java -jar xxx.jar包的路径 | 需要我们在打jar包时指定main-class文件 |
java -cp xxx.jar包的路径 | 全限定类名 |
4.2 JavaDOC文档
在编写项目的时候,我们自己定义很多的java类、方法、接口等等,编写的代码在很多情况下可不是我们自己看的,我们需要给甲方、或者是后来者查看,但是如果直接给他们看源代码的话,有点复杂了,源代码里面的东西说白了,挺乱的。因此Java给我们提供了一种注释语法:文档注释/***/,可以通过文档注释生成项目中的API文档,这样的话用户就不要看源码中注释了,只需要看API文档,就可以掌握项目中所有代码的含义。
Java文档注释中可以加一些注解去详细描述Java类和方法:
注解 | 说明 |
---|---|
@author 作者 | 作者 |
@since 版本 | 从哪个版本开始有的 |
@see 全限定类名 | 这个类和see中的类是有关系的 |
@param 参数名 参数注释 | 方法中形参的含义和注释 |
@return 注释 | 方法的返回值的注释 |