欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java

程序员文章站 2022-06-19 13:54:26
...

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) 整型和浮点型运算,此时返回浮点型
    • (4)java1/2022<<2;java中1/2值为多少?02的三次幂如何计算?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
      • 1
      • 2
      • 3
      • 4
      • 5

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
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
    • (3)注意:数字,和字符串比较是否相等;

      String str="10";
      Integer m=10;
      
      System.out.println(m.equals(str));//false
      System.out.println(m.toString().equals(str));//true
      • 1
      • 2
      • 3
      • 4
      • 5

      更多详情点击查看第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
      • 1
      • 2
      • 3
      • 4
      • 5
  • 二维数组:

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

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:抽象类中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。
  • 接口:interface 
    • 接口的特点: 
      • 1、接口interface**是特殊抽象类**,所有方法都是抽象方法
      • 2、不能被实例化,方法abstract关键词可以省略,但实际上还是抽象方法
      • 3、变量都是是常量,省略final关键词;
      • 4、接口不能被实例化,只能通过implements来实现接口,一个实现类,可以实现多个接口
      • 5、接口可以继承接口。
      • 6、实现以后要重写所有抽象方法,包括接口继承接口中的抽象方法
    • 接口的好处: 
      • 1、java由于单继承,接口可以弥补无法多继承的缺点
      • 2、好的程序要求高内聚低耦合,接口可以实现程序的解耦
      • 3、定义一种规范
  • 抽象类和接口的区别(4点):

    • 抽象类只能被继承,而且只能单继承。
    • 接口需要被实现,而且可以多实现。 

    • 抽象类中可以定义非抽象方法,子类可以直接继承使用。
    • 接口中都有抽象方法,需要子类去实现。 

    • 抽象类使用的是 is a 关系。
    • 接口使用的 like a 关系。 

    • 抽象类的成员修饰符可以自定义。
    • 接口中的成员修饰符是固定的。全都是public的。
  • 面向对象:即分析某一个事件中有哪些对象,分析他们的动作,具有的属性特点,通过这种方式来解决问题;

  • 面向过程: 侧重点在于步骤,通过一步一步调用方法来实现操作

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

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

20、static

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

21、this

  • 表示当前类对象,不能用于static声明的方法中, 常用于区分全局变量和局部变量同名

22、super

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

23、访问修饰符:

java

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中基本类型,可以将它们转换为对应的包装类型。基本类型和包装类型的对应 
    java
  • 可以直接将整型赋给Integer对象,由编译器来完成从int型到Integer类型的转换,这就叫自动装箱。
  • 与此对应的,自动拆箱就是可以将包装类型转换为基本类型,具体的转换工作由编译器来完成。
  • 其他几种基本类型的转换也是类似的