文章目录
一:分隔符
没有统一的对字符进行分割的符号,如果向定义多个分隔符,可使用符号“|”,例如,“,|=”表示分隔符分别为“,”和 “=”。
二:super 关键字
1、在子类中调用父类构造方法
2、在子类中调用父类成员方法(除了private修饰的都可以)
三:重写父类的方法可以实现
1、修改方法体内容
2、更改成员方法的存储权限
3、修改成员方法的返回值类型
四:继承后的垃圾清理
如果使用 finalize()方法对对象进行清理,需要确保子类 finalize()方法的最后一个动作是调用父类的 finalize()方法,以保证当垃圾回收对象占用内存时,对象的所有部分都能被正常终止。
五:接口进行向上转型操作的方式
用一段源代码来表示:
package chapter10;
interface drawTest{ //定义接口
public void draw(); //定义方法
}
//定义平行四边形类,该类继承了四边形类,并实现了 drawTest 接口
class ParallelogramgleUselnterface extends QuadrangleUselnterface implements drawTest{
public void draw() { //由于该类实现了接口,所以需要覆盖draw()方法
System.out.println("平行四边形.draw()");
}
}
//定义正方形类,该类继承了四边形类,并实现了 drawTest 接口
class SquareUselnterface extends QuadrangleUselnterface implements drawTest{
public void draw() {
System.out.println("正方形.draw()");
}
void doAnyThing() {
}
}
class AnyThingUselnterface extends QuadrangleUselnterface{
void doAnyThing() {
}
}
public class QuadrangleUselnterface{ //定义四边形类
public void doAnyTthing() {
}
public static void main(String[] args) {
/* 精彩的部分开始 */
//接口也可以进行 向上转型 操作
drawTest[] d = {new SquareUselnterface(),new ParallelogramgleUselnterface()};
//相当于
//drawTest d2 = new SquareUselnterface();
//drawTest d3 = new ParallelogramgleUselnterface();
/* 精彩的部分结束 */
for(int i=0;i<d.length;i++) {
d[i].draw(); //调用 draw()方法
}
}
}
我说一下我为什么能理解并想出跟下面两行代码是等价的:
还记得接口的概念吗,接口可以实现多重继承,那么其实实现了接口的类,那么这个类就是子类,而对接口而言他是这个类的父类
也就是说,接口就是里面这两个类的父类,所以它可以直接进行向上转型。
这里利用了多态特性和向上转型的原理,不会的一定要去好好搜一下资料理解一下,其实这里你理解了后会很有成就感真的,哇我现在就好爽!
所以说,你只要能理解下面两行代码可以向上转型给接口,就能理解上面那一行代码了。
六:使用 this 关键字获取内部类与外部类的引用
在类中,如果遇到内部类与外部类成员变量重名的情况,可以使用 this 关键字进行处理。
源代码:
public class TheSameName {
private int x;
private class Inner{
private int x = 9;
public void doit(int x) {
x++; //调用的是形参 x
this.x++; //调用内部类的变量x
TheSameName.this.x++; //调用外部类的变量x
}
}
}
七:创建自定义异常的步骤:
1、创建自定义异常
2、在方法中通过throw 关键字抛出异常对象
3、如果在当前抛出异常的方法中处理异常,可以使用 try-catch 语句块捕获并处理,否则在方法的声明处通过 throws 关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
4、在出现异常方法的调用者中捕获处理异常
源代码举例:
class MyException extends Exception{
public MyException(String s) { //构造方法
super(s); //父类构造方法
}
}
public class Tran { //创建类
static int avg(int number1,int number2) throws MyException{ //定义方法,抛出异常
if(number1<0 || number2<0) { //判断方法中参数是否满足指定条件
throw new MyException("不可以使用负数"); //错误信息
}
if(number1>100 || number2>100) { //判断方法中参数是否满足指定条件
throw new MyException("数值太大了"); //错误信息
}
return (number1 + number2) / 2; //将参数的平均值返回
}
public static void main(String[] args) {
try {
int result = avg(102,150);
System.out.println(result);
}catch(MyException e) {
System.out.println(e);
}
}
}
八:随机获取集合中的某个元素
int i = (int)(Math.random()*list.size()); //获得0~2之间对的随机数
此时i 代表了一个随机索引,然后利用list.get(i)就可以获取随机元素了
九:反射机制实现创建私有构造方法对象
Constructor 类中有两个方法
newInstance(Object…initargs):通过该构造方法利用指定参数创建一个该类的对象,如果未设置参数则表示采用默认无参数的构造方法
setAccessible(boolean flag):如果该构造方法的权限为 private,默认不允许通过反射利用 newInstance(Object…initargs)方法创建对象。如果先执行该方法,并将入口参数设为 true,则允许创建。
结合以上两个方法即可实现,例子如下:
try {
//通过执行默认没有参数的构造方法创建对象
if(i==2)
example = (Example_01) constructor.newInstance();
else if(i == 1)
//通过执行具有两个参数的构造方法创建对象
example = (Example_01) constructor.newInstance("7",5);
else {
//通过执行具有可变数量参数的构造方法创建对象
Object[] parameters = new Object[] {new String[] {"100","200","300"}};
example = (Example_01) constructor.newInstance(parameters);
}
}catch(Exception e) {
System.out.println("在创建对象时抛出异常,下面执行 setAccessible()方法");
constructor.setAccessible(true); //设置允许访问
}
十丶泛型类型限制
泛型类型限制除了可以向下限制之外,还可以进行向上限制,只要在定义时使用 super 关键字即可。
举例:
Test<? super List> b = null;
这样定义后,对象a只接受List接口或上层父类类型。
如: b = new Test<Object>();