java琐碎

来源:互联网 发布:泉州师范软件学院 编辑:程序博客网 时间:2024/06/16 10:24

      有时候看到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{@Overridepublic void method() {System.out.println("实现接口方法");}public static void main(String[] args) {test t=new test();t.method();}}


2.Math.round()方法

floor 返回不大于的最大整数 

round 则是4舍5入的计算,入的时候是到大于它的整数

round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

ceil 返回不小于的最小整数

 Math.floorMath.roundMath.ceil1.41121.51221.6122-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);    }


看round方法的原因是看一套java面试题的博客,里面竟然有这样的内容:

Math.Round(3.44, 1) = 3.4Math.Round(3.45, 1) = 3.4Math.Round(3.46, 1) = 3.5-----------------------------------------------Math.Round(3.54, 1) = 3.5Math.Round(3.55, 1) = 3.6Math.Round(3.56, 1) = 3.6-----------------------------------------------Math.Round(3.64, 1) = 3.6Math.Round(3.65, 1) = 3.6Math.Round(3.66, 1) = 3.7-----------------------------------------------Math.Round(3.74, 1) = 3.7Math.Round(3.75, 1) = 3.8Math.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方法将内容复制到字符数字组中,然后返回。


0 0
原创粉丝点击