java三大特性简要描述

封装:

1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。

2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。

3.封装的基本要求是:把所有的属性私有化,对每个属性提供getter和setter方法,如果有一个带参的构造函数的话,那一定要写一个不带参的构造函数。在开发的时候经常要对已经编写的类进行测试,所以在有的时候还有重写toString方法,但这不是必须的。

继承:

1.目的:实现代码的复用。

2.介绍:当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类。继承后子类自动拥有了父类的属性和方法,但特别注意的是,父类的私有属性和构造方法并不能被继承。另外子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。有时候我们需要这样的需求:我们需要将某些事物尽可能地对这个世界隐藏,但是仍然允许子类的成员来访问它们。这个时候就需要使用到protected。

多态:

1.概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。

2. Java实现多态有三个必要条件:继承、重写、向上转型。

         继承:在多态中必须存在有继承关系的子类和父类。

         重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

扫描二维码关注公众号,回复: 974498 查看本文章

         向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

      只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

3.多态的实现方式:

(1)基于继承实现的多态

      基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。

(2)基于接口实现的多态

      继承是通过重写父类的同一方法的几个不同子类来体现的,那么就可就是通过实现接口并覆盖接口中同一方法的几不同的类体现的。

      在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。

      继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

4.多态性主要表现在如下两个方面:

(1)方法重载.通常指在同一个类中,相同的方法名对应着不同的方法实现,但是方法的参数不同.

(2)成员覆盖.通常指在不同类(父类和子类)中,允许有相同的变量名,但是数据类型不同;也允许有相同的方法名,但是对应的方法实现不同.

5.多态的好处:程序的可扩展性及可维护性增强。

抽象:

1.介绍:在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象。

  比如:我们要描述“水果”,它就是一个抽象,它有质量、体积等一些共性(水果有质量),但又缺乏特性(苹果、橘子都是水果,它们有自己的特性),我们拿不出唯一一种能代表水果的东西(因为苹果、橘子都不能代表水果),可用抽象类来描述它,所以抽象类是不能够实例化的。当我们用某个类来具体描述“苹果”时,这个类就可以继承描述“水果”的抽象类,我们都知道“苹果”是一种“水果”。

2.抽象方法:被abstract修饰的方法是抽象方法,抽象方法没有方法体。修饰符 abstract 返回值类型 函数名();抽象方法的修饰符只能用public或者protected或者没有修饰,不能被final,static,private修饰。
(1)、类即使不包含抽象方法,也可以定义成抽象类。
(2)、类中含有抽象方法的类一定要定义成抽象类。
(3)、抽象类中字段的定义和子类的访问与一般类没有变化。
(4)、扩展抽象类有两种方法,第一种是在子类中定义部分抽象方法或者抽象方法不定义,这样子类也必须定义成抽象类,第二种是定义全部的抽象方法,这样子类就可以不定义成抽象的了。
(5)、抽象类不能被实例化,但是可以定义一个抽象类的对象变量,这个变量可以引用非抽象子类的对象。
(6)、抽象类中包含有构造方法,也可以显式书写构造方法,构造方法在实例化子类的对象中调用。
接口与抽象类的区别:
不同点:
1、接口可以多实现,而抽象类只能单继承
2、抽象类可以有非抽象的方法和构造方法、变量,但是接口只能有抽象方法,静态常量。
3、抽象类和子类具有父子关系,子类能拥有父类中一些属性。接口虽然某个类实现一个接口,但是由于接口中的变量都为静态常量,不存在继承关系。
相同点:
1、无论接口还是抽象类,都无法直接实例化,其自身实例化需要靠实现类或子类来实现。
2、接口和抽象类都必须实现其中的所有方法。

面试题举例:

public class ParentClazz {

    public int num =10;

    public ParentClazz() {
        System.out.println("ParentClazz.num:"+num);
        num = 20;
    }
}
public class ChildrenClazz extends ParentClazz{

    public int num = 100;

    public ChildrenClazz() {
        System.out.println("ChildrenClazz.num:"+num);
        num = 200;
    }
}
public class ConstructorTest {

    @Test
    public void constructorTest(){
        ParentClazz parentClazz = new ChildrenClazz();
        System.out.println("test parentClazz.num:"+parentClazz.num);
        ChildrenClazz childrenClazz = new ChildrenClazz();
        System.out.println("test childrenClazz.num:"+childrenClazz.num);
    }

}

结果:

ParentClazz.num:10
ChildrenClazz.num:100
test parentClazz.num:20
ParentClazz.num:10
ChildrenClazz.num:100
test childrenClazz.num:200

猜你喜欢

转载自my.oschina.net/wugong/blog/1629722