java面向对象下第一部分学习日志

    java中的继承,使用"extends'关键字。java只支持单继承,不支持对继承,也就是说只有一个父类。(c++中是允许的)

    不过java支持多层继承。 父类中除了构造方法之外,其他都会被子类继承。子类只能在自己的构造函数中 通过 "super()"来调用父类的构造函数。 java的每个类默认情况下都会有一个空的构造函数,但如果你在类中自己定义了一个构造函数,那么编译器就不再自动生成默认构造函数。除非在这个类中自己再创建一个空的构造函数,否则这个类的子类就必须定义一个构造函数,在里面通过super调用父类的构造函数才行。否则会出错,因为子类默认的构造函数会调用父类默认的构造函数,但这个时候父类的函数已经不存在了。

    java类的成员变量定义时可以赋初值,执行过程在构造函数执行其内的代码之前。

    相对于super(),还存在this(),它可以让我们在一个类的构造函数中调用同类的另一个构造函数,这提高了构造函数代码的重用性。在构造函数中,super()和this()必须出现在第一条语句的位置,并且两者只能出现一个。每个构造函数一定会调用自己的父类构造函数(如果有父类的话).this()和super()都会调用父类构造函数,重复了,所以只能出现一个。出现在第一句是因为,父类不许现构造,才能构造子类,顺序不能变。

    讲到继承,就得讲到类中访问权限的控制,相应的关键字有“private,protected,public”.类中成员不同的访问权限,决定了子类在继承后的不同表现。具体到后面,会有一个很容易记忆的表格来帮助我们。使用extends来继承父类的时候,没有像c++那样有“public,private,protected”三种继承方式。即父类成员本身是什么访问权限,子类继承后不会去改变它,相当于说java只有public这一种继承方式。在继承的时候,有一些值得注意的地方。如子类要对父类的方法进行重载时,子类方法的访问权限不能比父类的要弱。因为面向对象具有多态的特性,父类的对象变量可以接收子类的对象,然后访问他们共有的函数。如果父类中的一个public函数被子类覆盖为private,那父类对象就不能访问了,就出错了。

   java中的final关键字:

   在类的定义前,加上final,变成final类,不能被继承.

   在变量前加final,就变成了一个常量,定义时赋初值。

   方法前加final,这个方法就不能被覆盖,只能继承.

   通常类中的常量都是 static + final类型的,因为常量是不可被改变的.更具体的对象无关.将其定义为static,就可以直接通过类名来访问.

例如,Float中的常量,通过Float.来调用,里面的常量都是这样定义的.

   j ava中的抽象类和抽象方法:

   定义方法,在类和函数的定义前面,加上"abstract"关键字就可以了.

   abstract int aa(); 抽象方法是不需要定义的.

   带有抽象方法的类一定是一个抽象类,必须加上abstract来声明(c++中不需要).由于一个抽象类至少带有一个抽象方法,说明这个类的定义是不完全的,所以不能实例化.由此看来,一个抽象类通常用于当父类,用于继承. 而它的子类,必须要将抽象类的所有抽象方法都覆盖并正常定义,才能实例化对象,否则它也是抽象的.

   java中的接口 (Interface):  c++中没有类似的概念.

   接口是在抽象类和方法的基础上发展出来的. 在一个接口中只能出现抽象方法和常量. 看下面这段代码

   Interface A

  {

    int a() {}

    int  b=1;

 }

   在接口内定义的方法默认是 abstract,  而所有的变量 都是 static final类型的,并且他们都是 public的.

   我们可以把接口当一个特殊的抽象类,它必须被继承才能起作用.而接口的继承的过程,我门称它为实现, 用的关键字是 implements.

   虽然java不支持多继承, 但它允许在继承一个对象的同时,可以去实现一个或多个接口.

   如:  ClassA extends ClassB implements Interface1,Interface2

   接口被实现的同时,里面的常量被字类继承使用.

   子类与父类的关系中,有些地方值的注意. 如: 一个子类对象可转换成一个父类对象,反之则不可以.原因很简单, 子类继承了父类的一切,可以转换成父类. 但一个父类对象,并不拥有子类的东西,自然不可以转换. 不过我门可以这样做:

   SubClass sub = (sub)super; 如果我门将一个父类对象强制转换成一个子类的话,那编译的时候就可以通过了.想当于你告诉编译器,我知道这样做不应该,但我会负责的. 既然,父类对象转换成子类对象是不允许的,为了避免这种情况的发生. 我门首先得知道一个对象的类型才行.

   我门可以使用 instanceof 来判断对象的类型.例如很多函数的参数一个父类对象,调用时可以接收任意的子类对象.这个时候要判断此时到底传入的是哪个类的对象,以便执行特定的操作, instanceof判断这时候就很有用了.

   其实接口的概念,在现实生活中也很常见.列如,一个pci接口,它相当于定义了一个统一的标准.一个采用了pci接口的网卡和声卡,相当于pci接口的两个子类. 一个采用pci插槽的主板,它不需要事先知道某个pci插槽是要插网卡还是声卡. 它只要按照pci接口的标准来开发就可以了.实际上,一个pci插槽既可以插网卡和声卡.这样的设计就变的非常灵活,这也体现了面向对象多态的特性.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值