• 再探java基础——对面向对象的理解(2)


    对象、类和抽象类的区别

    对象是一个具体的事物,类是对具有相同属性和行为的一组对象的抽象,对象是类的一个一个人的具体实例;抽象类是一种特殊的类,是对类的进一步抽象,抽象类不能被实例化。

    类、抽象类和接口的异同

    部分内容借鉴以下博文:http://www.cnblogs.com/qiuxiaoju/p/3174068.html

    在面试可能经常被问到,接口有什么作用?相对于类而言,为何需要用类实现接口,接口和抽象类的区别等等诸如此类的问题。如果不仔细思考和总结一下这知识,还真不知道怎么回答。

    Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了。

    相同点:

    1.都是抽象类型抽象类接口都是对类进行抽象;

    2.其中的抽象方法都必须被具体类实现

    3.都不可以被实例化,如果要非要通过new创建他们的实例,都需要通过匿名内部类的方式

    4.都可以定义公共的(public)static属性和方法;如:

    public int id = 5;

    public final String name = "interface";

    public static int age = 22;

    public static final int weight = 55;

    int i = 0;

    不同点:

    定义的角度:

    1.定义抽象类用abstract class,定义接口用interface

    继承的角度:

    2.一个具体的实现类只能继承一个父类,但可以实现多个接口;

    属性和方法的角度:

    3.抽象类可以定义privateprotected属性和方法,而接口只能定义publicdefault(即默认的没有设定访问权限)的属性和方法;

    4.Java抽象类可以提供某些方法的部分实现,而Java接口不可以

    5.抽象类可以有抽象方法和非抽象方法,子类可以有选择的实现抽象类中的非抽象方法,而实现类必须实现接口中的所有方法

    构造方法

    6.接口不可以有构造方法,抽象类可以有构造方法

    设计理念不同

    7.其实子类和抽象类的的关系表示的是”is-a”关系(塑料碗和瓷碗都是碗),是一种律属关系,子类属于父类,因此一个类只能继承继承一个类;子类和接口的关系表示的是“has-a”关系(智能手机继承自手机,同时实现了闹钟、MP3等各种功能),实现类拥有这个接口的特征也可以拥有另外一个借口的特征,因此一个类可以实现多个接口。

    概况地说,接口是模块之间的协议,一些模块用于实现某些协议的具体动作,另外一些模块只针对接口编程,这样实现低耦合。
    抽象类主要是用于继承设计的,主要用于模板设计!

     

    经典的设计模式:缺省/默认适配模式(Default Adapter)

    声明类型的工作仍然由Java接口承担,但是同时给出一个Java抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类。哈,这下两个的最大优点都能发挥到极至了。这个模式就是缺省适配模式

    Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。

    继承

    1、方法(函数)重写(overwrite)要注意的机几点:
    1),重写方法(函数)必须和被重写方法具有相同的方法名称、参数列表和返回类型;
    2),重写的时候要从父类的函数声明中拷贝函数的声明(即函数名设参数的类型和个数)。
    3),重写方法不能使用比被重写方法跟严格的访问权限。(为避免名称出错,重写时必须从基类中copy函数的声明)
    2super关键字指向当前类的父类。

    3、构造方法:

    a,子类的构造的过程必须调用其基类的构造方法;

    b,子类可以在自己的构造方法中使用superargument_list参数列表)调用基类的构造方法;即使用this(argument_list_)调用本类的另外的构造方法,如果调用super,必须写在子类构造方法的第一行。

     c,如果子类的构造方法中没有显示地调用基类的构造方法,则系统默认调用基类无参数的构造方法; 

    d,如果子类的构造方法中没有显示地调用基类的构造方法,而基类中又没有无参数的构造方法,则编译出错。4Object类是java所有类的根基类,如果在类的声明中未使用extends指明其基类,则默认为object类。
    5对象转型:

    a,一个基类的引用类型对象可以指向其子类的对象;

    b,一个基类的引用的不可以访问子类对象新增加的成员(属性和方法);

    c,可以使用引用变量instanceof类名来判断该引用变量所指向的对象该类或该类的子类;

    d,子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。
    6动态绑定是指在执行期间(而非在编译期间)判定所引用对象的实际类型,根据实际的类型调用相应的方法。
     要符合的条件:a,要有继承;b,要有重写;c,父类引用指向子类对象。
    7抽象类;
     a,用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,这个方法叫做抽象方法;
     b,含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写;
     c,抽象类不能被实例化;
     d,抽象方法只需声明,而不需实现。
    8final关键字(类似于C++中的const)
     afinal的变量的值不能被改变;1),final的成员变量; 2final的局部变量;
     bfinal的方法不能被重写;
     cfinal的类不能被继承。

     

    继承和组合的关系

    上次阿里面试的时候问到继承和组合的关,什么时候要用组合,什么时候要用继承。真后悔当初没有准备,不然就可以很容易地回答,现在想起来,当时回答的真是烂的不能再烂

    继承和组合的关系主要是要从理念上进行区分,继承是一种从属关系,是子由你来的一种关系;而组合是一种包含关系,是整体与部分的关系。

    假设有两个类AB,当AB和关系是B is A,用继承:B extends A;当AB和关系是B has A时,用组合,即B中含有A的实例化对象。

  • 相关阅读:
    Hdu-5983 2016ACM/ICPC亚洲区青岛站 B.Pocket Cube 模拟
    Codeforces Round #300 F
    cf298F:状压dp+剪枝
    POJ3294--Life Forms 后缀数组+二分答案 大于k个字符串的最长公共子串
    jzp线性筛及其简单应用
    Codeforces Round #299 (Div. 1)C. Tavas and Pashmaks (凸壳)
    Codeforces Round #236 (Div. 2)E. Strictly Positive Matrix(402E)
    【2012天津区域赛】部分题解 hdu4431—4441
    HDU4436---str2int 后缀树组(12年天津区域赛)
    Codeforces
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3348126.html
Copyright © 2020-2023  润新知