Java语言基础

1.java概述

(1)简介

 Java是一种高级计算机语言,它是由SUN公司(现已被Oracle公司收购)于1995年5月推出的一种可以编写跨平台应用软件、完全面向对象的程序设计语言。

1995年5月23日 ,在 Oak 更名为 Java 后,Java 在 Sun world 会议上正式诞生

2009年,甲骨文(Oracle)公司宣布收购 Sun(Stanford University Network Microsystems)公司

2010年,Java编程语言的共同创始人之一詹姆斯·高斯林(Java之父)从Oracle公司辞职。

针对不同的开发市场,SUN公司将Java划分为三个技术平台,它们分别是JavaSEJavaEEJavaME

1. Java SE(Java Platform Standard Edition)标准版

他是三个平台中最核心的部分,其他两个都是在他的基础上开发出来的,JavaSE平台中包括了Java最核心的类库,如集合、IO、数据库连接以及网络编程等。

2.Java EE(Java Platform Enterprise Edition) 企业版

Java EE可以被看作一个技术平台,该平台用于开发、装配以及部署企业级应用程序,主要包括Servlet、JSP、JavaBean、JDBC、EJB、Web Service等技术。

3.Java ME(Java Platform Micro Edition) 小型版

JavaME主要用于小型数字电子设备上软件程序的开发。 Java ME还提供了HTTP等高级Internet协议,使移动电话能以Client/Server方式直接访问Internet的全部信息,提供高效率的无线交

(2)java语言的特点 

 1.简单性:Java语言是一种相对简单的编程语言,它通过提供最基本的方法完成指定的任务。 丢弃了C++中很难理解的运算符重载、多重继承等概念;特别是J Java语言使用引用代替指针,并提供了自动的垃圾回收机制,使程序员不必担忧内存管理

 2.面向对象:Java语言提供了类、接口和继承等原语,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。

3.安全性:Java的存储分配模型可以防御恶意代码攻击;Java没有指针,因此外界不能通过伪造指针指向存储器;Java编译器在编译程序时,不显示存储安排决策,程序员不能通过查看声明猜测出类的实际存储安排;Java程序中的存储是在运行时由Java解释程序决定。

4.跨平台性:Java通过JVM(虚拟机)以及字节码实现跨平台。Java程序由javac编译器编译成为字节码文件(.class)文件, JVM中的Java解释器会将.class文件翻译成所在平台上的机器码文件,执行对应的机器码文件就可以了。

5.支持多线程:Java语言支持多线程。 所谓多线程可以简单理解为程序中多个任务可以并发执行,多线程可以在很大程度上提高程序的执行效率。

6.分布式: Java是分布式语言,既支持各种层次的网络连接,又可以通过Socket类支持可靠的流(stream)网络连接。用户可以产生分布式的客户机和服务器,在这个过程中,网络变成软件应用的分布式运载工具。

 2.开发环境搭建(重点)

 (1)开发环境介绍(JDK)

做java开发,是需要特定环境的,我们称之为java开发环境

JDK,全称Java Development Kit(Java开发工具包),就是java的开发环境。

JDK 由两大部分组成,分别为 开发工具运行环境

1.开发工具

1. javac – 编译器,将源程序转成字节码  (即将 .java文件翻译成.class文件)               
2. jar – 打包工具,将相关的类文件打包成一个文件
3. javadoc – 文档生成器,从源码注释中提取文档
4. jdb – debugger,查错工具
5. java – 运行编译后的java程序(.class后缀的) (即将.class文件翻译成所在平台上的机器码文件)
6. Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。

2.运行环境JRE(重点)

 即Java Runtime Environment,简称JRE。即,程序员编写的java程序运行和测试所需要的环境,包含JVM系统类库

1.JVM
  • 是java virtual michine的简写,一个可以模拟计算机能力的程序。
  • Java程序在编译(通过javac编译器编译)之后会生成.class字节码文件,这个文件会被加载到JVM虚拟机中运行。

  • 是Java跨平台的最重要的部分。

 2.系统类库

在开发程序时,系统提供给我们的资源(类)库(java.lang,java.math,java.util,java.sql,java.text等

3.JDK 、JRE、JVM三者之间的关系

4.JDK目录介绍

  •  bin目录:该目录用于存放一些可执行程序,如javac.exe(Java编译器)、java.exe(Java运行工具)、jar.exe(打包工具)和javadoc.exe(文档生成工具)等。

                  javac:编译器,将源程序转成字节码(即将.java文件编译成.class文件)

                  java:打包工具,将相关的类文件打包成一个文件(将.class文件转成所在平台的机器码文件)

                  javadoc:文档生成器,从源码注释中提取文档

  • include目录:存放C++的头文件。
  • jre目录:此目录是Java运行时环境的根目录,它包含Java虚拟机,运行时的类包、Java应用启动器以及一个bin目录,但不包含开发环境中的开发工具。
  • legal目录:通常包含了一些法律相关的文档和许可证文件。
  • lib目录:lib是library的缩写,意为Java类库或库文件,是开发工具使用的归档包文件。

 3.标识符

 (1)标识符的命名规则

标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。

  • 可以由字母,数字,_和$,这四种的任意多个组成,但是数字不能开头

  • 大小写字母敏感,需要特别注意(严格区分大小写)

  • 可以使用汉字,但是不建议使用

  • 不能使用关键字,如int,for,if等

  • 尽量做到见名知意,多个单词时需要符合驼峰命名法

 4.命名约定

1)类和接口名:每个单词的首字母都要大写,其他字符小写。(即大驼峰命名法)

2)方法名:首字符小写,其余单词的首字母大写,尽量少用下划线。(小驼峰命名法)

3)常量名:全部大写字母,单词与单词之间用下划线分隔。

4)变量名:首字符小写,其余单词的首字母大写。不用下划线,少用美元符号。给变量命名是尽量做到见名知义。(小驼峰命名法)

5.java最基础的语法结构 

public class MyFirstProgramer{
      //main方法  作用:程序的入口,即jvm会最先执行main方法
      public static void main(String[] args){
          System.out.println("helllo world");
	  }
}		

修饰词      关键字   标识符类名:大驼峰命名法
        public      class     className{     
        }    

 编写完后执行程序:

           1.编译: 就是将java源文件使用javac编译器翻译成class文件(字节码文件)
                        javac   源文件名称(带上扩展名)(如上述的:javac   MyFirstProgramer.java)
            2.运行:  就是使用java指令启动jvm,让jvm加载class文件并执行里面的main方法
                          java     源文件名称(不带扩展名)(java    MyFirstProgramer)

 6.变量

1.概念

 jvm在其管理的内存中会开辟很多个空间、这些空间用来存储数据,而这些存储空间里的数据也会根据我们不同时间的不同需求而变化,那么,这样的存储空间,我们需要给他们命名,我们可以通过这些名字来操纵(使用)这些存储空间。 这些名字就是我们所说的变量。

2.变量必须先声明和初始化 

  • 声明的含义:因java是强类型语言,因此在定义变量名时,必须先声明该变量的所属类型,强调该变量要存储的数据类型

    语法: 数据类型名 变量名(小驼峰命名法);(需要英文输入的分号做结束)

  • 初始化含义:存储空间第一次存储数据。

    语法: 变量名 = 初始化值。

  • 初始化时机:

    1) 使用前进行初始化: int a; a = 3; ​

    2) 声明类型时直接初始化:int a = 3;

  • 只进行了声明,没有初始化就直接打印变量时会出现编译错误的。

    public class MyFirstProgramer{
          public static void main(String[] args){
              int   num;
              Sysytem.out.println(num);//编译出错
    	  }
    }		
  • 变量在重复赋值时,后一次赋的值会覆盖掉上一次赋的值的。

public class MyFirstProgramer{
      public static void main(String[] args){
            int a = 10;
		    a = 5;//将5存入a变量里,原有的10被5覆盖掉了。
		    a = 50;//将5存入a变量里,原有的5被50覆盖掉了。
		    a = a + 6;//使用a里的50与6做加法计算,结果56再次存入a中,把之前的50覆盖掉。
            System.out.println(a);
	  }
}		

3.变量的操作必须与类型匹配

就是在声明和初始化时,初始化时的数据必须和声明的数据类型一致

public class MyFirstProgramer{
      public static void main(String[] args){
            int a = 10;
		    a = 10.2;
            System.out.println(a);//编译出错
	  }
}		

4. 变量的作用域

变量是有自己的作用域。即变量有自己的使用范围
            1)作用域:从开始声明处开始,一直到它所在的花括号的结束符号位置。
            2)该作用域内,变量不能重复声明(定义),出了作用域,需要重新定义(声明)

public class Draft{
      public static void main(String[] args){
        int a = 10 ;
		if (a > 50){
			int b = a*2;
		}else{
			int c = a-10;
			//long a = 100;//a这个变量已经在改作用域中存在,因此不能重复定义。
		}
		long c = 1000;//该处的c变量是重新定义的,该作用域没有重复的c变量。因此可以使用。
		System.out.println(a);
		System.out.println(b);//b这个变量已经出了它自己的作用域,编译出错
		System.out.println(c);	
	  }
}		

5.变量的分类

变量的分类:
     1.按照位置分类
          -成员变量: 在方法外,类体里定义的变量
          -局部变量:在方法里定义的变量
     2.按照类型分类
        -基本数据类型(原始数据类型)(8种)
        -引用数据类型(包括数组)

7.数据类型 

 基本数据类型的归类:

(1)整数类型 

 类型名称                  占用存储空间                        数值范围

    byte                        1字节(8位)                      (-128~127)

    short                       2字节(16位)                  (-32768~32767)

      int                          4字节(32位)                 (-2147843648~2147483647)

    long                         8字节(64位)                      -2^63^ ~ 2^63^-1

1. 赋值时,不能超出各自的范围,否则编译不通过。

2.整数字面量,也叫整数直接量(literal),就是直接写出来的整数,是int类型。

3.int字面量,只要没有超出byte或者short的范围,是可以直接赋值给byte或short类型的变量的 (自动截断高位的0或1)

4.int字面量,可以直接给long类型的变量赋值。 (自动补全高位的32个0或1)

5.long字面量,需要在整数后面添加小写或者大写的L。

public class TypeDemo01{
	public static void main(String[] args){
		byte  b1=10;
		//byte  b2=128;//编译出错。byte的最大值127.
		int n1=2147483647;//int的最大值2147483647
		//int n2=2147483648;//编译出错。int的最大值2147483647.
		
		
		short s1=10;//10是int类型,因为没有超出short的范围,因此可以直接赋值给short。
		long  lo1=1000;//1000是字面值,是int类型,因为没有超出long的范围,因此可以直接赋值给long。
		long  lo2=10L;//10L是long类型,直接就是64位的二进制数
		System.out.println(b1);
		System.out.println(n1);
		System.out.println(s1);
		System.out.println(lo1);
		System.out.println(lo2);
		//long lo3 = 2200001111;//编译出错,因为字面量就是int类型,因此不可以超出int类型的范围。
		long lo4 = 2200001111L;
		//System.out.println(lo3);
		
		
	}
}

 (2)浮点类型(浮点数的字面量默认是double类型。)

 类型名称                  占用存储空间                        数值范围

    float                        4字节(32位)                单精度类型,能精确表示到小数点后6~7位
                                                                         能表示的整数部分的范围是38位

   double                      8字节(64位)                双精度类型    能精确表示到小数点后15~16位
                                                                          能表示的整数部分的范围是308位

 1.-浮点数的字面量默认是double类型。    

如果想要float字面量,需要添加F或f。 -浮点数字面量后面也可以添加D/d,也可以省略。

public class Draft{
      public static void main(String[] args){
        float f1 = 3.14;//字面量是double类型的,在后面加上F或者f,就变成float的字面量。
		System.out.println(f1);
	  }
}	

 

2.赋值时,小数点后面的位数过多时,打印出来的结果不是原原来的值。

public class Draft{
      public static void main(String[] args){
        float  f10=0.123456789f;//将小数存入float类型的变量空间f10里面
		double  d10=0.1234567890123456789;//将小数存入double类型的变量空间d10里面
		System.out.println(f10);//取出来的值,发现不是原来的值
		System.out.println(d10);//取出来的值,发现不是原来的值
	  }
}		

3. 在计算时会出现误差

二进制系统中无法精确的表示1/10,就好像十进制系统中无法精确表示1/3一样。

public class Draft{
      public static void main(String[] args){
        double  d101=3.0;
		double  d102=2.9;
		System.out.println(d101-d102);//计算时有误差,并不精确。
	  }
}		

 (3)字符类型

 类型名称      占用内存大小         范围

    char           2字节(16位)   书面上所有的字符(如:‘中’,’a’,‘A’,‘0’,‘^’)

char类型用来表示字符。字符字面量必须用单引号(‘ ’)括起来,且只有一个字符,涵盖世界上所有书面语的字符。

1.转义字符‘\’

对于不方便输出的字符,采用转义字符来表示,例如:

\n     :  表示回车符号     \t:表示空格    \r :表示换行符       \\: 表示反斜杠    \':表示单引号

2.字符集

char也是一个16位无符号整数,整数范围为0~65535。每个整数都是对应字符的编码。

java字符类型采用了Unicode字符集编码。Unicode是世界通用的定长字符集,所有的字符都是16位。  

常见的赋值方式:

  • 可以赋值字符,使用单引号,能且只能是一个字符

  • 可以赋值十进制整数,范围为0~65535。

 注意:因为char可以表示0~65535这个范围内的整数(无符号整数),
        因此也可以参与运算。    

public class Draft{
      public static void main(String[] args){
        char  c21='a';
		char   c22=(char)(c21+7);
		/*将取出c21里面的数据与7做加法运算,运算时字符对应的数字97
		参与运算。结果104是int类型的,存入char类型的变量里时,需要进行强转,
		如果打印,应该是104对应的字符h
		
		*/
		System.out.println(c22);
	  }
}		

 (4)布尔类型

  类型名称      占用内存大小         值

 boolean          1字节(8位)    true/flase

boolean 类型适于逻辑运算,表示某个条件是否成立。一般用于程序流程控制:

  • 分支控制结构语句

  • 循环控制结构语句

boolean类型数据只允许取值true和false,true表示条件成立,false表示条件不成立。

boolean类型变量经常用于存储关系运算的结果,所谓关系运算就是比较两个变量的大小相等等关系。

public class Draft{
      public static void main(String[] args){
        boolean f1 = true;
		boolean f2 = false;
		System.out.println(f1);
		System.out.println(f2);
		boolean  f3 = 1<2;
		System.out.println(f3);
	  }
}		

 (5)字符串类型(String)

字符串类型的名字String,是最常用的引用类型。

 赋值的特点是,使用双引号引起来,双引号里可以有0个以上的任意多个字符

字符串可以做拼接,用+号无缝拼接

public class Draft{
      public static void main(String[] args){
        System.out.println("---字符串的拼接---");
		String s1="中";
		String s2= "国";
		String s3 = s1 + s2;//"中国"
		System.out.println(s3);
		String s4 = s3 + "是最棒的";//"中国是最棒的"
		System.out.println("s4的值:"+s4);
	  }
}	

  注意:+号前后只要有一个是字符串,做的就是拼接操作,
              结果是字符串类型

public class Draft{
      public static void main(String[] args){
        System.out.println("---字符串的拼接---");
		String r1 = 1 + 1 + "2" + 3 + 4;
		System.out.println("r1的结果是:"+r1);//结果是2234
		
		String r2 = 1 + 2 + "3" + (5 + 4)+5*6;
		System.out.println("r2的结果是:"+r2);//结果是33930
	  }
}		

 8.类型转换

在数据类型转换中,分为两种转型:自动类型转换 和 强制类型转换

1.自动类型转换(隐式类型转化)

其实,就是一个直接的赋值操作,不需要进行任何额外的操作。常见于取值范围小的数据类型转换为取值范围大的数据类型。例如: byte(8位)转型为int(32位)。

int类型的字面量,如果没有超出byte,short,char的范围时,是可以直接给这些类型的变量进行赋值。因为底层会自动将前面的0或1截断。

 取值范围从小到大排序
        byte-->short(char)-->int-->long-->float-->double

public class Draft{
      public static void main(String[] args){
        byte b1 = 10;
		//b1变量里存入的是8位二进制的10,存入s1时,自动变成16位二进制的10
		short  s1 = b1;
		System.out.println(s1);
		//b1变量里存入的是16位二进制的10,存入s1时,自动变成32位二进制的10
		int n1 = s1;
		System.out.println(n1);
		//32位的int变成了64位的long
		long n2 = n1;
		System.out.println(n2);
		double  d1 = n2;//long类型的10转成double类型的10.0
		System.out.println(d1);
	  }
}		

 2.强制类型转换

 取值范围大的数据类型向取值范围小的数据类型转型。
       注意:转换过程中,有可能发生精度损失或者溢出。
       
       语法: 小范围类型名   变量 = (小范围类型) 大范围变量;

public class Draft{
      public static void main(String[] args){
        System.out.println("---强制类型转换---");
		double  d10 = 3.14;
		long n10 = (long)d10;//强制转换,精度损失。转成3.
		System.out.println(n10);
		
		int  n12 = 32767;
		short s11 = (short)n12;
		//编译期间,编译器的工作就是只做语法检查,不考虑变量的值
		System.out.println("-short类型的s11的值:"+s11);
		
		int n13 = 32768; 
		short s12 = (short)n13;//发生了溢出(值改变了)转成-32768.//1000 0000 0000 0000
		System.out.println("-short类型的s12的值:"+s12);
		
		byte b11 = (byte)s12;//
		System.out.println("b11的值:"+b11);
		
		//注意:int类型的字面量,如果没有超出byte,short,char的范围时,
		//是可以直接给这些类型的变量进行赋值。因为底层会自动将前面的0或1截断。
		short  b = 25;
		System.out.println(b);
		
		byte  b101=(byte)128;//超范围了,需要强制转换。
		System.out.println(b101);
	  }
}		

 9.常用运算符

(1)算术运算符(+    -    *    /   %   ++   --)

1.当有多种类型的数据混合运算时,系统首先自动将所有数据转换成其中取值范围最大的那种数据类型,然后再进行计算,结果的类型就是取值范围最大的类型。

2.byte,short,char之间不会相互转换,在做运算时,会优先转成int类型做运算。

 加法运算(+)

public class SymbolDemo01{
	public static void main(String[] args){
		byte b1 = 10;
		byte b2 = 20;
		int b3 = b1+b2;//b1 和 b2 都转成int,然后在做运算。
		byte b4 = (byte)b3;//计算结果是int类型,将结果进行强转。
		System.out.println(b4);
    }
}

  3.运算时,有可能是溢出运算。(封闭式运算)(最大值+1,就变成最小值
          最小值-1,就变成最大值)

 乘法运算(*)

public class Draft{
      public static void main(String[] args){
        byte num1 = 2;
		byte num2 = 127;
        byte num3 = (byte)(num1*num2);//溢出了
		System.out.println("num3:"+num3);//-2。
	  }
}		

 4.除法运算(/)

两个整数在做除法运算时,实际上是结果值取整数部分,去掉小数部分。

     除法运算时,只要有一个是浮点数时,那就是正真的除法运算。

public class Draft{
      public static void main(String[] args){
        long  num4 = 10;
		int  num5 = 4;
		//两个整数在做除法运算时,实际上是结果值取整数部分,去掉小数部分。
		long num6 = num4/num5;
		System.out.println(num6);
		
		double num7 = 10.0;
		int num8 = 4;
		//除法运算时,只要有一个是浮点数时,那就是正真的除法运算。
		double num9 = num7/num8;
		System.out.println(num9);
	  }
}		

 5. %:取模运算(求模,求余数)

public class Draft{
      public static void main(String[] args){
        long num10 = 20;
		int num11 =  6;
		long num12 = num10%num11;
		System.out.println("num12:"+num12);//2
	  }
}		

6.自增自减:++   -- 

算数运算符之自增自减运算符
    ++:
       符号在变量前:先加后赋值
                      变量先自增1,然后将变量的新值赋值给表达式
        符号在后:  先赋值后加。
                       先将变量的值赋值给表达式,然后再加1.
    --:符号在变量前:先减后赋值
                      变量先自减1,然后将变量的新值赋值给表达式
        符号在后:  先赋值后减。

public class Draft{
      public static void main(String[] args){
        int x = 1;
		int m = x++;
		int y = ++x;
		System.out.println("x的值"+x);//3
		System.out.println("m的值"+m);//1
		System.out.println("y的值"+y);//3
		
		int  a = 2;
		int  n = a--;
		int  z = --a;
		System.out.println("a的值"+a);//0
		System.out.println("n的值"+n);//2
		System.out.println("z的值"+z);//0
	  }
}		

(2)赋值运算符

=:是一个赋值运算符,将等号右边的值给左边的变量进行赋值。是最近简单的赋值运算

将一个变量,在现有值的基础上,对一个数字进行运算

+=:a += 3;   相当于 a = a + 3;

 -=: a -= 3;   相当于 a = a - 3;

*= :a *= 3;     相当于 a = a * 3;

/= : a /= 3;    相当于 a = a / 3;

%=:a %= 3;    相当于 a = a % 3;

public class AssignSymbol01 {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        a += b;  // 相当于 a = a + b
        System.out.println(a);// 30
       //现a的值是30
        System.out.println(b);// 20
        a -= b; // 相当于 a = a - b
        System.out.println(a); // 10

        int c = 3;
        int d = 6;
        c *= d;
        System.out.println(c);//18

        c = 15;
        c /=d;  // 注意: 两个整数做除法运算,是取整操作
        System.out.println(c); //2

        int x = 15;
        int y = 6;
        x %= y;
        System.out.println(x);// 3

    }
}

(3)关系运算

    关系运算符 :>,>=,<,<=,==

作用:用于判断两边的大小关系。

返回值:boolean类型

public class RelationSymbolDemo01 {
    public static void main(String[] args) {
        int x = 10;
        int y = 20;
        System.out.println(x>y);  // false
        System.out.println(x>=y);  //false
        System.out.println(x<y);  // true
        System.out.println(x<=y); // true
        System.out.println(x==y);  // false
        System.out.println(x!=y);  // true
    }
}

   (4) 逻辑运算符

对两个boolean类型的变量或者表达式,进行的运算

&:与,两真即为真,有任意一个为假,结果就是假。(全真为真,有假即假)
 |:或,两假即为假,有任意一个为真,结果就是真。 (全假为假,有真即真)
 !:非,非真即假,非假即真。(不是真的,就是假的)
 ^:异或,两个相同为假,两个不同为真。

在使用逻辑运算的时候,如果没有特殊的需求,尽量使用短路操作。

&&:短路与,  (全真为真,有假即假)在运算时,如果前面的条件为flase时,则后面的条件不执行

||:短路或。(全假为假,有真即真)在运算时,如果前面的条件为true时,则后面的条件不执行

public class LogicSymbolDemo01 {
    public static void main(String[] args) {
        //验证短路&&
        int a = 1,b = 2,c = 3,d = 4;
        boolean f = a < b && c < d;
        System.out.println("f的值: "+f);  // true
        f = a < b && c > d;
        System.out.println("f的值: "+f);  // false
        f = a > b && c++ < d;
        System.out.println("f的值:"+f);  // false
        System.out.println("c的值:"+c);  //c是3,表示第二个条件根本没有执行。
        f = a > b && c > d++;
        System.out.println("f的值:"+f); // false
        System.out.println("d的值:"+d);  // d是4,表示第二个条件根本没有执行

        // 验证短路||

        int m = 1,n = 2,x = 3,y = 4;
        f = m < n || x < y;
        System.out.println("f的值:"+f); // true
        f = m < n || x > y++;
        System.out.println("f的值:"+f); // true
        System.out.println("y的值:"+y); // 4  , 第一个条件为true,就可以确定最终答案, 因此没有执行自增运算,可以证明短路了。
        f = m > n || x < y;
        System.out.println("f的值:"+f); // true
        f = m > n || x > y++;
        System.out.println("f的值:"+f); // false
        System.out.println("y的值:"+y); // 5  , 因为第一个条件式false,不能立即决定最终结果,所以会执行第二个条件,

        //  !   非真既假,非假既真
        f =  !(1 > 2);
        System.out.println("f的值:"+f); //true
        f = !f;
        System.out.println("f的值:"+f); //false
    }
}

 (5)三元运算

 语法:

 boolean变量或者boolean结果的表达式?值1:值2 

 比如: a>b?a:b

执行逻辑:

 当?前的式子或变量返回true时,则使用值1,即a的值

当?前的式子或变量返回false时,则使用值2,即b得值

注意:1.符合运算规则,多种类型的数据混合时,系统首先自动将所有数据转换成取值范围 *             最大的那种数据类型,然后再进行计算。

        int m =10;
        int n = 15;
        long result = n%m==1?n:m;//m和n在三目运算里都已经是long类型
        System.out.println(result);//10

         2.值1和值2,可以是变量,也可以是具有返回值的表达式 

        int x=10;
        int y=15;
        int c=x>y?x+y:y-x;
        System.out.println(c);//5

          3.通常三目运算的最终结果,需要使用一个变量来接受,该变量的类型应该是值1或值2中的一个。

          4.值1和值2的最终类型(用来接受的那个变量的类型),需要能自动类型转换 

(6)运算符的优先级

1. 一元运算符(只能操作一个操作数)  > 二元运算符(只能操作两个操作数)  > 三元运算符(只能操作三个操作数)
2. 算术运算:乘除模  > 加减
3. 逻辑运算:与 && > 或 ||
4. 赋值运算符的优先级是最低的
5. 小括号的优先级是最高的

10.Scanner类 

Scanner类的使用步骤: 

步骤1:导包 import java.util.Scanner; idea中导包快捷键:Alt+enter

                 位置:在类的上面,package的下面 

步骤2:创建扫描器对象,并使用扫描器的变量引用该对象 

如:Scanner scan = new Scanner(system.in); 

步骤3:使用变量调用类里提供好的方法。通常在调用前都会使用输出打印语句来进行友好提示                          System.out.println("请在控制台输入一个年龄"); 

                         int age = scan.nextInt(); 

步骤4:最后,如果后续代码不再使用扫描功能,需要关闭扫描器     scan.close();

常用方式: 

nextInt(); :扫描控制台上输入的int类型的数字

 nextByte(); :扫描控制台上输入的Byte类型的数字 

nextShort(); :扫描控制台上输入的Short类型的数字

nextLong(); :扫描控制台上输入的Long类型的数字

nextFloat(); :扫描控制台上输入的Float类型的数字

 nextDouble(); :扫描控制台上输入的Double类型的数字

nextBoolean(); :扫描控制台上输入的Boolean类型的数字

特别注意下面两个的用法:

next(); :扫描控制台上的字符串,默认空格或回车表示结束

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入几个单词用空格隔开,这几个单词被扫描到一个变量里");
        String words = sc.next();//扫描到空格后,表示要扫描的内容结束了
        System.out.println(words);
        sc.close(); //关闭扫描器

nextLine();扫描控制台上的字符串,可以识别空格,默认回车表示结束

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入几个单词用空格隔开,这几个单词被扫描到一个变量里");
        String words = sc.nextLine();//该方法可以扫描空格,但是尽量不要和其他扫描功能在一起使用,可能出现bug,直接结束了。
        System.out.println(words);

        //关闭扫描器
        sc.close();

注意:所有nextXXX方法,即阻止程序向下执行,除非扫描到数据并结束扫描, 阻塞效果才会消失。

 11.Random类

 使用步骤:

1.导包操作    import java.util.Random; idea中导包快捷键:Alt+enter

2.创建对象    random r = new Random();

3.调用相关功能

                 r.nextInt(number):产生一个[0,number)范围内的任意一个整数

         注意:区间是左闭右开的区间,即不包括右边的值。

        Random r = new Random();
        //产生一个[0,10]区间内的一个整数
        int i1 = r.nextInt(11);
        System.out.println("i1="+i1);

        //产生一个[-5,5]区间的任意一个整数  [0,11)
        int i2 = r.nextInt(11)-5;
        System.out.println("i2="+i2);

                 r.nextDouble();产生[0,1)区间内的任意一个小数

        Random r = new Random();
        //产生一个[0,1)区间内的任意一个小数
        double v = r.nextDouble();
        System.out.println("v="+v);

对于产生[n,m]的任意一个整数的书写方法

闭区间: rd.nextDouble()*(m+1-n)+n

开区间: rd.nextDouble()*(m-n)+n 

    public static void main(String[] args) {
        Random rd = new Random();
        //随机[0,10)以内的任意小数
        double num = rd.nextDouble() * 10;
        //随机[0,10)以内的任意整数
        int n1 = (int) (rd.nextDouble() * 10);
        System.out.println("n1="+n1);

        //随机[-6,6]以内的任意整数  要的[0,12]   需写的[0,13)
        int n2 = (int) (rd.nextDouble() * 13 - 6);

        //随机[5,15]以内的任意整数  [5,16)   [0,11)
        int n3 = (int) (rd.nextDouble() * 11 + 5);

    }

12. math类

使用方式:

直接用类名.具体方法名

里面的内容分类:

         静态常量:自然对数 E 圆周率 PI

        常用函数:max():取最大的数

                         min():取最小的数

                         random():随机数,范围[0,1) 与Random的nextDouble()效果一样

                         abs():取绝对值

         取整函数: ceil():向上取整数(取得的值是大于该数的最小整数)

                         floor():向下取整(取得的值是小于等于该数的最大整数)

                         rint():最近的整数 比如 rint(3.7)得到4

                         round():四舍五入

          指数函数: pow():幂函数   pow(底数,指数)

                             sqrt():平方根

                              cbrt():立方根

三角函数:  sin() 、cos() 、asin() 、acose() 、tan() 、atan()

    public static void main(String[] args) {
        System.out.println("自然对数:"+Math.E);
        System.out.println("圆周率:"+Math.PI);

        System.out.println("3和5比较,其中较大值是"+Math.max(3,5));
        System.out.println("3和5比较,其中较大值是"+Math.min(3,5));
        System.out.println("-3的绝对值"+Math.abs(-3));

        //使用Math.random()产生一个随机数,默认是[0,1)区间内的人一个小数
        //[5,10]
        int i = (int) (Math.random() * 6 + 5);
        System.out.println("产生的随机数是:"+i);

        System.out.println("3.4向上取整:"+Math.ceil(3.4));
        System.out.println("3.5向上取整:"+Math.ceil(3.5));
        System.out.println("3.4向下取整:"+Math.floor(3.4));
        System.out.println("3.5向下取整:"+Math.floor(3.5));
        System.out.println("里3.4最近取整:"+Math.rint(3.4));
        System.out.println("里3.5最近取整:"+Math.rint(3.5));//如果离两边一样近的时候,取是偶数的整数
        System.out.println("里4.5最近取整:"+Math.rint(4.5));
        System.out.println("3.5四舍五入:"+Math.round(3.5)); //3自动转成double类型

        System.out.println("3的四次方:"+Math.pow(3,4));
        System.out.println("8的平方根:"+Math.sqrt(8));
        System.out.println("8的立方根:"+Math.cbrt(8));
        System.out.println("8的立方根:"+Math.cbrt(2));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值