java复用类之组合语法、继承语法;代理、结合使用组合和继承、组合与继承之间选择;protected关键字、向上转型;final数据-空白final和final参数、final方法、final类;

访问控制修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)、

  • 如果不希望那个任何产生某个class的对象,可以将该类得所有构造函数设置成private。但是即使这样也可以生成该类的对象,就是class的static的成员(属性和方法)可以办到

  • protected:关键字所处理的是所谓“继承”的观念。对于同一包的其他类,protected=默认,对于不同包的类,如果存在继承关系,而baseClass存在protected属性,则可以被其自继承,而不同包的其他类则不能访问类protected属性。

  • public : 对所有类可见。使用对象:类、接口、变量、方法

  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

 https://www.runoob.com/java/java-modifier-types.html#protected-desc

初始化及类的加载、继承与初始化

组合语法

组合的方法非常直观:只需在新的类中产生现有类的对象。由于新的类是由现有 类的对象所组成,所以这种方法称为组合。该方法只是复用了现有程序代码的功能,而非它 的形式。

数据初始化的四种方式

1.定义的地方初始化

2.在构造器中初始化

3.实例初始化

4.惰性初始化(用的时候初始化,节省内存资源)

继承语法

继承的技术需要谨慎使用,组合和继承的区别是否需要子类向基类向上转型

Detergent的scrub()方法覆盖了父类Cleanser的scrub()方法,要想使用必须用super.scrub()调用基类的方法

父类private的方法和数据成员对子类是不可访问的

初始化基类

当一个类new一个对象有父类时,父类默认构造器会在子类构造器第一行代码执行之前会调用;当父类不是无参构造器,子类需要在构造器中显示的调用。

 

变相代理 

第三种关系称为代理,Java并没有提供对它的直接支持。这是继承与组合之间的中庸之道,因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该 成员对象的所有方法(就像继承)。

代码java编程思想131page

结合使用组合和继承

继承的技术需要谨慎使用,组合和继承的区别是否需要子类向基类向上转型

确保正确清理

       Java中没有C++中析构函数的概念。析构函数是一种在对象被销鼠时可以被自动调用的函数。 其原因可能是因为在Java中,我们的习惯只是忘掉而不是销鼠对象,并且让垃圾回收器在必要 时释放其内存。

       通常这样做是好事,但有时类可能要在其生命周期内执行一些必需的清理活动。正如我们 在第5章中所提到的那样,你并不知道垃圾回收器何时将会被调用,或者它是否将被调用。因此, 如果你想要某个类清理一些东西,就必须显式地编写一个特殊方法来做这件事,并要确保客户 端程序员知晓他们必须要调用这一方法。就像在第12章所描述的那样,其首要任务就是,必须 将这一清理动作置于finally子句之中,以预防异常的出现。

134page

 

 名称屏蔽 

    如果Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称 并不会屏蔽其在基类中的任何版本(这一点与C++不同)。因此,无论是在该层或者它的基类中 对方法进行定义,重载机制都可以正常工作(看似是重载但返回值类型不同):

 

在组合与继承之间选择

       组合和继承都允许在新的类中放置子对象,组合是显式地这样做,而继承则是隐式地做。 读者或许想知道二者间的区别何在,以及怎样在二者之间做出选择。 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。邦,在新类中嵌 人某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所 嵌人对象的接口。为取得此效果,需要在新类中嵌人一个现有类的private对象。 有时,允许类的用户直接访问新类中的组合成分是极具意义的,也就是说,将成员对象声 明为public。如果成员对象自身都隐藏了具体实现,那么这种做法是安全的。当用户能够了解到 你正在组装一组部件时,会使得端口更加易于理解。car对象即为一个很好的例子:137page

 

protected关键字

现在,我们已介绍完了继承,关键字protected最终具有了意义。在理想世界中,仅靠关键 字private就已经足够了。但在实际项目中,经常会想要将某些事物尽可能对这个世界隐藏起来, 但仍然允许导出类的成员访问它们。 关键字protected就是起这个作用的。它指明“就类用户而言,这是private的,但对于任何 继承于此类的导出类或其他任何位于同一个包内的类来说,它却是可以访问的。”(protected也 提供了包内访问权限。)

 

 

向上转型

子转父

继承的技术需要谨慎使用,组合和继承的区别是否需要子类向基类向上转型

 

final数据

当对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑。对于基本类型, final使数值恒定不变,而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对 象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的,Java并未提供

fianl int[] a={1,2,3}数据是可变,引用不能变

第一个没创建一次对象,i4需要实例化一次

第二个只实例化一次

1.空白final

在使用前必须赋值一次, 有构造器必须写上赋值过程

2.final参数

此参数在方法中不可以更改

final方法

父类的方法不想被子类覆盖可以使用final声名,私有的方法加上final没意义

使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义。 文是出于设计的考虑:想要确保在继承中使方法行为保持不变,并且不会被覆盖。

 

final类

      当将某个类的整体定义为final时(通过将关键字final置于它的定义之前),就表明了你不打 算继承该类,而且也不允许别人这样做。换句话说,出于某种考虑,你刘该类的设计永不需要 做任何变动,或者出于安全的考虑,你不希望它有子类。

 

初始化及类的加载

 

继承与初始化

当父类构造器是有参构造器时需要在子类构造器中调用super(a,b)传参,无参则不需要

上述代码执行过程,首先访问Beetle的main方法,找到Beetle的编译代码并加载,同时通过关键字发现拥有Insec这个基类,不管是否产生对象都需要加载这个基类,如果还有基类就继续加载,然后在基类中静态的成员会先调用静态方法初始化(静态的成员只能调用静态的方法,非静态的都可以),再回到Beetle的main方法,进而在这个类中优先初始化静态成员x2,下一步打印“Beetle constuctor”,再执行new Beetle()的时候先默认初始化父类的构造器,先初始化父类的数据成员,在调用父类的Insect()构造器,回到子类初始化实例成员,最后调用子类构造器Beetle()

9-21-22-7-10-11-15-16-17-2-3

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值