抽象方法和抽象类
抽象方法:使用abstract修饰的方法,没有方法体,只有声明,定义的是一种"规范",就是告诉子类必须要给抽象方法提供具体的实现
抽象类:包含抽象方法的类就是抽象类,通过abstract方法定义规范,然后要求子类必须定义具体实现.通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用
抽象类使用要点:
-
抽象类中可以有(但是不一定有)抽象方法,但是抽象方法必须在抽象类中(有抽象方法的类只能定义为抽象类)
-
抽象类不能实例化,即不能用new来实例化抽象类
-
抽象类中可以有普通属性,静态属性,普通方法,静态方法,构造方法.但是构造方法不能用了new来实例,只能用来被子类调用
-
抽象类只能用来被继承(抽象类天生使用来被继承的)
-
抽象方法必须被子类实现
-
抽象类是用abstract修饰的类,它的特点如下:
-
抽象方法没有任何的实现,直接以;结束的方法,本身没有调用的意义,但是它天生使用来被重写的
注意:
-
final和abstract不能同时使用!!!
-
private和abstract不能同时使用!!!
-
如果一个类继承了抽象父类,那么这个子类必须强制重写父类中所有的抽象方法,除非子类也是抽象类
-
接口
接口就是比"抽象类"还抽象的"抽象类".可以更加规范的对子类进行约束,全面地专业的实现了:规范和具体实现的分离
抽象类还提供某些具体实现,接口不提供任何实现.接口中所有的方法都是抽象方法
接口就是规范,定义了一组规则(对对象的抽象)
声明格式:
[访问修饰符] interface 接口名 [extends 父接口1,父接口2...]{
常量定义;(静态常量)
方法定义;(抽象方法)
}
接口定义的详细说明:
- 访问修饰符:只能是public或默认
- 接口名:和类名采用相同命名机制(毕竟是个特殊类,也会编译产生.class文件)
- extends:接口可以多继承(public interface c extends a,b{.},其中ab为接口)
- 常量:接口中的属性只能是常量.并且总是:public static final修饰,不写也是
- 方法:接口中的方法只能是:public abstract.省略的话,也是public abstract
注意:
- 子类通过implements来实现接口中的规范
- 接口不能创建实例,但是可用于声明引用变量类型
- 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的
- jdk7之前,接口中只能包含静态常量,抽象方法.不能有普通属性,构造方法,普通方法
- jdk8以后,接口中包含普通的静态方法
- 接口完全支持多继承.和类的继承类似,子接口扩展某个父接口,将会获得父接口中所定义的一切
内部类
非静态内部类
非静态内部类对象依附于外部类对象,因此创建内部类对象要先创建外部类对象.Outer为外部类名,Inner为内部类名:
Outer.Inner inner = new Outer().new Inner(); //这也是非静态内部类对象能访问外部类对象属性的原因.
但是外部类不能直接访问非静态内部类的成员
在内部类中访问外部类成员时:如Outer.this.age; Outer.this.表示外部类对象.
静态内部类
匿名内部类
局部内部类(用的极少)
String基础
- String类又称为不可变字符序列
- String位于java.lang包中,java程序默认导入java.lang包下所有类
- java字符串就是Unicode字符序列,例如字符串"java"就是四个Unicode字符组成
- java没有内置的字符串类型,而是在标准java类库中提供了一个预定义的类String,
每个用双引号括起来的字符串都是String类的一个实例
常量池
字符串常量池:
String str1 = "xu";
String str2 = "xu";
String str3 = new String("xu");
System.out.println(str1 == str2); //true
System.out.println(str1 == str3); //false
创建字符串时,不用new来创建的"字符串常量"会加入到常量池,下一个同样的方法创建字符串时,将会自动引用之前创建好的字符串常量,因此str1 == str2
而str3是用new的方式创建,即新开辟一块内存空间
因此:字符串相等的判断
- equals方法用来检测两个字符串内容是否相等.相等返回true,反之false
- 要测试两个字符串除了大小写区别外是否相等,使用equalsIgnoreCase方法(忽略大小写)
- 判断字符串是否相等不要使用"=="
String类常用方法
- length() 注意是方法而不是属性,数组才是length属性
- charAt(int index) 提取下标为index的字符串中的字符
- equals()以及equalsIgnoreCase().比较字符串值是否相等
- indexOf(String str) 返回str在字符串中首次出现的下标,没有返回-1
- lastIndexOf(String str) 与indexOf()的区别在于从右往左查找
- replace("","") 将字符串中的第一个参数值替换为第二个参数值
- startsWith(String str)和endsWith(String str)分别检测字符串是否以str开头或者结尾
- substring(int beginIndex)字符串分割.传入index,返回str1中从下标为index开始到最后的字符串
- substring(int beginIndex, int endIndex) 同上,分割下标是两个参数之间的字符串.下标范围为 [beginIndex,endIndex)
- 和toUpperCase()和toLowerCase() 将字符串转换为大小写
- trim() 去除字符串左右两边的空白字符
数组拷贝和Arrays数组操作类
- System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length)
src为原数组,dest为新数组,srcPos为从src的哪个位置开始拷贝,destPos为dest数组要拷贝的位置,length为从src数组拷贝的长度 - Arrays.toString(数组名) 打印数组名显示的是地址.可以用此方法显示数组内容
- Arrays.sort(数组名) 用于将数组进行__原地排序__(小->大).也可以自己写个compareTo(),所在类要实现Comparable接口
- Arrays.binarySearch(数组名,要找的元素) 二分查找. 若找到返回对应的下标.找不到返回-1
用于将数组进行__原地排序__(小->大).也可以自己写个compareTo(),所在类要实现Comparable接口
4. Arrays.binarySearch(数组名,要找的元素) 二分查找. 若找到返回对应的下标.找不到返回-1