zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java学习之路 之 使用技巧篇

JAVA学习 技巧 使用
2023-09-14 09:04:25 时间

一:分隔符

没有统一的对字符进行分割的符号,如果向定义多个分隔符,可使用符号“|”,例如,“,|=”表示分隔符分别为“,”和 “=”。

二: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>();