JavaSE面试要点二——Java的概述(面向对象、设计原则、跨平台)

什么是Java

Java是Sun公司与1995年发布的一款编程语言计算机平台

计算机平台:它是在电脑中运行应用程序的环境,包括硬件环境和软件环境。一般系统平台包括一台电脑的硬件平台、操作系统、运行时库。

Java是快速的、安全的、可靠的。Java主要有三个版本

  1. JavaSE(Java平台标准版)
  2. JavaEE(Java企业标准版)
  3. JavaME(Java平台微型版)

Java语言的特点(面向对象)

    Java是一门面向对象语言

什么是面向对象:我的理解是:面向对象时一种开发程序的思想,而不是一种笼统的概念,万物皆对象。面向对象会把相关的数据和方法组织为一个整体来看待。

    Java的面向对象思想与C的面向过程不同,面向过程以过程为中心,将问题的解决问题分解为步骤或者说是模块。就比如要洗一件衣服,面向过程的思想就是:加水、放衣服、放洗衣粉、搓洗、加水洗掉洗衣液、脱水、晒干… C使用自顶而下的程序设计思路,把各个模块的各部分元素实现高内聚,低耦合,然后用函数把这些步骤一步一步地实现,使用的时候一个一个地依次调用。虽然这种解决问题的方式很容易理解,但是在代码中,这种思路遇到越大型的系统越乏力,维护一个个关系容易数据管理很苦难。
    这时候,面向对象思想的优越性就体现了出来,万物皆对象,将复杂问题简单化。就好比洗衣服的例子,面向对象的设计思路就是:打开洗衣机,放衣服,洗完后取出来,晒干…与面向过程相比,将如何洗衣服交给一个洗衣机类,这个类里面封装了一些如何洗衣服的属性和方法,在通过一个巧妙地引用来调动这些方法去实现洗衣服的步骤。它不需要去组织这些方法的步骤,而是先实现出类的设计,把数据和方法封装不分离,独立为一个整体,让类的实体——对象去调用方法来实现。实现这些操作就离不开面向对象的三大特征——封装、继承和多态

面向对象的三大特征

封装

    就好比刚才的举例,将数据和方法封装起来,具体的做法就是隐藏对象的属性,若外界需要访问某个属性,提供公共的方法以供调用。类中的大多数数据只能通过本类的方法实现,类包含说明和实现,说明部分被外界所看到,通过简单的外部接口与外界进行联系;实现部分不被外界所看到,在内部通过不同方法的构建,实现不同的功能。
    Java中具体实现就是使用 private 私有修饰符将类的成员变量隐藏起来,并定义成对的 Setter 和 Getter 方法让外界得以访问,封装可以被认为是一堵墙,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。封装的好处就是:适当的封装可以让代码更容易理解与维护,也加强了代码的安全性、复用性。

继承

    与C不同,Java没有多继承的特点,一个类只能直接继承一个父类。继承的特点就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。继承主要解决的问题就是共性提取
    @Override 重写方法注解,可以用来检测重写方法方法名和方法参数是否正确。

延伸知识点:
    父类的私有变量,子类也会继承。 但是因为private的影响,子类不能直接访问。但是可以通过定义构造方法再利用super关键字调用父类的构造方法,对其私有属性进行赋值。

    super、this关键字

    super关键字的用法:

  1. 在子类的成员方法中,访问父类的 成员变量
  2. 在子类的成员方法中,访问父类的 成员方法
  3. 在子类的构造方法中,访问父类的 构造方法

    子类构造方法中默认调用了super() 方法。如果父类定义了有参构造方法,默认的构造方法将不再提供,此时子类的构造方法就会报错。

    super 关键字用来访问父类内容,而 this 关键字用来访问本类内容。用法也有三种:

  1. 在本类的成员方法中,访问本类的成员变量。
  2. 在本类的成员方法中,访问本类的另一个成员方法。
  3. 在本类的构造方法中,访问本类的另一个构造方法。

super 与 this 关键字内存图解
    class文件先去方法区,继承关系的类进入方法区的时候,编译完之后 .class 文件中有一个特殊标记,它其实是一个指向,指向父亲,告诉父亲是谁,好比 extends关键字。
在这里插入图片描述
    一个子类对象包含一个完整的父类结构,先把父类内容构造好了,再在外围构造子类内容。里面是 父,外面是子,两层嵌套结构。这是为了遵守java底层设计模型的双亲委派机制,防止自己写的.java类与JDK的类冲突。
    在super 与 this 关键字的运用时,this 会去子类内容里去找,super会去父类内容里面去找 。子类调用 method 方法中有super.method() 所以会去父类内容找到方法地址。

继承的特点是:

  1. Java 语言是单继承的。 一个类的直接父类只能有唯一一个。
  2. Java 语言可以多级继承。我父亲还有父亲。
  3. 一个父类可以拥有很多个子类。可以有很多个兄弟姐妹。

多态

    多态是继封装、继承后,面向对象的第三大特征,顾名思义,多态就是有多个状态。也就是接口的多种不同实现方式。
    多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术。(就比如Collection的子接口是list、set、queue、map…以list举例,他的实现类是ArrayList和LinkedList,定义的时候都是父类的变量名,new出子类的对象。这就是多态的定义)父类的引用指向子类的对象。

    我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编译的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。
     多态又分为编译期多态运行期多态 。程序调用方法是在运行期才动态绑定的,那么引用变量所指向的具体实例对象在运行期才确定。所以这个对象的方法是运行期正在内存运行的这个对象的方法而不是引用变量的类型中定义的方法。。于是就有了一种多态的口语:编译看左边,运行看右边。 比如一个父类引用变量调用子类特有的方法那编译时候就会报错(因为在编译时 这是父类的对象)。如果子类也有这个方法,编译通过了,那么真正运行时会是右边真正在内存创建的对象的方法。

多态的好处:

  1. 无论右边 new 哪一个子类对象,等号左边引用调用方法都不会变化。
  2. 实现的接口的动态化,顶层定义接口,底层实现方法,提高代码的耦合性,符合依赖倒置原则
  3. 有更好的扩展性、更完美的体现出Java七大设计原则中的开闭原则里氏替换原则

向上与向下转型:
     与数据类型的相互转换基本一致,小范围到大范围可以自动转换,大类型到小类型要强转,强转就必不可少的出现了数据缺失现象(比如基本型变量的存储,系统会在栈中为他们分配出一块空空间,大小是他们定义的数据类型,比如int4位,long8位。00000000 8个0是一个bit,存储01这种二进制,所有小转大只是扩充了空间。但是大转小,会造成前面一部分bit的丢失,里面存储的01全部抹掉。)其实就是多态写法。

Animal animal = new Cat(); // 父类 对象名= new 子类名();

向上转型一定是安全的。

     向下转型: 格式: 子类名称 对象名 = (子类名称) 父类引用变量。将父类对象,还原成为本来的子类对象 (跟强转一样)向下转型时务必要加 instanceof 判定是否是原类对象

面向对象七大设计原则

开闭原则 对修改的关闭,对拓展的开放。
里氏替换原则 子类在任何时候都能替换父类。
依赖倒置原则 高层模块不应该依赖底层模块。
单一职责 类的职责必须单一,个类应该有且仅有一个引起它变化的原因。
接口隔离 为各个类建立具体的实现类,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用
迪米特原则 封装的思想,不跟陌生人说话。
聚合复用 它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

JDK-JRE-JVM Java跨平台的原因

  1. JVM :是Java 虚拟机。它只认识 xxx.class这种类型的文件,它能够识别 class 文件中的字节码指令并调用对应操作系统上的 API 完成动作。此外,jvm 是 Java 能够跨平台的核心。
  2. JRE :Java 运行时环境,为 Java 的运行提供了所需环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。如果你的电脑不是用来开发 Java 程序的,而仅仅是用来部署和运行 Java 程序的,那么只需要安装 jre 即可。
  3. DK:Java 开发工具包,提供了 Java 的开发环境和运行环境。jdk 是整个 Java 开发的核心,它不仅包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。
    在这里插入图片描述
    JDK>JRE>JVM

那java为什么能跨平台呢?
     Java 能够跨平台运行的核心在于 JVM 。不是 Java 能够跨平台,而是它的 jvm 能够跨平台。 而Java 引入了字节码的概念,JVM可以识别字节码,也只能识别字节码 并将它们解释到系统的 API 调用。针对不同的系统有不同的 jvm 实现,有 Linux 版本的 jvm 实现,也有 Windows 版本的 jvm 实现,但是同一段代码在编译后的字节码是一样的。在 Java API 层面,我们调用系统声音设备的代码是唯一的,和系统无关,编译生成的字节码也是唯一的。但是同一段字节码,在不同的 jvm 实现上会映射到不同系统的 API 调用,从而实现代码的不加修改即可在不同平台运行。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值