1.重载的实质探讨。
class Adder
{
int add(int a1 ,int b1)
{ return a1+b1; }
double add (int a2,int b2)
{ return a2+b2; }
int add(int a3,int b3,int c3)
{ return a3+b3+c3; }
double add(double[] a)
{ double s;
s=0.0;
for(int i=1;i<a.length;i++)
s=s+a[i];
return s;
}
}
publicclass test {
publicstaticvoid main(String[] args)
{
int s1,s2;
double s3,s4;
double[] b={1,2,3,4,5,6,7,8,9};
Adder s=new Adder();
s1=s.add(3,4);
s3=s.add(3,4);
s2=s.add(1,2,3);
s4=s.add(b);
System.out.println("he="+s1);
System.out.println("he="+s3);
System.out.println("he="+s2);
System.out.println("he="+s4);
}
}重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,JVM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int),这样的函数的参数颠倒了无意义);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断,因为java的编译器是通过函数的参数的类型和个数即这个函数的范式来确定的。例如int add(int a1 ,int b1),则编译器辨别的范式为add(int,int)
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
3.重写的实质探讨。
class T {
privateintdata;
private String str;// 默认的初始化为Null.
T() {
}
T(int da, String s) {
data = da;
str = s;
}
// override重写,对object类中的某些方法进行重写。
publicboolean equals(Object s) {
T m;
if (s instanceof T) {
m = (T) s;
if (this.data == m.data)
if (this.str.equals(m.str))
returntrue;
} else
returnfalse;
returnfalse;
}
public String toString() {
returndata + str;
}
publicint hashCode() { // return
//如果str为进行初始化,则其默认初始化的数值为NULL,
//则null 对应的哈希码不存在。
if(str==null)
returnsuper.hashCode()+data;
else
return str.hashCode()+data;
}
}
publicclass test1 {
publicstaticvoid main(String[] args) {
System.out.println("重写的方法");
T t = new T();
System.out.println(t.hashCode());
System.out.println(t.toString());
System.out.println("比较重写的效果");
T t2=new T(1,"ni");
T t1=new T(1,"ni");
T t3=new T(2,"ni");
System.out.println(t1.equals(t2));
System.out.println(t1.equals(t3));
}
}
包装类的使用:
//import java.*;
import java.util.*;
publicclass test3 {
publicstaticvoid main(String[] args) {
int a;
String s;
boolean b;
// (1)编写程序从命令行获取两个数据,分别为整型型和布尔型字符串,将其转换为对应的基本类型。对于整型数据,要求转换为二进制、八进制、十六进制并输出。
Scanner reader = new Scanner(System.in);
System.out.println("请输入整型");
a = reader.nextInt();
System.out.println("请输入布尔型字符串)");
s = reader.next();
// if() s.matches(regex)
System.out.println(Boolean.parseBoolean(s));
System.out.println(s);
System.out.println("二进制:" + Integer.toBinaryString(a));
System.out.println("八进制:" + Integer.toOctalString(a));
System.out.println("十六进制:" + Integer.toHexString(a));
}
}