16. Java面向对象的三个特征与含义

java中的面向对象的三大基本特征分别是:封装、继承、多态:
  1. 封装:把过程和数据包围起来,对数据的访问只能通过已定义的界面,主要是方便类的修改
  2. 继承:对象的一个新类可以从现有的类中派生,这个过程称为类继承。通常继承把共性放到父类,特性放到子类。继承性很好的解决了软件的可重用性问题
  3. 多态:指允许不同类的对象对同一消息作出响应,多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题
 

17. Override和Overload的含义和区别

Override即重写,也叫覆盖,即在子类中拥有与父类非private方法一模一样的方法(返回值,参数,方法名均相同,在Java SE5中引入了协变类型,协变类型允许覆盖的方法的返回值为原返回值的子类型),且子类方法的访问修饰权限不能少于父类,则对子类调用该方法时会调用子类方法代替父类方法。
Overload即重载,是指在同一类中拥有多个方法名相同,参数不同(参数类型或个数),返回值可相同可不同的方法。调用方法时会根据传入参数选择合适方法。
两者区别:
  1. Override描述子类与父类方法的关系,Overload描述同一个类中方法的关系
  2. Override的方法必须完全相同,权限不少于父类,Overload方法名必须相同,参数必须不同,返回值可同可不同

18. Interface与abstract类的区别

Interface即接口,接口可以有变量,但接口的变量均为public static final的编译期常量,接口中的方法均为public abstract的公开抽象方法,一个类可以实现多个接口。
abstract类即抽象类,抽象类有关键字abstract修饰,抽象类不能实例化只能被继承。抽象类中一般含有抽象方法(为public或protected,private无法继承),其他方面与一般类区别不大。
两者区别:
  1. 接口的变量为public static final的编译期常量,抽象类的变量没有限制
  2. 接口中的方法为public abstract的公开抽象方法,抽象类的抽象方法不为private即可,且允许有一般方法
  3. 一个类可以实现多个接口,一个类最多只能继承一个抽象类
 

19. Static class 与non static class的区别

首先由于顶级类(top level class)是不能为静态的,因此此处讨论的是内部类(nested class)。
静态内部类和非静态内部类的区别主要有以下几点:
  1. 静态内部类不需要持有指向外部类的引用,但非静态内部类需要持有对外部类的引用
  2. 静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员,而非静态内部类可以访问外部类所有成员
  3. 静态内部类与非静态内部类创建方法不同,一个非静态内部类不能脱离外部类实体被创建
创建静态内部类和非静态内部类的代码:
  1. public class Test {
  2. public static void main(String[] args) {
  3. // 创建静态内部类
  4. Test.staticClass class1 = new Test.staticClass();
  5. // 创建非静态内部类
  6. // 不能同编译!
  7. //      Test.noStaticClass class2 = new Test.noStaticClass();
  8. // 正确创建非静态内部类方法
  9. Test.noStaticClass class2 = new Test().new noStaticClass();
  10. }
  11. static class staticClass {};
  12. class noStaticClass {};
  13. }
 

20. java多态的实现原理

多态,也叫作动态绑定、后期绑定或运行时绑定,指允许不同类的对象对同一消息作出响应。下面介绍一些和绑定相关的概念:
  • 绑定:指的是将一个方法调用和一个方法主体关联起来的过程
  • 前期绑定:在程序执行前进行绑定(一般由编译器和连接程序实现,C++默认为前期绑定)
  • 后期绑定:也叫作动态绑定或运行时绑定,在程序运行时通过识别对象的类型,从而调用恰当的方法(Java除static和final方法外,其他均为后期绑定。C++通过virtual关键字实现虚函数,从而实现后期绑定)
来看一段Java代码:
  1. public class Test {
  2. static class A {
  3. public void sayHi() {
  4. System.out.println("Hi, I am A");
  5. }
  6. }
  7. static class B extends A {
  8. @Override
  9. public void sayHi() {
  10. System.out.println("Hi, I am B");
  11. }
  12. }
  13. static class C extends A {
  14. @Override
  15. public void sayHi() {
  16. System.out.println("Hi, I am C");
  17. }
  18. }
  19. public static void saySomething(A a) {
  20. a.sayHi();
  21. }
  22. public static void main(String[] args) {
  23. saySomething(new A());
  24. saySomething(new B());
  25. saySomething(new C());
  26. }
  27. }

看到第23行的方法,从编译器给出的信息我们只能知道a是一个A类的引用,但无法确定a是A类的实例,还是其子类(B或C)的实例(导出类可以通过向上转型,把对自身的引用视为对其基类的引用),因此如果通过前期绑定,我们并不能实现多态。但是如果我们使用的是后期绑定,我们就可以在程序运行时先确定传入实例的具体类型,再根据其具体类型来调用对应的方法,就可以实现多态。

关于一些基础的Java问题的解答(四)的更多相关文章

  1. 关于一些基础的Java问题的解答(一)

    学习一门语言基础是非常重要的,因此本文总结了一些常见的Java基础问题的解答,希望可以帮到大家. 1. 九种基本数据类型的大小,以及他们的封装类. 9种基本数据类型 基本类型 包装类型 大小 bool ...

  2. 关于一些基础的Java问题的解答(七)

    31. 反射的作用与原理 简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息.如果知道一个类的名称或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符 ...

  3. 关于一些基础的Java问题的解答(六)

    26. ThreadPool用法与优势 ThreadPool即线程池,它是JDK1.5引入的Concurrent包中用于处理并发编程的工具.使用线程池有如下好处: 降低资源消耗:通过重复利用已创建的线 ...

  4. 关于一些基础的Java问题的解答(五)

    21. 实现多线程的两种方法:Thread与Runable 在Java中实现多线程编程有以下几个方法: 1.继承Thread类,重写run方法 public class Test { public s ...

  5. 关于一些基础的Java问题的解答(三)

    11. HashMap和ConcurrentHashMap的区别   从JDK1.2起,就有了HashMap,正如上一个问题所提到的,HashMap与HashTable不同,不是线程安全的,因此多线程 ...

  6. 关于一些基础的Java问题的解答(二)

    6. Hashcode的作用 官方对于hashCode的解释如下: Whenever it is invoked on the same object more than once during an ...

  7. 20145213 《Java程序设计》实验四 Android开发基础

    20145213 <Java程序设计>实验四 Android开发基础 说在前面的话 不同以往实验,对于这次实验具体内容我是比较茫然的.因为点我,打开实验四的链接居然能飘出一股熟悉的味道,这 ...

  8. 20145225《Java程序设计》 实验四 Android开发基础

    20145225<Java程序设计> 实验四 Android开发基础 实验报告 实验内容 安装Android Studio 运行安卓AVD模拟器 使用安卓运行出虚拟手机并显示HelloWo ...

  9. 黑马程序员:Java基础总结----java注解

    黑马程序员:Java基础总结 java注解   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...

随机推荐

  1. SpringCloud应用入库后乱码问题

    一.现象 1.请求 2.入库后 二.解决过程 1.配置application.properties 2.代码配置 3.数据库(关键!!) 3.请求 三.验证过程 1.win10 - 本地验证通过 2. ...

  2. 阿里云API网关(11)外网访问 阿里云API网关内定义的API步骤:

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  3. 【已解决】React中配置Sass引入.scss文件无效

    React中配置Sass引入.scss文件无效 在react中使用sass时,引入.scss文件失效 尝试很多方法没法解决,最终找到解决方法,希望能帮助正在坑里挣扎的筒子~ 在node_modules ...

  4. 对JVM虚拟机中方法区的理解

    因为jdk8的jvm已经取消了方法区,所以这边先主要介绍jdk8以下版本中方法区相关内容. 1.虚拟机规范中方法区的概念: 原文链接:http://docs.oracle.com/javase/spe ...

  5. python基础—函数嵌套与闭包

    python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间   内置在解释器中的名称 2 全局名称空间   顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...

  6. 使用一个Python脚本来运行一个简单的Django项目

    创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...

  7. JS小测验

    1.编写一个方法method(),判断一个数能否同时被3和5整除 <div class="one" onClick="method()"> func ...

  8. [LeetCode] 4 Keys Keyboard 四键的键盘

    Imagine you have a special keyboard with the following keys: Key 1: (A): Print one 'A' on screen. Ke ...

  9. Java数据类型与SQL数据类型的映射

    Java数据类型与SQL数据类型的映射 SQL Data Type Java Data Type char/varchar/longvarchar String numeric/decimal jav ...

  10. [HAOI2006]数字序列

    题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. 输入输出格式 输入格式: 第一行包含一个数 ...