重载(Overloading)
方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading是一个类中多态性的一种表现。
Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
public class Dog {
//构造函数
public Dog(){
this.bark();
}
//重载方法
void bark() {
System.out.println("no barking!");
this.bark("female", 3.4);
}
void bark(String n,double s) {
System.out.println();
}
void bark(double s,String n) {
System.out.println();
}
public static void main(String[] args) {
Dog dog = new Dog();
}
}
一、方法重写(0veriding)
在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
}
}
二、浅拷贝和深拷贝
在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用现有对象的部分或全部 数据。
浅拷贝实例
创建Student类
class Student {
private int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
编写测试代码
Student stu1 = new Student();
stu1.setNumber(12345);
Student stu2 = stu1;
System.out.println("学生1:" + stu1.getNumber());
System.out.println("学生2:" + stu2.getNumber());
stu1.setNumber(1234);
System.out.println("学生1:" + stu1.getNumber());
System.out.println("学生2:" + stu2.getNumber());
System.out.println("stu1和stu2是同一个对象么?" + (stu1 == stu2));
从上面结果可以看出
当执行stu1.setNumber(1234);后,stu2的number也更改为1234.
但这就存在问题了,因为我们需要的是对象内属性的复制,但是使用Student stu2 = stu1; 后,两者对象貌似关联到一起了.
原因是执行Student stu2 = stu1; 时,是将stu2的引用指向了stu1内存地址,两者的内存地址一致,因此当更改其中一个对象的属性值时,另一个也会跟着改变.
public interface Cloneable {
}
class Apple implements Cloneable{
//需要实现Cloneable
private int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
//重写clone()
@Override
public Object clone() {
Apple apple = null;
try {
apple = (Apple)super.clone();
return apple;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return apple;
}
}
测试
Apple apple1 = new Apple(); apple1.setNumber(12345); Apple apple2;
apple2 = (Apple)apple1.clone(); System.out.println(“苹果1:” +
apple1.getNumber()); System.out.println(“苹果2:” + apple2.getNumber());
apple1.setNumber(1234);System.out.println(“苹果1:” + apple1.getNumber());
System.out.println(“苹果2:” + apple2.getNumber());System.out.println(“apple1和apple2是同一个对象么?” + (apple1 == apple2)); //
false