[学习笔记 随手记版·一刷]Java基本内容-2

1. 对子类和父类的关系的理解?

"继承"(inheritance)是面向对象最显著的一个特性

        从语义上看, 一个子类继承父类, 这个子类就是一种"特殊"的父类, 可以表述为"子类是一种父类". 比如: "狗" 是一种"动物", 所以"狗" 是 "动物"的子类, "动物"是"狗"的父类. 父类与子类的关系是一种"一般"与"特殊"的关系. 所以"继承"也可以理解为 "泛化"

        从语法上看, 一个子类继承父类, 这个子类就自动获得了父类中定义的成员变量和成员方法, 同时,这个子类也可以定义新的成员变量和成员方法. 所以"继承"也可以理解为 "扩展"

        父类又称为超类(Supper Class) 或基类(Base Class)

        子类(Sub Class) 又称为派生类(Derived Class)

通过子类继承父类, 使得复用父类的代码变得非常容易, 能够大大缩短开发周期, 降低开发费用

        

2.        Java语言是不支持多继承的, 也就是说: 一个类不能直接继承多个父类, Java语言只支持单继承

        举例: class C extends A,B {} // 这个是错误的, C类不能既继承A又继承B类

注意: 定义一个类时, 如果没有声明这个类继承 extends哪个父类, 则这个类就自动继承 java.lang.Object.         java.lang.Object是所有Java类的始祖类, 或者说, 所有Java类都派生自 java.lang.Object.

       关于继承,需要注意的语法机制:

1) Java虚拟机在装载一个子类之前, 必须先装载它的父类

2) 因为一个子类对象肯定要拥有父类对象的属性,所以在一个子类对象数据中是包含一个父类对象数据的. 那么在创建初始化一个子类对象时, 就必须先创建初始化一个父类对象. 所以在调用子类构造方法时, 肯定会先调用父类的构造方法, 以初始化这个子类对象里的父类对象

3) 父类的构造方法是不能被子类继承的, 但是子类的构造方法中可以调用, 也必须调用父类的构造方法

4) 如果在子类的构造方法中需要显式的调用父类的构造方法, 那么就要在子类构造方法中的第一行, 使用语句"super(实参列表)" 来调用父类的构造方法

5) 如果在子类的构造方法中没有显式调用父类的构造方法,则编译器会自动在子类构造方法中的第一行, 添加调用父类无参构造方法的语句"super()", 如果此时父类没有定义无参的构造方法, 则会出现编译错误

3.什么是方法的覆盖和变量的隐藏?

        如果一个子类对继承自父类的某个方法的实现"不满意", 子类便可以重新实现这个方法. 这种语法机制称为"方法的覆盖"(Override), 或者称为"方法的重写"

        关于方法的覆盖这种语法机制, 需要注意的是:

                1) 子类重新实现的方法必须和父类中被覆盖的方法具有完全一致的: 方法名, 参数列表和返回值类型, 否则就不能称为方法的覆盖

                2) 在子类的方法中, 可以通过语句"super.方法名", 来显示调用父类中被覆盖的方法

                3) 子类不能覆盖父类中用"static","private" 或者"final"修饰符修饰的方法

                4)只有当一个子类能够访问父类的某个方法时, 父类的这个方法才能被子类覆盖.

 4. 理解 终态修饰符: final

        修饰符"final" 的含义是"终态的", 也就是"不能改变的".   可以用来修饰 变量, 方法和类

用final修饰的变量的值不能被改变, 也就是说:

         1)一个用final修饰的变量实际上是一个"常量".按变量定义的位置来分, 变量分为局部变量和成员变量. 方法的形参和方法体中定义的变量是局部变量.

        2)一个用final修饰的方法形参, 在方法体中不能改变它的值: 一个方法体中定义的局部变量如果用final修饰, 则这个变量只能赋值一次, 赋值后不能改变它的值.

        3)一个用final修饰的类不能被继承,这种类用被称为最终类. 最终类中的所有方法都默认是终态的, 也就是说, 编译器会给最终类中定义的方法都加上修饰符 final

5. 理解访问权限修饰符:

        Java语言中的访问权限修饰符分为两类, 一类是用来修饰类的, 一类是用来修饰成员变量和成员方法的.

        修饰类的访问权限有两种: 公共的 public 和 缺省的 default, 如果定义了一个类使用了 修饰符public, 则这个类的访问权限就是公共的, 否则这个类的访问权限就是缺省的.public 类可以被所有的类访问, 包括: 和自己同一个包中的类, 其他包中的类. default类只能被自己同一个包中的类访问.

        

         修饰成员变量和成员方法的访问权限有4种, 按访问权限范围有小到大排列, 分别是: 私有的 private, 缺省的default, 受保护的protected, 公共的public.

修饰符成员类型类内部同一个包的其他类子类其他包中的类
private私有成员YESNONONO
default缺省成员YESYESNONO
protected受保护成员YESYESYESNO
public公共成员YESYESYESYES

6.什么是对象转型?

引用数据类型转型的这种语法机制通常又称为"对象转型"(Casting):  将一个引用类型变量指向其父类对象或者子类对象. 

 7.方法和函数的关系?

方法和函数是同一个东西,方法是类里定义的,也只存放在方法区中的类原型中,方法表示该类对象具有的功能。

8. 理解什么是 Java的引用?

一个Java的引用具有两种特征类型: 编译时类型(Compile-Time Type) 和 运行时类型(Runtime Type)

编译时类型: 指的是 声明该引用时所用的类型, 运行时类型是该引用实际指向的对象所属的类型.

                一个引用的编译时类型和运行时类型有时是相同的, 比如代码"A a = new A()"中, 引用a的编译时类型和运行时类型都是A.

                一个引用的编译时类型和运行时类型有时时不同的, 比如A类时B类的父类, 则代码"A a = new B()"中,引用a的编译时类型就是A, 运行时类型就是B.

9. 在程序的编译阶段, 编译器检查一个引用能够访问那些成员时, 是由这个引用的编译时类型决定的.

10. 理解方法的绑定?

 

11. 理解多态:

12.理解抽象类:

        用修饰符"abstract"修饰的类称为 抽象类, 用修饰符"abstract"修饰的方法称为抽象方法. 抽象类不能实例化, 即不能创建对象.

抽象方法只有声明, 而没有实现,即没有方法体{...}

     抽象类的作用:

            抽象类往往用来表示我们在对问题域进行分析设计中得出的抽象概念.   

13.理解接口:

        接口(interface), 在软件工程中, 接口泛指供别人调用的方法或者函数. 在Java语言中, 接口时对行为的抽象.

                定义一个接口, 从语义上理解,就是定义了一个"能够做某些事情"的行为特性集合, 或者说功能集合.

        注意: 在接口中能定义"能够做某些事情", 而不是定义"如何做某些事情".

14. 普通类和抽象类有那些区别?

        1) 抽象类不能被实例化

        2) 抽象类可以有抽象放啊, 抽象方法只需申明, 无需实现

        3) 含有抽象方法的类必须申明为抽象类

        4) 抽象类的子类必须实现抽象类中所有抽象方法, 否则这个子类也是抽象类

        5) 抽象方法不能被声明为静态

        6) 抽象方法不能用private修饰

        7) 抽象方法不能用final修饰

15. 抽象类和接口有什么区别?

  从语法层面来看有什么区别:

        1) 抽象类可以定义抽象方法, 也可以定义具体实现的方法; 而接口中只能定义公共的抽象方法 public abstract

        2) 抽象类中定义的属性可以时各种类型的变量或者常量; 而是接口中定义的属性只能时公共的静态常量 public static final

        3) 抽象类中可以定义静态代码块和静态方法;而接口中不能定义静态代码块和静态方法

        4) 一个类只能继承一个抽象类; 而一个类却可以实现多个接口

       

    从设计层面来看有什么区别:

          1) 抽象类是对一类事物的抽象, 包含事物的共有属性, 具体行为和抽象行为; 而接口只是某种行为特性的抽象, 是包含抽象行为.

           2) 一个类继承一个抽象类, 是一种"是" 的关系. 

           3) 一个抽象类作为很多子类的父类, 它是一种"模板式"设计

        

16. 什么是Java API文档?

API是"Application Programming Interface"的缩写, 意思是: 应用程序编程接口, Java API其实就是指 Java类库. 

开发Java应用程序, 肯定要使用他人提供的 Java类库, 尤其是 JavaSE类库 中的一些Java编程基础类. 要使用他人设计实现的某个类, 就需要知道这个类的定义, 包括: 包名, 类命, 成员变量, 成员方法, 访问权限等方面, 此时就需要查阅相应的API文档.

所有 查阅API文档的能力 是一个程序员不可或缺的能力.

Java SE的文档可以在 Oracle官网查看

17. 理解始祖类:

        java.lang.Object类是所有 Java类的始祖类, 所有的Java类 要么是直接继承Object类的, 要么是间接继承Object的.

        因为, 如果在一个类的定义中未使用 extends 关键字指明这个类的父类, 则这个类的父类默认是 java.lang.Object类.

18. 什么时候是在字符串常量池中保存字符串? 什么时候是在堆中保存字符串呢?

        当一个字符串在编译期就能确定, 则当JVM载入类时, 这个字符串就会保存在字符串常量池中

        当一个字符串只有在程序运行期间才能确定, 则JVM就会在堆中从创建String对象来保存这个字符串.

19. 什么是包装器类?为什么需要包装器类?

        Java语言由8种基本数据类型, 这些基本数据类型的值不是对象, 不能按照操作对象的方式来操作这些基本数据类型的值, 但是在有些情况下 我们有需要将这些基本数据类型的值作为对象来处理.         为此, Java语言为每种基本数据类型设计了一个对象的类, 这些类称为 包装器类(Wrapper Class) 

        

 20.什么叫做装箱?什么叫做拆箱?

将一个基本数据类型的值 封装成一个对应的包装器类对象, 这种操作称为"装箱(Boxing)"

        比如: Interger iObj = Integer.valueOf(10);

那就是反过来, 将一个包装器类对象的基本数据类型的值取出来, 这种操作称为"拆箱"

        比如:int ij = iObj.intValue();

从JDK1.5版本开始, 拆箱和装箱操作编译器都能自动完成

        比如: Integer iObj = 10  编译器自动翻译为: Integer iObj = new Integer(10);

        比如: int j = 10 + iObj  编译器会自动翻译为: int j = 10 + iObj.intValue();

21.理解数学类:

        java.lang.Math 类包含用于执行基本数学运算的方法, 如初等指数, 对数, 平方根和三角函数, 而且这些方法都被定义为静态的 static, 也就是说调用这些方法时, 无需创建Math对象, 只需要通过类名 Math. 方法名 来调用这些方法即可

22. 理解随机数类:

        Java.util.Random 类模拟了一个伪随机数发生器, 用以生成随机数. 可以使用系统时间或给出一个长整数作为"种子" 构造出一个Random对象, 再通过这个Random 对对象生成指定范围的随机数

        Random类中 实现的随机算法是伪随机, 也就是有规则的随机. 在进行随机时, 随机算法的起源数字被称为种子数(seed), 在种子数的基础上进行一定的交换, 从而产生需要的随机数.

        相同种子数的Random对象, 相同词属生成的随机数字是完全相同的. 也就是说,两个种子数相同的Random对象, 第一次生成的随机数字完全相同, 第二次生成的随机数字也完全相同

23. 理解时间日期类:

        java.util.Date类表示时间上特定的瞬间, 精确到毫秒. 实际上, 一个Date对象里包装了一个Long类型的数值, 这个数值就是自 1970年1月1日0时起到这个Date对象创建时所经历的毫秒数

        然而从 JDK1.1版本开始, java.util.Date 中的大部分方法已经被声明为过时的, 目前在官方推荐使用 java.util.Calendar类进行实现

        java.util.Calendar类 同样是表示时间上特定的瞬间, 精确到毫秒.  但是Calendar 类比Date类功能更为强大. Calendar类本身就是一个抽象类,而且Calendar类的构造方法被定义为 protected的, 所以不能直接通过起构造方法创建Calendar的实例.

                

24. 什么是Java中异常?

               异常(Exception), 也就是非正常情况, 是指程序运行过程中, 各种不期而至的状态, 例如: 除0溢出, 数组下标越界, 所要读取的文件不存在, 无法连接远程套接字等.

                异常这种程序运行时发生的错误, 既不是语法错误, 也不是编译器检查出的错误, 它会导致程序非正常终止,但是通过异常处理机制, 可以使程序自身能够捕获和处理异常, 从而使程序继续往下执行.

          抛出(throw)异常  在Java程序的执行过程中 如果出现异常事件, 将会产生一个异常类型对象, 该异常对象封装了异常事件的信息, 这个过程叫做   抛出异常.

25.理解捕获处理异常:

               健壮的程序应该在异常发生时捕获(catch)异常对象, 并执行相应的异常处理代码, 是程序不会因为异常的发生而非正常终止或产生不可预见的结果

                在Java语言中, 使用关键字try catch, finally.

26. 什么是数组?

多个相同类型数据的集合 可以叫做数组

这些数据可以叫做数组元素

        在Java语言中,  数据就是对象, 数组元素可以看程数组对象的成员变量, 数组元素既可以是基本数据类型的, 也可以是引用数据类型的. 

                注意:  数组虽然是对象,但是Java SE API中没有提供数组类, 所以的数组类都是JVM动态创建的

27.创建的数组对象是存放在 Heap堆中的, 而且数组对象中的数组元素都是有默认初始值的, 比如int类型的数组元素默认初始值是 0, 引用类型的数组元素默认初始值是 null

                所以在, Java语言中, 创建一维数组的语法格式通常为:

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值