JAVA基础学习——Day12(继承)

一、Day11复习部分

1. 面向对象开发的三大特性:封装,继承,多态

 封装:体现保护性和易用性

2. 上节课主要讲了使用private权限修饰符实现类中成员属性的封装。实际上可以有其他的很多的封装方法,例如内部类等等。

3. 权限修饰符:

private(类的内部可见,出了类完全隐藏) < default(什么也不写是default;包的内部可见,当前包(同级目录)的所有类之间可见,子包都不行,如果要访问必须导入) < protected < public (随意访问)

类的外部要想访问private属性,必须通过类提供的getter/setter方法来访问。

阿里编码规约规定:类中成员变量没有特殊声明,一律使用private进行封装合理的提供getter/setter方法

二、static作业

1. 例题1:

解析:答案选D

A. 虽然f是私有变量,但是这个主方法和f是在同一类内。3.0是字面量,小数的字面量默认为double类型,而对象t的f成员变量是float类型,大类型到小类型需要强转,因此编译错误

B. this.n

this表示对当前对象的引用,必须有对象才能调用;静态方法没对象也能调用,因此冲突。所以在静态方法中不能使用this关键字。

 

C. Test.m

m不是类属性,必须通过对象调用,因此编译错误

D. Test.n

正确,n是类属性,可以在静态方法中调用静态属性

2. 例题2:

 解析:答案为A

因为主方法在当前类内部,因此cd错误

通过不同的对象操作同一个类属性,最后一次通过类来操作类属性

因此x = 100, x++, x++ , x++, x-- ,最终x = 102

三、再谈权限修饰符

1.关于private的补充点:

(1)private可以修饰方法:这一类方法就是当前类内部使用,供类内部的其他方法调用,对外部隐藏。

(2)private不能修饰外部类(直接定义在源文件中的类称为外部类),可以修饰内部类(私有内部类,这个私有类只供包含它的外部类使用,对其他外部完全隐藏)。

原理:类定义出来时就是为了产生对象的,如果外部类被private修饰,那么对外完全隐藏,别的类不能检测到这个类,无法创建对象。而对于一个内部类来说,只是一个外部类的组件,可以设置为对外部不可见。

eg: 

 2. 再谈包访问权限default(不写就是default权限,一定不要写)

(1)包访问权限:当前同级包的内部可见, 子包都不行

(2)定义一个类到底是属于哪一个包。使用package关键字

(3)导入一个类,通过import 类的全名称(全名称 = 包名 + 类名)

A. 注意:不导入也行,但是使用的使用需要使用类的全名称,书写麻烦

 B. 注意1:在使用一个未导入的类的时候,IDEA会自动检测,然后按回车选择导入的类

例如下图:需要使用util包下的List这个类,输入List,选择合适的类,回车即可自动导入 

 C. 注意2:若需要频繁使用一个包下的若干子类,使用通配符导入

a. 语法:

import 包名.* 

b. 原理

c. 示例

源文件代码:

 class文件代码

 d. 合理但是不推荐这么写,有些时候会造成歧义,例如下例(导入不同包下的相同名字的类)

<1>原理:java.util下有一个Date类,java.sql下也有一个Date类,使用通配符,则编译器不知道到底使用的是哪个类,报错 

<2>解决思路1:明确使用import导入某个具体的类,另外一个还是通配符。

下例中使用的是java.util的Date类

<3>解决思路2:都保留通配符,但是使用类的时候使用类的全名称

 (4) 静态导入:将一个类的所有静态域导入到当前类中,使用别人写好的静态方法或属性,就好像是在你当前类中定义的一样(直接调用,不需要用类名.方法名访问)

(5)关于包访问权限的可见性:当访问修饰符未包访问权限时,被修饰的对象只在当前包内部可见,只有同级目录下的类可见,当前包的子包(子文件夹)内的类对于当前包的内部都不可见

A. 当前包下所有类可见

 B. 跨包,类不可见

 C. 当前类的子包中的类对于当前包的类还是不可见

D. 注意:一个问题:一个类是包访问权限的,那么在类中写的public方法是否有实际作用。

a. 结论:没有实际作用

b. 原理: 类是包访问权限的,出了包,这个类不可见。而类中的方法需要通过类产生的对象或者是类本身去调用。因此虽然语法上不报错,但是逻辑上,此处的public权限 == default权限

c. 最终结论:类中的访问修饰符,逻辑上最大不能超过类本身的修饰符!

E. 注意1:在开发中常用的JDK的包(面试常问)

a. java.lang包:系统的基础开发包,比如String类和Object类。在JDK1.1后自动导入,无需显示使用import导入java.lang包

b. java.util包:工具类开发包。整个的集合框架都在这个包下,Arrylist(动态数组),Arrays(数组工具包)

c. java.sql包:数据库开发包,JDBC相关的类都在这个包下,通过java和数据库进行交互

d. java.io包:IO编程开发包,文件的输入输出都在这个包下

e.java.new包:网络编程开发包,Scoket相关的类都在这个包下

f. java.lang.reflect: java的反射开发包,所有框架的基础都在于反射!  

四、继承

1. 一个问题引入继承:创建一个Dog类和Cat类

 由于不同的动物,具有很多的相似属性和行为。因此如果我去创建新的一个动物类,比如Duck,Frog类等等。这些相似的属性和行为就会分散在具体的类中,就会产生很多的冗余代码。同时新拓展一个类也比较麻烦,需要将冗余的代码也写一遍。在这种情况下引入继承的概念。

2. 继承:代码复用,增加整个程序的扩展性

使用继承的条件:要想使用继承,必须满足is-a原则

例如:Dog和Cat都是天然满足 is an Animal

因此将所有动物类的共同的属性和方法提取出来放在Animal类中,具体的Dog,Cat类只需要继承Animal类即可

 

 3. 继承的语法:使用extends关键字表示继承一个父类

(1)语法:

访问修饰符 class 子类名称 extends 父类名称{}

(2)示例

 

3. 有了继承的存在,将所有共性属性和方法放在父类中。子类只需要实现独有的属性和方法即可,整体代码实现更加简便,方便进行拓展。

例如: 在上述例子中若拓展一个新的子类Duck, 则变得非常的简单只用实现鸭子的独有方法即可

 

 4. 父类和子类的关系

(1)父类和子类不存在同名的属性和方法: 只要父类有就能找到(父类中的private修饰的属性除外)

 (2) 子类和父类的成员变量同名

A. 原理:

B. 示例

 (3)如果父类中的属性是私有权限,则在子类继承中无法直接使用(对子类来说父类中的私有属性不可见)

 (4)父类和子类方法之间的调用

A. 规则:

a. 若子类中存在该方法,则优先方法子类的同名方法(参数列表也要相同)

b. 若子类不存在该方法,则从父类中寻找是否存在该方法,存在则调用,不存在则编译出错

注:方法名称= 名称+参数列表

B. 示例:

 

 (5)当产生子类对象的时候,默认优先调用父类的构造方法产生父类对象而后调用子类的构造方法产生子类对象

(6)Super关键字 :表示直接从父类中寻找成员变量或成员方法

A. super修饰属性,表示直接寻找的父类的同名属性(注:private修饰的属性依旧无法被调用)

B. super修饰方法

a. super修饰成员方法: 表示直接在父类中寻找成员方法

 

b. super修饰构造方法

<1>若父类中存在无参构造,则在子类构造方法中的首行可以不写super();,相当于在子类中自动调用了父类的无参构造

 

<2>若父类中没有无参构造,则在子类的构造方法首行(只能在首行且只能调用一个父类有参构造)必须显示的使用super(参数)来调用父类中已有的有参构造(否则报错)

 注意1:当存在父类继承时,一般在子类中不出现this的构造方法调用。this修饰构造方法也需要放在首行

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值