标签:pre ret 面向 调用 编程 类的设计 print private class
最近刚开始接触java编程,由于以前没有接触过面向对象的实际案例,自己只是大概了解其中的一些思想和方法。前段时间每天也都比较忙,因此在这几天练习了一下java关于面向对象的一些案例。
一个很经典的入门例子是关于动物类的设计,这里的代码其实很简单,首先需要考虑动物有哪些特征(成员变量):年龄,名称,颜色等,了解动物能做哪些事(方法):吃饭,行走等,然后再进一步细化(继承),定义一些子类,我这里定义了两个子类:cat和dog。两个动物子类都有自己特定的方法,话不多说,先把父类的代码贴上来:
1 class Animal{
2 private int age;
3 private String name;
4 public Animal() {}
5 public Animal(int age,String name) {
6 this.age=age;
7 this.name=name;
8 }
9 public void setname(String name) {
10 this.name=name;
11 }
12 public void setage(int age) {
13 this.age=age;
14 }
15 public int getage() {
16 return age;
17 }
18 public String getname() {
19 return name;
20 }
21 public void show()
22 {
23 System.out.println(this.name+"的年龄是"+this.age);
24 }
25 }
从上面的代码可以清楚的看到,animal类有两个基本的private变量,分别是age和name,我们进而定义了一个传入参数为空的构造方法:public Animal( ),后面又定义了一个传入参数为int和String的构造方法:public Animal(int ,String),这里其实可以看做是java构造方法的重载,那么什么是重载呢?他和我们所说的重写又有什么区别呢?我们下面就探讨一下。
关于代码重载,这实际上是我们在同一个类中命名了相同的方法,这里的方法包括构造方法,那既然两个方法的名称相同,那我们通过什么来区分两个方法呢?
这里我们观察上面的动物类,我们实际上采用了传入参数不同的方法来区别两个同名的构造方法,在Animal类中,构造方法一个没有参数,一个传入了两个参数,并能进行变量的初始化(age和name)。
在这里我就有一个疑问了,java是怎么去识别,或者说他是怎么知道这两个构造方法的区别的呢?
这里介绍两个概念:静态分派和动态分派。
静态分派:依赖静态类型来定位方法执行版本的分派动作称为静态分派
动态分派:运行期根据实际类型确定方法执行版本的分派过程。
而在重载过程中使用的都是静态分派,我们这两个构造方法传入参数的静态类型是不一样的,而java在编译的时候就能分辨出不同的静态类型,因此这里可以进行重载操作。这里要注意一件事,返回值的区别并不是重载的标志,参数类型才是。如果采用了相同的参数类型和传入个数,而仅仅是返回值不同,那程序编译的时候仍然会报错。
这里说完了重载,我们再看一下重写。重写实际上是在子类继承父类的过程中发生的,比如我们同时在子类和父类中定义的参数,返回值,名称相同的方法,那么在子类中实际调用该方法时,如果不加说明的话,那实际上调用的是子类的方法。如果需要调用的是父类的方法的话,需要采用supper关键字。
最后贴上该动物类的完整代码:
1 package OOP2; 2 class Animal{ 3 private int age; 4 private String name; 5 public Animal() {} 6 public Animal(int age,String name) { 7 this.age=age; 8 this.name=name; 9 } 10 public void setname(String name) { 11 this.name=name; 12 } 13 public void setage(int age) { 14 this.age=age; 15 } 16 public int getage() { 17 return age; 18 } 19 public String getname() { 20 return name; 21 } 22 public void show() 23 { 24 System.out.println(this.name+"的年龄是"+this.age); 25 } 26 } 27 class Dog extends Animal{ 28 public Dog(){ 29 30 } 31 public Dog(int age,String name) { 32 super(age,name); 33 } 34 public void lookdoor(){ 35 System.out.println("Dogs can loo door"); 36 } 37 } 38 class Cat extends Animal{ 39 public Cat() { 40 41 } 42 public Cat(int age,String name) { 43 super(age,name); 44 } 45 public void catchmouse() { 46 System.out.println("Cats can catch mouse"); 47 } 48 } 49 class AnimalDemo { 50 public static void main(String[] args) { 51 Dog dick=new Dog(); 52 dick.setage(5); 53 dick.setname("shagou"); 54 dick.show(); 55 dick.lookdoor(); 56 57 Cat mimi=new Cat(3,"congmingmao"); 58 mimi.show(); 59 mimi.catchmouse(); 60 System.out.println(mimi.getage()); 61 } 62 }
标签:pre ret 面向 调用 编程 类的设计 print private class
原文地址:https://www.cnblogs.com/upuphe/p/overload_java.html