面向对象五

来源:互联网 发布:网页注入js 编辑:程序博客网 时间:2024/05/20 19:15

1、继承:is a
继承作用:
A、提高代码的复用性,简化代码;
B、让类与类之间产生了关系,有了这个关系,才有了多态的特征。
继承注意点:
A、千万不要为了获取其他类的功能,简化代码而继承;
B、必须是类与类之间有所属关系才可以继承,所属关系is a。
2、继承2
继承特点:
A、继承不支持多继承,只支持单继承;因为多个父类中定义相同方法时,继承者不知道用哪个父类方法。
B、可以用多实现代替多继承。
C、java支持多层继承。也就是继承体系。
想要使用多层继承体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。
通过了解共性功能,就可以知道该体系的基本功能。
那么这个体系就可以基本使用了。
那么在具体调用时,要创建最子类的对象,为要用最子类创建对象? 一是因为父类有可能不能创建对象;
二是因为创建子类对象可以使用更多的功能,包括共有的也包括特有的。
多层继承简单一句话:查阅父类功能,创建子类对象来使用功能。
3、聚集关系:has a
按照事物之间联系紧密程度。
聚合:事物之间联系程度低,比如足球队员之间的关系。
组合:事物时间联系程度高,比如身体上手和脚之间的关系。
4、子父类中变量的特点
类中成员:变量、一般函数、构造函数。
如果子类中出现非私有的同名成员变量时,
子类要访问本类中的变量,用this;this代表的是本类对象的引用。
子类要访问父类中的变量,用super;super代表的是父类对象引用。

class FuLei{ String name = "fulei";}class ZiLei{ String name = "ZiLei"; public void show(){  System.out.println(name); }}public class ExtendDemo01 { public static void main(String[] args){  ZiLei s = new ZiLei();  s.show();  //String n = s.name; }}



5、子父类中函数的特点
当子类出现和父类一摸一样的函数时,当子类对象调用该函数,会运行子类函数的内容,如同父类的函数被覆盖一样。这是函数的另一个特性:重写(覆盖)。覆盖是一摸一样。
子类覆盖父类函数注意点:
A、子类覆盖父类函数,必须保证子类权限大于等于父类权限,否则编译失败。且父类函数访问权限不能为private。
B、静态只能覆盖静态。
6、子父类中构造函数的特点
在对子类对象进行初始化时,父类的构造函数也会运行,因为子类的构造函数默认第一行有一条隐去的语句super();super()会访问父类中空参数的构造函数,而且子类中所有构造函数默认第一行都是super()。
为什么子类一定要访问父类中的构造函数?因为子类可以直接获取父类中的数据,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数(不是默认构造函数),可以通过手动定义super语句的方式来进行指定。
注意:super语句一定定义在子类构造函数的第一行。
结论:子类中所有的构造函数,默认都回访问父类中空参数的构造函数。
因为子类每一个构造函数内的第一行都有一句隐式super(),当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。
当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
子类中至少会有一个构造函数会访问父类中的构造函数。

class FuLei{ int num; FuLei(){  num = 60;  System.out.println(num); } FuLei(int x){  System.out.println(x); }}class ZiLei extends FuLei{ ZiLei(){  //super();默认调用父类默认构造函数  //super(20);可以手动调用父类非默认构造函数  System.out.println(); }}



7、final关键字
A、作为修饰符,可以修饰类、函数、变量。
B、被final修饰的类不允许被继承。
C、被final修饰的函数不允许被复写。
D、被final修饰的变量只能赋值一次,即可以修饰成员变量,又可以修饰局部变量。当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性都给这些值起个名字,方便于阅读。而这个值不需要改变,所以加上final关键字,作为常量:常量的书写规范所有字母都大写,如果由多个单词组成,单词间通过下划线连接。
E、内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。

//类使用final关键字final class Demo01{  }class Demo02{ //成员变量使用final关键字 public static final double MY_PI = 3.14;  //方法使用final关键字 final void show(){  System.out.println("hello") ; } }



8、抽象类
定义:当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取,这时只需要抽取功能定义,而不抽取功能主体。
抽象类特点:
第一、抽象方法一定在抽象类中;
第二、抽象类和抽象方法都必须被abstract关键字修饰;
第三、抽象类不可以用new创建对象,因为调用抽象方法没有意义 ;
第四、抽象类中的方法要被使用,必须由子类覆写所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
abstract class Student{
 abstract void study(); 
}
class BaseStudent extends Student{
 void Study(){
  System.out.println("study"); 
 }
}
9、抽象类2
抽象类和一般类没有太大的不同。
该怎么样描述事物就怎么样描述事物,只不过该事物出现的一些看不懂的东西需要明确出现,但是不需要定义主体。
抽象类比一般类多个抽象方法,而且抽象类不可以实例化对象。
抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
10、模版方法设计模式
模版方法设计模式定义:在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类去完成。

abstract class GetTime{ public final void Time(){  long startTime = System.currentTimeMillis();  runCode();  long endTime = System.currentTimeMillis();  System.out.println("Time:"+(endTime-startTime)); }  public abstract void runCode();}class RunCodeImplements extends GetTime{  public void runCode(){    for(int i=0;i<100;i++){     System.out.println(i);     }  }}public class FinalDemo01{ public static void main(String[] args){  GetTime t = new RunCodeImplements();  //GetTime t = new GetTime();  //RunCodeImplements t = new RunCodeImplements();  t.Time(); } }



11、接口
接口特点:
第一、接口中常见定义:常量,抽象方法。
第二、接口中的成员都有固定修饰符。
常量:public static final
方法:public abstract
第三、接口中的成员都是public的。
注意点:
第一:接口不可以创建对象,因为有抽象方法。
第二:需要被子类实现接口中所有的抽象方法,子类才可以实例化对象。否则子类也是一个抽象类。

总结:
继承和接口的区别、联系。
第一、啥叫继承、继承有啥作用?继承是一个体系,超类A 拥有最基本、最通用的特性,子类B继承超类时不仅拥有父类基本的特性、也有自己的属性。所以继承可以看成:继承了基本功能,所以是is a。
第二、啥叫接口、接口有啥作用?接口是用来扩展的,比如C 接口中拥有好多功能,功能1、功能2...,子类B需要功能1时,就把C中功能1拿来用。所以接口可以看成:功能的扩展,C中有个功能像功能1直接把功能拿来用,所以是like a。
class A{
//基本属性
}
interface C{
//功能1
///功能2
}
class B extends A implements C{
//基本属性
///功能1
}