关于类的继承,抽象类,接口

放在最前面的话:

       这周总结实在是无能为力,无法总结到位,抱歉。后续学扎实了,等有时间了一定补上。

       

本周:(只是发牢骚的话🙅🏻‍♀️)

        前两天混了两天,没想到周三下午电脑又坏了...

        周四下午开车一个半小时修了不到一分钟回来了,电脑还是不能用,刚到家立马打电话问他怎么回事,结果就给我来一句果然是驱动硬件的问题,这样只能重装系统了。我去,修电脑那个男的无所谓的态度,我真是服了。但凡他多说一句也不会让我多跑一趟。

        另一个人说这款就是容易发生断网现象,我本来没觉得我中标了,毕竟买今年品控极差的iPad Air5的时候我也没买到残次品。

     (可能我的知乎玄学真的凑效了,下次买贵重物品先去玄学一波吧🤦🏻‍♀️无语)

         啊突然想起来,我的文件没了(ꆤ⍸ꆤ),是我太傻不会拷贝,我还不如一个个拉呢。damn。

        我爸开车是真的晕,只坐他的车晕。周六下午十二点半出门一直到快五点才回家,电脑寄去了郑州,因为疫情至少也要两周左右才能回来,郑州的硬件还要从上海发回来。上海的朋友说她姐姐从郑州寄的东西过了七天才到,啊,真的无语了。差一点我就直接寄去上海了。

        没电脑我学个什么东西。本来进度就挺慢的了,本来打算这周把第八章全部看完复习完的.....高数还有回放没看,题没写,英语单词也还没背,英语作业还没写...看书也看不太进去了...

        没电脑效率大幅度降低。(其实应该是我太懒了,又摆烂了)

        我上辈子是破坏了银河系吧,谁能拯救一下摆烂一周的我...

        啊对了,我还发现电脑不知道什么时候被我碰掉漆了,心疼😰

下周目标:

        F:先把课赶上吧。

        S:把前面的复习一下,做题漏洞太大了。

        T:下一章 异常处理 尽力看完。

        -考核...考核?!😵‍💫我可简直太知道我自己什么水平了...

 

第八章:(这次只是大概,抱歉)

类的继承:

-被继承的类称为父类超类(superclass),由继承而得到的类称为子类(subclass)。

-java语言中不支持多重继承,因此一个父类可以同时拥有多个子类,但一个类只能有一个直接父类。

-java.lang.Object的特殊类,所有的类都是直接或间接地继承该类而得到的。

-类的继承是通过extends关键字实现的。在定义类时使用extends关键字指出新定义类的父类,就是在两个类之间建立了继承关系。新定义的类称为子类,它可以从父类那里继承所有非私有成员作为自己的成员。格式:

     class SubClass extends SuperClass
     {
         ⋮
     }      

-继承的“即是”性质:子类的每个对象是其弗雷德对象。但父类的对象不一定是它子类的对象。

-通过extends关键字,可将父类中的非私有成员继承给子类。

-java程序在执行子类的构造方法前会先自动调用父类中的无参构造器其目的是为了帮助继承自父类的成员做初始化操作。

-严格来说,构造方法是不能被继承的,但是并不意味着子类不能调用父类的构造方法。

 

-调用父类中特定的构造方法:

  在子类的构造方法中通过super()语句调用。

*说明:

-super()语句必须写在子类构造器的第一行,否则编译出现错误信息。

-格式:super(参数列表);

-super()可以重载。

-Java程序在执行子类的构造方法之前,如果没有用super()来调用父类中特定的构造方法,则会先调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到“没有参数的构造方法”可供执行。解决的办法是在父类中加上一个“不做事”且没有参数的构造方法即可。

-super()与this()均必须放在构造方法内的第1行,因此super()与this()无法同时存在同一个构造方法内。

-与this关键字一样,super指的也是对象,所以super同样不能在static环境中使用,包括静态方法和静态初始化器(static语句块)。

 

-在子类中访问父类的成员:

-在子类中使用super不但可以访问父类的构造方法,还可以访问父类的成员变量和成员方法,但super不能访问在子类中添加的成员。格式:
     super.变量名;
     super.方法名;

-子类不能继承父类的private成员,但如果将其声明为protected成员,则不仅可在父类中直接访问,同时也可以在其子类中访问。

*说明:

-用protected修饰的成员可以被该类自身、与它在同一个包中的其他类、在其他包中该类的子类三种类所引用。

-将成员声明为protected的最大好处是可以同时兼顾成员的安全性与便利性,因为它只能供父类与子类或同一包中的类来访问,而其他类则无法访问它。

-覆盖:

-重载与覆盖:

重载指在同一个类内定义多个名称想听但参数个数或类型不同的方法,java虚拟机可根据参数的个数惑雷刑的不同来调用相应的方法。

覆盖指在子类中定义名称、参数个数与类型均与父类中完全相同的方法,用以重写父类中同名方法的功能

*说明:

-在子类中重新定义父类已有的方法时,应保持与父类中完全相同的方法头声明,即应与父类中被覆盖的方法有完全相同的方法名、返回值类型和参数列表。

否则就不是方法的覆盖,而是子类定义自己的与父类无关的方法,父类的方法未被覆盖,所以仍然存在。

-子类继承父类中所有可被访问的成员方法时,如果子类的方法头与父类中的方法头完全相同,则不能继承,此时子类的方法是覆盖父类的方法。

-注意 :子类中不能覆盖父类中声明为final或static的方法。

-在子类中覆盖父类方法时可以扩大父类中的方法权限,但不能缩小。

 

-用父类对象访问子类成员:

-通过父类对象访问子类成员,只限于“覆盖”情况发生时。

-创建父类类型的变量指向子类对象,即将子类对象赋值给父类类型的变量,这种技术称为“向上转型”

-向下转型就是将父类对象通过强制转换为子类型再赋值给子类对象的技术。向下转型就是将较抽象的类转换为较具体的类。

-不可被继承的成员与最终类:

-如果父类的成员不希望被子类的成员所覆盖,可以将它们声明为final。

-如果一个类被final修饰符修饰,这说明这个类不能再被其他类所继承,即该类不可能有子类,这种类被称为最终类

*注意 :

-所有已被private修饰符限定为私有的方法,以及所有包含在final类中的方法,都被默认为是final的。这些方法既不可能被子类所继承,也不可能被覆盖,所以它们自然都是最终的方法。

-定义在类中的final成员变量和定义在方法中的final局部变量一旦给定,就不能更改。大体上说,final成员变量和final局部变量都是只读量,它们能且只能被赋值一次,而不能被赋值多次。

-一个成员变量若被static final两个修饰符所限定时,它实际的含义就是常量,所以在程序中通常用static和final一起来指定一个常量,且这样的常量只能在定义时被赋值。

-定义一个成员变量时,若只用final修饰而不用static修饰,则必须且只能赋值一次,不能默认。这种成员变量的赋值方式有两种:一种是在定义变量时赋初值;另一种是在某一个构造方法中进行赋值。

-Object类:

6b79cffa8fd14324b9505dcea4c5c7b3.png

- == 与 equals()方法比较对象:

-比较方式不同。==运算符用于比较两个变量本身的值,即两个对象在内存中的首地址,而equals()方法则是比较两个字符串中所包含的内容是否相同;

-而对于非字符串类型的变量来说,“==”运算符和equals()方法都用来比较其所指对象在堆内存中的首地址。

-换句话说,“==”运算符和equals()方法都是用来比较两个类类型的变量是否指向同一个对象;

-toString()方法

-toString()方法的功能是将调用该方法的对象的内容转换成字符串,并返回其内容,但返回的是一些没有意义且看不懂的字符串。

-因此,如果要用toString()方法返回对象的内容,可以重新定义该方法以覆盖父类中的同名方法以满足需要。

-getClass()方法

-getClass()方法的功能是返回运行时的对象所属的类。在取得Class对象之后,就可以通过Class对象的一些方法来获取类的基本信息。

-对象运算符instanceof

-对象运算符instanceof来测试一个指定对象是否是指定类或它的子类的实例,若是,则返回true,否则返回false。

 

-抽象类:

在java语言中可以创建专门的类作为父类,这种类被称为“抽象类”。

-目的:根据它的格式来创建和修改新的类。

*注意

-并不能直接由抽象类创建对象,只能通过抽象类派生出新的子类,再由其子类来创建对象。也就是说,抽象类是不能用new运算符来创建实例对象的类,它可以作为父类被它的所有子类所共享。

-抽象类是以修饰符abstract修饰的类。定义格式:

62c0f59e2610480088e875cd52cc4deb.png

 -说明 :

-在抽象类中的方法可分为两种,一种是以前介绍的带有方法体的一般方法,另一种是没有方法体的“抽象方法”,它是以abstract关键字开头的方法,此方法只声明返回值的数据类型、方法名称与所需的参数,但没有方法体。也就是说,对抽象方法只需要声明,而不需要实现,即用“;”结尾,而不是用“{}”结尾。

-当一种方法声明为抽象方法时,意味着这种方法必须被子类的方法所覆盖,否则子类仍然是抽象的。

-抽象方法声明中修饰符static和abstract不能同时使用。

-抽象类的子类必须实现父类中的所有抽象方法,或者将自己也声明为抽象的。

*注意

-抽象类是需要被继承的,所以抽象类不能用final来修饰。也就说,一个类不能既是最终类又是抽象类,即关键字abstract与final不能合用。

-abstract不能与private、static、final或native并列修饰同一种方法。

-抽象类中不一定包含抽象方法,但包含抽象方法的类一定要声明为抽象类。

-抽象类可以有构造方法,且构造方法可以被子类的构造方法所调用,但构造方法不能被声明为抽象的。

 

-接口:

-本身也具有数据成员、抽象方法、默认方法、静态默认方法。

-与抽象类的不同点:

(1)接口的数据成员都是静态的且必须初始化,即数据成员必须是静态常量。

(2)接口中除了声明抽象方法外,还可以定义静态方法和默认方法。

-定义格式:

a3f52a83c7fe49cf84371179b6d86dff.png

-按照Java语言的命名惯例,接口中的常量通常都使用大写字母命名。由于接口中的常量与静态方法都是静态的,所以可以直接用接口名调用。虽然可以在接口中定义常量,但不推荐这种使用方式,因为使用枚举定义常量比接口中定义常量更好。

-总之,接口中的抽象方法不能有方法的实现,即不能有方法体,而接口中的静态方法和默认方法都必须有方法的实现,即必须要定义方法体。

(手机打字太冻手了,还没吃饭,就写到这吧)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值