最近开始看java的一些东西,感觉比python麻烦些,今天学习了面向对象的一些东西,觉得挺多挺复杂,这里做个知识总结

以一个简单的例子来说明java面向对象的三大特性,封装,继承,多态,有一个动物(Animal)基类,定义了run与eat方法,然后有一个猫(Cat)与狗(Dog)的子类继承了动物这个父类,子类重写(override)了父类的run与eat方法,同步又重载(overload)了run与eat方法,同时又定义了一个交配(Icopulation)的接口,让狗来implements交配接口,同时又创建一个Human类来专门implements交配接口

795ab47fjw1ejo4u6epeoj20ab083jrh

下面是具体的实现代码,没有什么实际的应用,只是作为学习用

Animal.java 这个是父类

1
2
3
4
5
6
7
8
9
10
package com.yangyanxing.www;
//这里是定义了一个Animal的基类
public class Animal {
public void run(){
System.out.println("我是所有动物的跑");
}
public void eat(){
System.out.println("我是所有动物在吃");
}
}

Icopulation.java 交配的接口

1
2
3
4
5
package com.yangyanxing.www;
//这里定义了一个接口类,动物应该都具有交配
public interface Icopulation {
public void copulation();//这里是一个规范,要有交配方法,具体怎么实现要子类去实现
}

 

Dog.java Dog的子类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.yangyanxing.www;
//这里定义了一个狗的类继承Animal基类
public class Dog extends Animal implements Icopulation {
//对父类的方法进行重写(override) 方法的返回值类型与参数都不能变
public void run(){
System.out.println("我是一条狗在跑");
}
//方法的重载(overload)只是参数的数量与类型不同,返回值与权限都要相同
//这里由于父类里的run方法没有重载,所以使用多态创建的子类引用也不能使用带参数的run(5)
public void run(int a){
System.out.printf("我是只狗,已经跑了%d公里了n",a);
}
public void eat(){
System.out.println("我是一条狗是吃");
}
//这里是狗自已的方法,不是从基类继承的
public void creame(){
System.out.println("这是一条狗在叫");
}
public void copulation(){
System.out.println("狗在交配");
}
}

 

Cat.java Cat子类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.yangyanxing.www;

public class Cat extends Animal {
public void run(){
System.out.println("我是一只猫在跑");
}
public void eat(){
System.out.println("我是一条猫是吃");
}
public void eat(String food){
System.out.printf("我是只猫,我正在吃%sn",food);
}
//这里是猫自已的方法,不是从基类继承的
public void creame(){
System.out.println("这是一条猫在叫");
}
}

 

Human.java 实现了交配的Human类

1
2
3
4
5
6
7
8
9
10
11
12
package com.yangyanxing.www;

public class Human implements Icopulation {

@Override
public void copulation() {
// TODO Auto-generated method stub
System.out.println("人在交配");

}

}

Testoob.java 具体的测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.yangyanxing.www;
//这里不用import 引用,在同一个包里
public class Testoob {

public static void main(String[] args) {
// TODO Auto-generated method stub
Animal a = new Animal();
Animal a1 = new Dog();//多态,使用父类创建子类的引用
Animal a2 = new Cat();
Dog dog = new Dog();
Cat cat = new Cat();
a.run();
a.eat();
a1.run();
a1.eat();
//a1.creame();//多态父类创建的子类不能使用子类自已的方法
a2.run();
a2.eat();
dog.creame();//不是通过多态创建的子类可以使用自已的方法
cat.creame();
cat.eat("鱼");
dog.run(5);
//a2.eat("fish");//这里会出错,因为父类里没有定义带参数的eat()方法

Icopulation idog = new Dog();
idog.copulation();

Icopulation ihuman = new Human();
ihuman.copulation();
}

}

以下是程序运行的输出结果

我是所有动物的跑

我是所有动物在吃

我是一条狗在跑

我是一条狗是吃

我是一只猫在跑

我是一条猫是吃

这是一条狗在叫

这是一条猫在叫

我是只猫,我正在吃鱼

我是只狗,已经跑了5公里了

狗在交配

人在交配