有时候看到java里的小知识点,当时看后明白,但是没有养成随手几下的习惯,结果就把知识点又给遗忘了,真是好记性不如烂笔头。索.性就把见到的小知识点慢慢积累起来吧,从现在开始!
1.理解抽象类与接口区别
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
刚开始对于第四条没理解意思,那么下面的程序就是对这句话最好的理解。(即抽象类可以实现接口,但是却不用实现接口的方法,可以留给实现类来做这个事)
abstract class abstractClass implements Interface{
public void function(){
System.out.println("test");
}
}
interface Interface{
public void method();
}
public class test extends abstractClass{
@Override
public void method() {
System.out.println("实现接口方法");
}
public static void main(String[] args) {
test t=new test();
t.method();
}
}
floor 返回不大于的最大整数
round 则是4舍5入的计算,入的时候是到大于它的整数
round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
ceil 返回不小于的最小整数
Math.floor | Math.round | Math.ceil | |
1.4 | 1 | 1 | 2 |
1.5 | 1 | 2 | 2 |
1.6 | 1 | 2 | 2 |
-1.4 | -2 | -1 | -1 |
-1.5 | -2 | -1 | -1 |
-1.6 | -2 | -2 | -1 |
round方法源码:
public static long round(double a) {
return (long)floor(a + 0.5d);
}
Math.Round(3.44, 1) = 3.4
Math.Round(3.45, 1) = 3.4
Math.Round(3.46, 1) = 3.5
-----------------------------------------------
Math.Round(3.54, 1) = 3.5
Math.Round(3.55, 1) = 3.6
Math.Round(3.56, 1) = 3.6
-----------------------------------------------
Math.Round(3.64, 1) = 3.6
Math.Round(3.65, 1) = 3.6
Math.Round(3.66, 1) = 3.7
-----------------------------------------------
Math.Round(3.74, 1) = 3.7
Math.Round(3.75, 1) = 3.8
Math.Round(3.76, 1) = 3.8
那么果断打算测试,一看原来是C#的方法。(实习一直用C#)
测试了下在C#中Round方法有好多重载,这个方法在C#中遵循的规律是:
四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一 Console.WriteLine(Math.Round(3.44,1));//3.4
Console.WriteLine(Math.Round(3.45, 1));//3.4
Console.WriteLine(Math.Round(3.46, 1));//3.5
Console.WriteLine(Math.Round(3.54, 1));//3.5
Console.WriteLine(Math.Round(3.55, 1));//3.6
Console.WriteLine(Math.Round(3.56, 1));//3.6
Console.WriteLine(Math.Round(3.64, 1));//3.6
Console.WriteLine(Math.Round(3.65, 1));//3.6
Console.WriteLine(Math.Round(3.66, 1));//3.7
Console.WriteLine(Math.Round(3.74, 1));//3.7
Console.WriteLine(Math.Round(3.75, 1));//3.8
Console.WriteLine(Math.Round(3.76, 1));//3.8
Console.WriteLine(Math.Round(0.25, 1));//0.2 五后皆零看奇偶,五前为偶应舍 去
Console.WriteLine(Math.Round(0.35, 1));//0.4 五后皆零看奇偶,五前为奇要进一
Console.WriteLine(Math.Round(0.251, 1));//0.3 五后非零就进一
3.system.arraycopy与Arrays.copyOf()
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
src表示原数组
srcPos 表示要从原数组哪个位置开始复制
dest 表示目标数组
destPos 表示要复制到目标数组的哪个位置
length 表示要复制的元素个数
这是Arrays.copyOf的源代码
//非基本类型
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
//基本数据类型
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
注意:在Arrays.copyOf这个方法里用到了system.arraycopy方法。这里返回的是一个新数组。
4.String中的toCharArray()方法。
//原来想用下面的代码得到这个字符数组,而且还想保留字符数组的容量,但是发现这样赋值后发现字符数组的容量变为了内容长度。
char[] c=new char[100];
String s="fefeff fff fff";
c=s.toCharArray();
查看下toCharArray()方法的源代码,发现方法中重新创建了一个字符数组,然后调用了一个getChars方法,此方法就是调用了上面的system.arraycopy方法将内容复制到字符数字组中,然后返回。