1.抽象类和抽象方法
使用abstract修饰符修饰的方法被称为抽象方法
抽象方法不能有方法体,子类必须重写抽象类中所有的抽象方法
抽象类中不一定包含抽象方法,但包含抽象方法的类一定是抽象类
抽象类不能实例化
抽象类可以有构造方法,提供给子类调用
抽象类包含成员:属性、方法、构造方法、静态方法、final修饰的方法只能被子类调用,不允许被子类重写、抽象方法
使用条件:父类的名称比较抽象,创建对象无意义。
1. 接口的详解
(1)接口中可以包含内容
非抽象方法(必须用default修饰)、抽象方法(public abstract方法)、属性(默认为public static final修饰的常量)
接口中不能包含构造方法,因为接口不是类
(2)接口和类的关系
类去实现接口中的抽象方法,即实现关系,用implements
一个类存在继承关系,又存在实现关系,继承在前实现在后
如果父类与接口中有完全相同的方法,子类实现父类的方法
如果父类与接口中有同名方法,要求父类和接口中的方法,在子类实现中构成重载
2. 内部类详解
(1) 内部类特点
内部类可以访问外部类的所有属性和方法,内部类与外部类有相同的属性时,访问外部类的属性时需要加上:外部类名.this.属性名
静态内部类:a.不允许访问外部类的非static属性;b.如果内部类中的方法为静态方法,那么内部类也必须为静态的
方法内部类:内部类相当于方法的局部变量,使用范围只能在方法中
匿名内部类:a.可以实现一个接口,还活着继承一个父类;b.只能实现一个接口;c.适合创建那种只使用一次的类,不重复使用。常见于图形界面编程GUI中。
(2) 内部类分类
成员内部类:内部类名 变量名=外部类对象.new 内部类名()
静态内部类:外部类名.内部类名 变量名=new 外部类名.内部类名()
方法内部类:new 内部类名().内部类方法名()
匿名内部类
3. String类常用方法_API文档阅读
(1) String类在API中String在的定义
String位于java.lang包中,String是不可变字符序列
String类相当于char类型的数组,数组长度一旦创建不能更改,value数组还使用了final修饰,字符串可以共享。
(2) 请你列举出String类的常用方法
1)Char charAt(int index):返回字符串中第index个字符
2)Boolean equalsIgnoreCase(String other):如果字符串与other相等(忽略大小写),返回true
3)Int indexOf(String str),lastIndexOf(从索引位置反向搜索(从0到指定位置)最后一个指定字符的位置)查找指定字符串出现的位置,找到返回索引,找不到返回-1
4)Int length():返回字符串长度
5)String replace(char oldChar,char newChar):返回一个新串,通过newChar替换字符串中的所有oldChar
6)Boolean startsWith(String prefix):如果字符串以prefix开始,则返回true
7)Boolean endsWith(String prefix):如果字符串以prefix结尾,则返回true
8)String substring(int beginIndex),String substring(int beginIndex,int endIndex)返回一个新字符串,该插串包含从原始字符串beginIndex到串尾或endIndex-1的所有字符
9)StringtoLowerCase()返回一个新的字符串,该字符串将原始字符串中的所有大写字母改成小写
10)StringtoUpperCase()返回一个新的字符串,该字符串将原始字符串中的所有小写字母改成大写
11)String trim()放回一个新字符串,该串删除了原始字符串头部和尾部的空格
5.String类和常量池
(1) String类的常用构造方法
1. public String() 空构造
String s1=new String();
System.out.println(s1);
2. public String(byte[] bytes) 把字节数组转成字符串
byte[] arr1={97,98,99,100};
String s2=new String(arr1);
System.out.println(s2);
3. public String(byte[] bytes,int index,int length) 把字节数组的一部分转成字符串
byte[] arr2={97,98,99,100,101,102}; //将arr2字节数组从2索引开始转换3个
String s3=new String(arr2,2,4);
System.out.println(s3);
4. public String(char[] value) 把字符数组转成字符串
char[] arr3={'a','b','c','d','e'}; //将字符数组转换成字符串
String s4=new String(arr3);
System.out.println(s4);
5. public String(char[] value,int index,int count) 把字符数组的一部分转成字符串
String s5=new String(arr3,1,3);
System.out.println(s5);
6. public String(String original) 把字符串常量值转成字符串
String s6=new String("KobeBryant");
System.out.println(s6);
(2) 常量池
用于存储在编译期确定,并被保存在一边以德字节码文件中的一些数据,包括final修饰变量即字符串变量和符号引用变量。
在堆中开空间的情况,等号右侧:
(1)有变量参与运算
(2)使用了new关键字
6.字符串相等的判断
(1)比较字符串地址
比较字符串地址是否相等使用”==”
(2)比较两个字符串的内容
比较两个字符串的内容是否相等使用:equals(Object obj)
String类重写了Object的equals方法
如果两字符串的类型相同,实际上是比较对应位置上的字符知否相等,如果所有的对象位置上的字符均相等返回true,否则返回false;如果类型不同直接返回false
7.多维数组
(1)二维数组的初始化方式
静态初始化:int[][] intA={{1,2,3},{2,3},{4,5,6}};
动态初始化:int[][] B=new int[3][];
B[0]=new int[] {1,2,3,4};
B[1]=new int[2];
B[2]=new int[3];
默认初始化:int[][] C=new int[3][4];
(2)二维数组的遍历方式
Int[][] a={{1,2,3},{4,5,6,},{7,8,9,10}}
普通for循环:for(int i=0;i<a.length;i++){
For(int j==0;j<a[i].length;j++){
}}
加强for循环:for(int[] arr:a){
For(int i:arr){
}}
普通和加强for循环:for(int[] arr:a){
For(int i=0;i<arr.length;i++){
}}
8.Object数组存储表格数据
(1)数组可以存储的类型数据
基本数据类型和引用数据类型
(2)对象数组存储数据的内存结构图
9.数组的拷贝
(1)两种数组的拷贝类型
地址拷贝:int[] array={11,22,33};
Int[] arrayB=new int[5];
arrayB=array;
值拷贝:int[] array={11,22,33};
Int[] arrayB=new int[5];
arrayB[0]=array[0];
(2)System类中数组拷贝及参数含义
System.Arrays(Object src,int srcPos,Object dest,int destPos,int length)
Object src:源数组;int srcPos:数组起始位置;Object dest:目标数组;int destPos:目标数组起始位置;int length:要复制的数组的长度
10.java.util.Arrays工具类的使用
(1)Arrays工具类在API中的说明
该类包含用于操作数组的各种方法,还包含一个静态工厂,可以将数组视为列表。如果指定数组引用为空,则该类中的方法都会抛出一个NullPointerException,除非另有说明。
(2)Arrays类中的常用方法
int[] a= {1,7,2,4,3,5,8,6,9};
int[] b= {1,7,2,4,3,5,8,6,9};
ToString()打印数组:System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
Equals()比较两个数组是否相同ystem.out.println(Arrays.equals(a, b));
System.out.println(a.equals( b));直接调用的是object中的equals方法,用于比较两个对象的内存地址(引用)是否相等
copyOf()复制指定数组
c=Arrays.copyOf(a, 5);目标数组长度不够,进行了重新创建c数组,更改了c的引用。会造成内存空间的浪费。
fill()填充:Arrays.fill(c,99);
sort()数组排序(排序的对象具备比较大小的能力):Arrays.sort(a);
对象数组排序需要编写比较的规则
11.冒泡排序的基础算法
(1)冒泡排序的原理
如果一个数列有N(5)个数,则至少需要N-1(4)轮循环才能保证数列有序
每一轮循环都从数列的第一个元素开始比较,依次比较相邻的两个元素,不叫道数列最后
如果前一个元素大于后一个元素,则使用第三变量交换
(2)冒泡排序的外循环条件和内循环条件
外循环控制比较的轮数
内循环控制相邻两数的比较