值传递,java语言中,方法的调用只支持参数的值传递,参数的值就是对该对象的引用,可以在方法调用过程改变对象的属性。
public class Test5 { public static void main(String[] args) { Student s=new Student(); Student change = change(s); System.out.println(change.getName()); } public static Student change(Student s){ s.setName("ggg"); return s; } } 方法的重载和重写都是实现多态的方式,区别在于,前者实现的是编译时的多态,后者实现的是运行时的多态。重载发生在同一个类中,同名方法具有不同的参数列表(参数类型、个数、顺序)则视为重载;重写发生在父类和子类之间,除了访问权限必须大于或者等于父类被重写方法,以及方法体之外,其它都必须和被重写方法一致。重载对于返回类型没有特殊要求。
方法重载的规则:
方法名一致,参数列表(类型、个数和顺序)不同重载和方法的返回类型无关,发生在同一个类中可以抛出不同的异常,可以有不同的修饰符 public class Person { public int add(int a,int b) throws IOException { return a+b; } private double add(double a,double b) throws NumberFormatException{ return a+b; } } 方法重写的规则:
参数列表、返回值类型必须和被重写方法一致
构造方法不能被重写,被final修饰的方法不能被重写,被static修饰的方法不能被重写
访问权限不能比被重写的方法的访问权限更低
重写方法可以抛出任何非强制性异常(运行时异常),但是不能抛出新的强制性异常(非运行时异常)
public class Student extends Person { @Override //public int add(int a, int b) throws IOException,NullPointerException, SQLException { public int add(int a, int b) throws IOException,NullPointerException{ return super.add(a, b); } }我们知道,重载实现的是编译时的多态,也就是说,在编译期就可以知道会调用哪个方法了。如果现在我们有两个所谓的返回类型不同的“重载方法”如下:
float add(int a,int b); int add(int a,int b);我们现在通过add(1,2)调用方法,编译器如何区分出要调用的是哪一个方法?
所以说,无法通过返回类型区分重载。
可以。因为java默认使用Unicode编码,每一个Unicode码是16位,也就是两个字节,我们的char类型也是两个字节,所以可以存储。
不同:
抽象类要被子类继承,而接口要被类实现接口中只能做方法声明(但是jdk8以后允许做方法实现,使用default修饰,并且还允许有静态方法),而抽象类既可以做方法声明,也可以做方法实现接口中只能定义公共的静态常量(public、static和final可以省略),抽象类中既可以定义常量,也可以定义变量接口中的成员都是public的,抽象类则不限一个类只能继承一个抽象类,但可以实现多个接口抽象类允许定义构造方法,而接口不允许相同:
抽象类和接口都不允许实例化一个类如果实现接口或者继承抽象类需要实现所有的抽象方法。