Java基础总结!精华版!

1、Java起源

  • java Sun公司的,后期被甲骨文收购。
  • Java之父,詹姆斯高斯林, Java语言早起名字叫做:Oak,由C++演变而来;
  • Java 版本:jdk6 /7 最常用, 最新版本10;

2、Java三个平台:

  • JavaSE(标准版,用于桌面应用开发)
  • JavaEE(企业版,用于企业级应用开发)
  • JavaME(微缩版,用于早期嵌入式开发)

3、JavaAPI

4、Java语言的特性:

  • 面向对象、可移植性(一处编译,多处执行)
  • 跨平台性、
  • 安全性(1、摒弃指针 2、GC垃圾回收机制:自动释放回收长时间不使用对象的内存)
  • 并发性(支持多线程)

5、JDK &JRE

  • JDK(Java Development Kit Java开发工具包),JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)、执行工具(java.exe)等

  • JRE(Java Runtime Environment Java运行环境) ,包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

6、配置环境变量(在任何位置都可以找到java环境)

  • 最简单配置方式:
    • 系统环境变量:PATH:C:\Program Files\Java\jdk1.7.0_13\bin; 后面保留
    • CLASSPATH:C:\Program Files\Java\jdk1.7.0_13\lib;.后面保留
  • 或者:

    • PATH: %JAVA_HOME%\bin;
    • CLASSPATH:%JAVA_HOME%\lib;.

      也可以设置JAVA_HOME
      JAVA_HOME :C:\Program Files\Java\jdk1.7.0_13

    验证是否配置成功: 进入命令行窗口, 执行java -version,成功显示版本号即成功配置

7、开发工具:

  • Eclipse
  • MyEclipse
  • IntelliJ IDEA

8、Java程序的执行过程

  • java源文件,编译器(javac命令)进行编译
  • 生成class文件(存放的字节码)
  • 然后解析器(执行java命令)解析class文件
  • 最后生成计算机识别的二进制编码

9、Java有两种数据类型:

  • 1、引用数据类型:数组、类、接口。
  • 2、基本数据类型:
    • 整型:byte、short、int、long (8位1个字节、16/2 、32/4、64/8)
    • 浮点型:float、double(32/4 、64/8)
    • 字符型:char(16/2)
    • 布尔类型:boolean
  • 级别从低到高为: byte,char,short(这三个平级)–>int–>float–>long–>double
  • 自动类型转换:从低级别到高级别,系统自动转的;
  • 强制类型转换:什么情况下使用?把一个高级别的数赋给一个别该数的级别低的变量;

    Java中默认整数为int类型, 小数为double类型;
    字符char是否可以存放一个汉字?可以,因为一个字符占2个字节,一个汉字两个字节;
    整型初始值默认0 浮点型默认0.0 布尔类型默认false 引用数据类型默认null

10、java中是否有goto? 有,是保留字

11、标识符命名规则:

  • 可以由数字、字母、下划线、$符号组成,但是不能是关键词,不能以数字开头
  • 全局变量(成员变量、类变量)
    • 可以供当前类的多个方法使用;
    • 定义在类中;
    • 成员变量存在于堆内存中,随着对象的产生而存在,消失而消失。
  • 局部变量
    • 定义在方法中或者方法参数
    • 只能作用于当前方法
    • 没有初始值
    • 局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。
  • 常量: 只能声明在类中,使用final关键词声明,必须赋初始值,不能再次赋值;

12、Java中数据类型转换:

  • 隐式转换:系统默认将其转换为我们需要的数据类型;
  • 强制转换:=号两边数据类型不同时,可以通过,前面加(类型)转换

    • 例如:int j=10;float f=100.123; int j=(int)f;
  • 基本数据类型之间规则:

    • (1)整型之间数据类型强制转换规则:long->int->short->byte
    • (2)浮点型之间:double->float
    • (3)char和整型 : 整型->char
    • (4)char和浮点型: 浮点型->char
    • (5)浮点型和整型 : (double/float)->(long/int/short/byte) 且小数点舍去

13、运算符:

  • +
  • -
  • *
  • /
  • %
    • 任何整数模2不是0就是1,所以只要改变被模数就可以实现开关运算。
  • 位运算符:用于操作二进制位的运算符。
    • & | ^ << >> >>>(无符号右移)
  • 注意:

    • (1)+号拼字符串:”字符串”+数字+数字 和“字符串”+(数字+数字)
    • (2)分母不可以为0 否则报异常:ArithmeticException
    • (3)java中数值运算时,位数多的与位数少的,做运算,最终结果类型为位数多的(long+double 返回double int/long+float ) 整型和浮点型运算,此时返回浮点型
    • (4) j a v a 1 / 2 0 2 2 << 2 ;
  • i++ 表示i先参与运算,然后在自身加1

  • ++i 表示i先自身加1 然后在被使用
  • 类似的 - -

    ! 下面程序是否有错?
    short i=10;
    i=i+1;(错误,因为需要强转 short+int结果还是int类型)
    i+=1;(正确)

  • 逻辑运算符(也叫作短路运算符):

  • 逻辑运算符:

    • ||
      • 或,两边条件有一个满足true,则结果为true
    • &&

      • 与,也叫作短路运算符, &&两边条件必须返回boolean类型,两边同时为true则结果为true

      例如:

      int n=10;
      int m=100;
      boolean f_2=(n>m)&&((n=100000)<100); 
      System.out.println(n);//n的值还是10
      boolean f_3=(m>n)||((n=100000)<100); //n的值还是10

14、判断语句&循环语句break&continue

  • 判断语句

  • 循环语句

    • for(第一步执行;条件(第二步判断条件);第四步其他操作,之后在判断条件){第三步执行循环体}
    • while(){}
    • do{}while()
  • break 表示退出整个循环或者判断
  • continue 只能用于循环体中,表示退出当前循环,继续下一次循环

15、Java的核心包:即java.lang包

16、包装类:即基本数据类型所对应的类;

  • int/double/float/byte/long/char/boolean 是一种值表示;
  • Integer/Double/Float/Byte/Long/Character/Boolean 包装类

  • 常用方法:

    • valueOf(“”)
    • valueOf(int i)
    • toString()
    • parseInt(“”);
    • ! NumberFormatException

17、==比较和equals比较

  • ==比较即比较内容也比较地址是否相同;
  • equals方法,比较两个对象内容是否相同

    注意:

    • (1)字符串比较,不允许用== ,只能通过equals方法
    • (2)如果Integer和Integer/int比较具体是否相等,此时绝对不允许使用==

      • 补充:127 128 问题:
        Integer a = 127;
        Integer b = 127;
        System.out.println(a==b);true
        //超一个字节会重新分配空间
        Integer c = 128;
        Integer d = 128;
        System.out.println(c==d);false
    • (3)注意:数字,和字符串比较是否相等;

      String str="10";
      Integer m=10;
      
      System.out.println(m.equals(str));//false
      System.out.println(m.toString().equals(str));//true

      更多详情点击查看第10点!

18、数组:

  • 先定义、开辟空间、赋值在使用
  • java中数组长度不可变
  • 数组下标从0开始
    数组的定义:

    • (1) String[] items_0=null;//先定义 items_0=new String[4];//开辟空间
    • (2)String[] items_1=new String[4];
    • (3)String[] items_2={"JONES","SMITH","XIAOMING","SMI"};
    • (4) String[] items_3=new String[]{"SMITH","JINES","DSFDSF"};

      int a=10;
      int b=20;
      a=a+b;//a:30 b:20
      b=a-b;//a:30 b:10
      a=a-b;//a:20 b:10
  • 二维数组:

    String[][] items=new String[2][3];
    //items[0]={"","",""};错误的
    // items[0]=new String[4];对

19、类:是一类事物的描述,程序中为class;

  • 属性:即一类事物具有的共有特点或者特性;程序中为全局变量(成员变量)
  • 方法:一类事物具有的动作;
  • 类的定义和使用

    • class 类名称{
      属性
      方法
      }
    • 使用关键字new就可以创建类对象,使用对象.方法,对象.属性就可完成调用

      • 1:先将硬盘上指定位置的Person.class文件加载进内存。
      • 2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
      • 3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
      • 4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
      • 5:对空间中的属性进行显示初始化。
      • 6:进行实体的构造代码块初始化。
      • 7:调用该实体对应的构造方法,进行构造方法初始化。()
      • 8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
  • 抽象类: abstract

    • 抽象类的特点:
      • 1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
      • 2:抽象方法只定义方法声明,并不定义方法实现。
      • 3:抽象类不可以被创建对象(实例化)。
      • 4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。
    • 抽象类的细节:
      • 1:抽象类中是否有构造方法?有,用于给子类对象进行初始化。
      • 2:抽象类中是否可以定义非抽象方法?可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象方法。而且比一般类少了一个创建对象的部分。
      • 3:抽象关键字abstract和哪些不可以共存?final ,private , static
      • 4:抽象类中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。
  • 面向对象:即分析某一个事件中有哪些对象,分析他们的动作,具有的属性特点,通过这种方式来解决问题;
  • 面向过程: 侧重点在于步骤,通过一步一步调用方法来实现操作

面向对象的问题详情请点击查看第11点!

  • 对象实例化: new 类(),即对象的创建;

20、static

  • static 声明方法为静态方法,声明属性为静态属性;
  • static 关键词:
    • 1、static 修饰方法,该方法叫做静态方法(也叫做类方法),可直接通过这个类的类名打点直接调用;
    • 2、静态方法中不能使用this/super关键词,静态方法不能直接调用当前类中的非静态方法(或非静态属性),必须通过new实例化后在调用。
    • 3、static声明的方法和属性,该对象已经被实例化,且只能被实例化一次(单例模式)
    • 4、static修饰的属性,被相同类的不同实例所共享;

21、this

  • 不能用于static声明的方法中, 常用于区分全局变量和局部变量同名

22、super

  • (1)使用super关键字, s u p e r 只能用在子类中
  • (2)可在子类构造方法中调用且必须是该方法中第一句
  • (3)不能使用在static修饰的方法中
  • (4)super的用处
    • 访问父类构造方法
      • super();
      • super(name);
    • 访问父类属性
      • super.name;
    • 访问父类方法
      • super.print();

23、访问修饰符:

这里写图片描述

24、面向对象三个过程:

  • OOA面向对象分析
  • OOD面向对象设计
  • OOP面向对象编程

25、面向对象三个特性(属性)

  • 继承
    • 继承就是类之间的继承,使用extends来实现,从而实现代码的复用
  • 多态
    • 某一种事物有不同的具体的体现就是多态
    • 多态体现在:重写、重载、对象实例化。
    • 多态的好处:提高了程序的扩展性。
    • 多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
  • 封装
    • 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
    • 好处:将变化隔离;便于使用;提高重用性;安全性。
    • 封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

26、构造方法

  • 该方法与类名相同;没有返回值也不可以使用void 声明
  • 默认public修饰
  • 任何一个类,都有一个无参数的构造方法; 对象实例化时被执行
  • 构造方法和普通方法的区别
    • 构造方法是在对象创建时,就被调用,构造方法常用于初始化成员变量,而且初始化动作只执行一次。
    • 一般方法,是对象创建后,需要调用才执行,可以被调用多次。

27、 程序的执行过程

  • 单一类中:

    • 1.初始化块2. 静态初始化块3.构造方法
    • 执行顺序:静态初始化块(永远只被执行一次) 初始化块 构造方法
  • 父类和子类中都有静态代码块,非静态代码块,构造方法时。

    • 初始化子类对象时,调用顺序:父类静态,子类静态,父类非静态,父类构造,子类非静态,子类构造

28、方法重载:overload

  • 当前类中方法名相同,参数个数或者参数类型不同;
  • 为什么重载,重载有什么好处?
    • 了解:好处便于记忆筛选,体现了java的多态

29、方法重写:override

  • 发生在子类中,子类的方法与父类方法名、参数个数、参数类型,返回值类型完全相同,并且访问权限不能严于父类
  • 什么时候使用重写?
    • 1、当父类方法无法满足子类需求,此时可以在子类中重写父类方法
    • 2、如果开发时,需要对父类方法功能拓展,此时还不想修改父类程序
      则使用继承(定义一个类继承父类),然后通过子类重写该方法,
      然后其他类进行调用这个子类方法;

30、继承:

  • 子类继承父类,可以继承父类中非私有的方法和属性
  • 构造方法无法被继承;
  • final修饰的类无法被继承;
  • Java中是单继承,所有类的超类(父类/基类)是java.lang.Object类

  • 子类被实例化时,先实例化父类对象

    • java中是单继承,即一个类只能有一个父类;所有类的父类(超类)是java.lang.Object

      • 继承的好处:

        • 1、简化子类代码
        • 2、使用继承可以不修改父类程序前提,完成对父类方法的拓展
      • 缺点:

        • 1、打破了封装(封装的目的是隐藏),父类向子类暴露了细节
        • 2、过多的继承,会导致程序不便于维护
        • 3、白盒重用,因为基类的内部细节通常对子类是可见的

31、所有类的父类Object类

  • Object位于java.lang包下面
  • 其中常用的方法有:
    • toString(); 返回当前对象本身的有关信息,按字符串对象返回
    • equals(); 比较两个对象是否是同一个对象,是则返回true
    • hashCode(); 返回该对象的哈希代码值
    • getClass(); 获取当前对象所属的类信息,返回Class对象
  • equals方法的重写:
    • 什么时候重写equals方法?
      • 比较两个对象时候,需要重写equals方法,重新定义比较规则
  • toString方法重写:
    • 重写toString方法的目的是:让对象以某个字符串形式表示

32、主方法的分析

  • public static void main(String[] args){}
  • 1)保证该类的独立运行。

  • 2)因为它是程序的入口。

  • 3)因为它在被jvm调用。

    • Public:访问权限最大。

    • static:不需要对象,直接类名即可。

    • void:主方法没有返回值。

    • main:主方法特定的名称。

    • (String[] args):主方法的参数,是一个字符串数组类型的参数,jvm调用main方法时,传递的实际参数是 new String[0]。

    注意:主方法的存在,仅为该类是否需要独立运行,如果不需要,主方法是不用定义的。

33、Java内存的总结

  • java分了5片内存

    • 1:寄存器。
    • 2:本地方法区。
    • 3:方法区。
    • 4:栈。
    • 5:堆。
  • 栈:存储的都是局部变量 ( 方法中定义的变量,方法上的参数,语句中的变量 );只要数据运算完成所在的区域结束,该数据就会被释放。

  • 堆:用于存储数组和对象,也就是实体。啥是实体啊?就是用于封装多个数据的。

    • 1:每一个实体都有内存首地址值
    • 2:堆内存中的变量都有默认初始化值。因为数据类型不同,值也不一样。
    • 3:垃圾回收机制。

34、自动装箱,自动拆箱

  • Java有8种基本类型,每种基本类型又有对应的包装类型。在Java中,一切都以对象作为基础,但是基本类型并不是对象,如果想以对象的方式使用这8中基本类型,可以将它们转换为对应的包装类型。基本类型和包装类型的对应
    这里写图片描述
  • 可以直接将整型赋给Integer对象,由编译器来完成从int型到Integer类型的转换,这就叫自动装箱。
  • 与此对应的,自动拆箱就是可以将包装类型转换为基本类型,具体的转换工作由编译器来完成。
  • 其他几种基本类型的转换也是类似的

猜你喜欢

转载自blog.csdn.net/Song_JiangTao/article/details/80642188