------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
知识点一:继承
一、继承概念
继承是面向对象的特点之一,是一个非常重要的特征。在Java中,当多个不同命名的类具有相同属性或者相同的方法的时候,我们需要简化我们的代码,不能让相同的东西在不同的类中重复的出现,这样可能会增加阅读的复杂度。所以我们这个时候就可以用到继承这个概念。
首先,我们将相同的部分抽取出来,然后创建一个super类,就是用来被其他类继承的类。在这个super类里面我们把刚才很多类里面共有的东西都提取出来,写到这个super类中,其他的类只要通过继承的方式(使用extends关键字)就可以向原先一样有相同的功能,而且代码上会变得更加的清晰,易读。
具体的语法是:class Child extends Super{ class body } 。
继承的特点有以下几点:
1.提高了代码的复用性。
2.让类和类之间相互有了关联,有了具体的共性。
3.提高代码的可读性。
注意:和C++不同的是,Java是单继承,不是多继承,所有在一个类中只允许在extends后面跟一个类名。
比如:class Child extends Super , Super2{ class body } 。这个样子是错的,假如在IDE上开发会直接报出语法错误。
二、继承的应用场景和相关示例代码
1.当存在多个类都有共同属性的情况下。
2.当存在多个类都有相同的方法的情况下。
3.当某个类是抽象类的情况下。
上述几种情况均可以使用到继承。下面,我给大家简单的展示一下示例代码:
package cn.suzuki_tech;
public class Human {
/**
* 为了让子类继承之后能够使用到下面的成员变量,
* 必须使用protected修饰。这样保证了只有子类才能使用,其他的无关的类无法使用。
*/
protected String name;
protected int age;
protected String Sex;
//父类的构造器
public Human(String name , int age , String sex) {
this.name = name;
this.age = age;
this.Sex = sex;
}
public static void main(String[] args) {
Student st = new Student("suzuki", 17, "boy", 14237);
System.out.println(st.getName());//打印student对象的name属性
st.hello();
}
void hello(){
System.out.println("this is human's hello");
}
//相关的属性方法。
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return Sex;
}
public void setSex(String sex) {
Sex = sex;
}
}
/**
* 定义Student类,继承Human类
*/
class Student extends Human{
private int stuNum;//学生类自己的成员变量
public Student(String name, int age, String sex,int stuNum) {
super(name, age, sex);//完成父类的构造器
this.stuNum = stuNum;//子类的构造器
}
void hello(){
System.out.println("this is student's hello");
}
//student类自己的属性方法
public int getStuNum() {
return stuNum;
}
public void setStuNum(int stuNum) {
this.stuNum = stuNum;
}
}
运行的结果截图:(编辑工具Eclipse)
三、小结
1.上述代码中,需要注意到的一点是在Java继承在代码编写的时候,一定要让子类在自己的域看见父类的东西(成员变量,成员方法等)。因此,应该使用Protected修饰符。
2.其次,你可以在示例代码中看见如图情况:
父类代码;
子类代码;
因此,这就是继承带来的好处,当父类继承过来的东西满足不了子类的需求的时候,可以考虑采取这种override的方式然后覆盖掉父类继承过来的功能。
知识点二:多态
一、多态的概念
Java的引用变量有两种类型,一是编译类型,二是运行类型。编译类型有声明该变量时使用的类型决定,运行时类型,由实际赋予该变量的对象决定。如果编译时类型和运行时类型不一致,那么就会出现多态。
所谓的编译时类型和运行时类型,请看:Aclass aa = new Aclass();这时,编译时类型有等号左边的 aa,运行时类型就是赋给aa的值。就如大家经常听到的对象引用,指向实际对象实体;等号右边的new Aclass();就创建了一个对象的实体,它就是运行时类型。
二、多态的代码示例
package cn.suzuki_ted
class BaseClass
{
public int book = 111;
public void base()
{
System.out.println("父类方法");
}
public void test()
{
System.out.println("父类被用来覆盖的方法");
}
}
public class SubClass extends BaseClass
{
//重新定义一个book实例属性覆盖父类的book实例属性
public String book = "sdjflsdfsdj";
public void test()
{
System.out.println("子类的覆盖父类的方法");
}
public void sub()
{
System.out.println("子类的普通方法");
}
public static void main(String[] args)
{
//下面编译时类型和运行时类型完全一样,因此不存在多态
BaseClass bc = new BaseClass();
//输出 111
System.out.println(bc.book);
//下面两次调用将执行BaseClass的方法
bc.base();
bc.test();//输出父类被用来覆盖的方法
//下面编译时类型和运行时类型完全一样,因此不存在多态
SubClass sc = new SubClass();
System.out.println(sc.book);
//下面调用将执行从父类继承到的base方法
sc.base();
//下面调用将执行从当前类的test方法,sub方法
sc.test();
sc.sub();//输出子类普通方法
//下面编译时类型和运行时类型不一样,多态发生
BaseClass bbc = new SubClass();
System.out.println(bbc.book);
//下面调用将执行从父类继承到的base方法
bbc.base();
//下面调用将执行从当前类的test方法
bbc.test();//输出子类的普通方法
}
}
上述代码我们可以看见如下的几个特点:
1.当使用的编译类型和运行类型均为同一个类的时候,当前的对象只能访问本类的相关的方法,打印出来的东西和其他类无关。
2.当使用的编译类型是父类,运行类型是子类的时候,在存在没有override的情况下,该对象即可以访问父类继承过来的属性,有可以访问自己本身覆盖过的方法。
比如上述例子中:BaseClass bbc = new SubClass();这个就是父类的引用指向子类的对象。
这个bbc对象既可以访问没有被覆盖的成员变量即 public int book = 111; 同时也可以访问运行时类型本身的方法,比如test方法。
3.大家是否看见我在子类中还写了一个方法,叫做sub();方法,但是,你可以尝试一下在使用父类引用指向之类对象的情况下,即使用bbc这个引用去访问这个sub方法,你会发现,这样是会发生编译时报错的。这是因为,在编译类型中没有存在sub()这个方法,这个方法是属于运行时类的,所以在编译的时候报错。
三、小结一下多态
多态具有一下的优点:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
不过更多的用处还是得从开发中学习。本人初来乍到,文章算是我自学的一些小见解吧。