黑马程序员-面向对象之继承

来源:互联网 发布:js选择排序 编辑:程序博客网 时间:2024/05/16 12:52
------- android培训、java培训、期待与您交流! ----------

继承:

class Person

{

       Stringname;

       Intage;

       voiddemo1(){}

}

class Student extends Person

{

      

}

Student类通过关键字extends继承Person类,Student就具有了父类Person的属性和方法

优点:

1.      提高代码的复用复用性;

2.      让类与类之间产生了关系,有了这个关系,才有了多态的特性;

注意:千万不要为了获取其他类的功能,简化代码而继承。必须是类与类之间有所属关系才可以继承。

Java语言只支持单继承,不支持多继承。以为多继承容易带来安全隐患:当多个父类中定义了相同功能,档功能内容不同时,不确定要运行哪一个。

例如:

class a

{

       Voidshow()

{

       System.out.println(“a”);

}

}

class b

{

       Voidshow()

       {

              System.out.println(“b”);

}

}

class c extends a,b

{

}

C c = new C();

c.show();//调用show()方法就不知道发音的是a,还是b.

 

java支持多层继承,也就是集成体系。a继承bb继承c

如何使用一个集成体系中的功能?

       想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中最共性的功能。

通过了解共性功能,就可以知道该体系的基本功能。

在具体调用是要创建最子类的对象,一是因为有可能父类不能创建对象;二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。

简单一句话:查阅父类功能,创建子类对象使用。

 

子父类中变量的特点:

       如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量用this,子类要访问父类中的同名变量用super

Super的使用和this几乎一致,this代表的是本类对象的引用,super代表的是父类对象的应用。

子父类中函数的特点:

当子类出现和父类一模一样的函数时,当子类对象调用该函数时,会运行子类函数的内容,这种情况是函数的另一种特性:重写(覆盖)。

注意:1.子类覆盖父类,必须保证子类权限大于父类权限,才能覆盖,否则编译失败

2静态只能覆盖静态

子父类中的构造函数:

在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super();

子类的所有的构造函数,都会访问父类的空参数的构造函数;

当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句的形式来指定要访问的构造函数。

子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数,子类中至少会有一个构造函数会访问父类中的构造函数。

super语句一定定义在第一行.

 

final关键字

1.      可以修饰类,函数,变量。

2.      被final修饰的类不可以被继承。

3.      被final修饰的方法不可以被复写。

4.      被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量。

5.      内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。

 

抽象类

特点:

1.      抽象方法一定定义在抽象类中;

2.      抽象方法和抽象类必须被abstract关键字修饰;

3.      抽象类不可以用new创建对象,因为调用抽象方法没意义;

4.      抽象类中的方法要被使用,必须有子类复写所有的抽象方法后,建立子类对象调用。

如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

abstract class Student{

       abstractvoid study();

}

class Student1 extends Student{

       voidstudy(){}

}

Class Student2 extends Student{

       Voidstudy(){}

}

 

模板方法模式:

       在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时将不确定的部分暴漏出去,有该类的子类完成。

abstract class GetTime{

       publicfinal void getTime()

       {

              longstart = System.currentTimeMillis();

              runcode();

              longend = System.currentTimeMillis();

              System.out.println(end-start);

}

public abstractvoid runcode();

}

class SubTime extends GetTime()

{

       publicvoid runcode()

       {

              for(intx =0;x<3000;x++)

                     System.out.println(x);

}

}

原创粉丝点击