解疑1:抽象关键字为什么不能和 private、 static、 final 共存

①private 是私有的意思,当它修饰方法的时候子类是不能够继承父类私有方法的,但是 abstract 修饰的方法必须要被子类继承并且实现,所有两者冲突。 static 是静态的意思,所谓静态就是被共享,而当它修饰方法的时候就是静态方法,静态方法是不用创建对象就可以调用的,当在有继承关系的时候,abstract 修饰的是抽象,不可以被实例化,抽象方法必须由子类去实现,就又和 static 冲突了。 final 是最终的意思,也就是不能被继承或者重写,而 abstract修饰的方法必须要由子类重写,所以也是冲突的。所以 abstract 只能和 public 以及protected 一起使用。

②Static:

A)静态变量,被 static 修饰的变量类似一个全局变量( Java 中没有此概念)。当这个类被虚拟机第一次加载的时候,就会为该变量分配了内存空间。当该类创建实例时,并不会生成对 static 变量的拷贝。而是多个该类的实例共享使用该变量。所有该类的对象都可以操作这块存储空间。如果用 final 修饰就另当别论了。创建完成就需要进行初始化, 定义时可以直接初始化。 如果需要通过计算来初始化你的 static 变量,可以声明一个 static块, Static 块仅在该类被加载时执行一次,且在类被第一次装载时。
注意: static 定义的变量初始化会优先于任何其它非
static 变量,不论顺序如何。
在涉及到继承的时候,会先初始化父类的 static 变量,然后是子类的,依次类推。可以使用”类名.变量名“直接使用,并且被该类所有实例化对象共享。 可以被类中所有方法使用(
static与非 static)。 该类中某一个对象修改了变量的值,其他所有该类对象中的对应值都会随之改变。
定义时初始化,或者通过静态代码块初始化
B)静态方法,被 static 修饰的方法我们称之为类方法。可以死通过类直接调用该方法,而没必要创建该类的实例后调用该方法。
注意: 可以使用”类名.方法名“直接使用。 只能调用其他
Static 方法。 只能使用 static成员变量。 不能以任何形式引用 this 和 super
用途:静态方法常常为应用程序中的其它类提供一些实用工具,在 Java 的类库中大量的静态方法正是出于此目的而定义的。 Arrays 和 Collections
C) 静态类, 通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。
补充: static 表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态 static 代码块,但是 Java 语言中没有全局变量的概念。被 static 修饰的成员变量和成员方法独立于该类的任何对象。它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载, Java 虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此, static 对象可以在它的任何对象创建之前访问,
无需引用任何对象。
用 public 修饰的 static 成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成 static 变量的副本,而是类的所有实例共享同一个 static 变量。
static 变量前可以有 private 修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private
是访问权限限定,static 表示不要实例化就可以使用,这样就容易理解多了。 static 前面加上其它访问权限关键字的效果也以此类推。
static 修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为: 类名.静态方法名(参数列表...); 类名.静态变量名
。 用 static 修饰的代码块表示静态代码块,当 Java 虚拟机( JVM)加载类时,就会执行该代码块。
static 变量 : 按照是否静态的对类成员变量进行分类可分两种:一种是被 static 修饰的变量,叫静态变量或类变量;另一种是没有被 static 修饰的变量,叫实例变量。两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存), JVM 只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

static 方法: 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用 this 和 super 关键字,不能直接访问所属类的实例变量和实例方法 (就是不带static 的成员变量和成员成员方法

③final

特点: A) 用 final 修饰的变量表示常量,只能被赋一次值,不能修改。 final 修饰的基本类型变量:值不能被修改。 final 修饰的引用类型变量(对象):对象地址不能被修改,对象内部的成员可以被修改。 被定义为 final 的对象引用只能指向唯一一个对象,不可以将它再指向其他对象,但是一个对象内部的值却是可以改变的。被 final 修饰的变量是一个常量,必须被赋值后才能使用。可以在定义时赋值,也可在构造方法中赋值。(只要在构造方法结束前给赋值就可以。)
B) 用 final 修饰的方法不能被子类的方法覆盖;
C) 用 final 修饰的类不能被继承,没有子类。 final 类不能被继承,因此 final 类的成员方法没有机会被覆盖,默认都是 final 的。但是 final 类中的成员变量可以被定义为 final或非 final 形式。在设计类时,如果类不需要有子类,类的实现细节不允许改变,那么就设计为 final 类。
D) final 不能用来修饰构造方法。

④static 和 final: static、 final 用来修饰成员变量和成员方法。 对于变量,表示一旦给值就不可修改,并且通过类名可以访问。对于方法,表示不可覆盖,并且可以通过类名直接访问

解疑2:抽象类和接口的区别

A)抽象类:含有 abstract 修饰符的 class 即为抽象类, abstract 类不能创建的实例对象。含有 abstract 方法的类必须定义为 abstract class, abstract class 类中的方法不必是抽象的。 abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。

B)接口:可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。

C)区别:

  • 抽象类可以有构造方法,接口中不能有构造方法。
  • 抽象类中可以有普通成员变量,接口中没有普通成员变量
  • 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有
  • 非抽象的普通方法。
  • 抽象类中的抽象方法的访问类型可以是 public, protected,但接口中的抽象方法只能public 类型的,并且默认即为 public abstract 类型。
  • 抽象类中可以包含静态方法,接口中不能包含静态方法
  • 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是 public static final 类型,并且默认即为 public staticfinal 类型。
  • 一个类可以实现多个接口,但只能继承一个抽象类。

java基础解疑!!的更多相关文章

  1. java基础解疑!!!

    疑问一:0.01+0.09的结果? public class MathTest{ public static void main(String[]args){ double a = 0.01, b = ...

  2. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  3. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  4. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  5. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  6. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  7. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  8. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  9. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

随机推荐

  1. Python -- map, Lambda, filter and reduce

    map(func, seq)对seq中的每一个元素,调用func并返回结果.典型的应用是使用lambda函数. >>> def square(x): return x**2 > ...

  2. GC那些事儿--Android内存优化第一弹

    引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Andro ...

  3. Markdown 使用教程

    前言 以前经常在 github 中看到 .md 格式的文件,一直没有注意,也不明白为什么文本文档的后缀不是 .txt ,后来无意中看到了 Markdown,看到了用这个东西写得一些web界面等特别的规 ...

  4. Android RoboGuice开源框架、Butter Knife开源框架浅析

    Google Guice on Android(RoboGuice) 今天介绍一下Google的这个开源框架RoboGuice, 它的作用跟之前讲过的Dagger框架差点儿是一样的,仅仅是Dagger ...

  5. App开发准备

    一. Android开发 二. IOS开发 1. 准备苹果电脑 Mac pro 一般比较贵,很少人或公司使用 替代的产品为 iMac 或 Mac mini 中配8G内存版 2. 准备苹果开发者账户,才 ...

  6. Ehcarts 与 百度地图结合时,如何获取bmap的实例对象?

    ehcarts 与 百度地图结合时,百度地图的配置是以bmap属性来设置的.但却不知道如何获取bmap对象的实例? 毫无疑问,是包含在echarts实例中的. 传送门:https://blog.csd ...

  7. Android Activity全面解析

    Android Activity全面解析 首先,就从Android四大组件Activity开始. 1.Activity生命周期方法完全解析   activity_lifecycle.png 1).on ...

  8. Centos7源代码安装freeswitch和启动freeswitch

    centos7下安装freeswitch版本:1.6. 1.下载源代码: 进入目录 cd /usr/local/src 克隆原代码 git clone -b v1.6 https://freeswit ...

  9. js判断是否IE浏览器

    //ie? if (!!window.ActiveXObject || "ActiveXObject" in window){ //是 alert(1); }else{ //不是 ...

  10. activiti主要API对象

    ProcessEngine         //流程引擎 RuntimeService      //与流程实例,执行对象(正在执行) TaskService           //正在执行任务 H ...