java基础

Java

Java特性和优势

  • 简单性

  • 面向对象

  • 可移植性

    Write once,Run anywhere

    由于Java是解释性语言,编译器会将Java代码变成“中间代码”,然后在Java虚拟机(Java Virtual Machine,JVM)上解释执行。由于中间代码与平台无关,因此Java语言可以很好的跨平台执行,具有很好的可移植性。

  • 高性能

  • 分布式

  • 动态性

    反射

  • 多线程

  • 安全性

    Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现

  • 健壮性

Java三大版本

  • JavaSE:标准版(桌面程序,控制台开发)

  • JavaME:嵌入式开发(手机,小家电)近乎灭绝。。。

  • JavaEE:企业级开发(web开发,服务器开发)

JDK、JRE、JVM

  • JDK:

    ( Java Develpment Kit )java开发工具

  • JRE:

    (Java Runtime Environment java)运行时环境

  • JVM:

    (Java Virtual Machine) java 虚拟机

jdk,jre,jvm

jdk2

Java程序的运行机制

  • 解释型语言

更倾向于操作系统 C C++

  • 编译型语言

更倾向于网页 web JavaScript

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxZskVPD-1628763518487)(C:\Users\半城烟雨 半城殇\Desktop\blog图片\java运行机制.png)]

Java命名规范

一、命名规范

1、 项目名全部小写

2、 包名全部小写

3、 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。

如:public class OneJavaClass{}

4、 变量名、方法名首字母小写,如果名称由多个单词组成,除了首字母单词都要大写。驼峰命名原则,首字母小写和驼峰原则:myMomey 出第一个单词以外后面的单词首字母大写 lastTime。

如:int index=0;

public void userName(){}

5、 常量名全部大写,多个单词用下划线_隔开

如:public static final String GAME_COLOR=”RED”;

6、所有命名规则必须遵循以下规则

1)、名称只能由字母、数字、下划线、$符号组成

2)、不能以数字开头

3)、名称不能使用JAVA中的关键字。

4)、坚决不允许出现中文及拼音命名

数据类型

强类型语言

  • 要求变量的使用严格符合规定,所有变相都必须先定义才能使用。如果不经过转换就永远是这个类型。java C++
  • 安全性高 速度慢一点

弱类型语言

  • 不一定要严格符合规定 JavaScript

Java数据类型

基本类型

数值类型
  • 整数类型:

    byte占1个字节、8位、范围:-128—127、-27-27-1

    short占2个字节、16位、范围:-2^15 - 2^15-1

    int占4个字节、32位、范围:-2^31 - 2^31-1

    long占8个字节、64位、范围:-2^63 - 2^63-1

    long类型要在后面加个L long num = 30L;

  • 浮点类型

    float占4个字节、32位

    float类型要在后面加个F long num = 30.0F;

    double占8个字节、64位

  • 字符串类型char占2个字节、16位

Boolean类型:
  • 占1位其值只有true和false两个

引用类型

类、接口、数组

字节

  • 位(bit):是计算机内部数据存储的最小单位,11001100是一个八位二进制数

  • 字节(byte):是计算机中数据处理的基本单位,一般用B表示

  • 1B(字节 byte)= 8bit(位)

  • 字符是指计算机中使用的字母、数字、字和符号

1bit表示1位

1Byte表示一个字节1B=8b

1024B=1KB 1024KB=1M

类型转换

  • 由于Java是强类型语言所以计算的时候要先转化为同一个类型再进行运算

    低-------------------------------------------------------->高

    byte,short,char-> int ->long -> float->double

    int i = 128;
    byte b = (byte)i;	//b=-128 内存溢出
    double c = i;   //c=128.0
    //强制转换	(类型)变量名   高--低
    //自动转换  低--高
    /*  1.不能对布尔类型进行转换
    	2.不能把对象类型转为不相干的类型
    	3.在把高容量转换到低容量的时候,强制转换
    	4.转换过程可能出现内存溢出,或者损失精度问题
    */
    System.out.println((int)23.7);//23
    System.out.println((int)-45.33f);//-45
    
    //操作数比较大的时候要注意溢出
    //JDK7新特性,数字之间可以用下划线分割
    int money =10_0000_0000;
    int years = 20;
    int total = momey * years;//-1474836480,计算的时候内存溢出
    long total2 = momey * years;//默认是int,转换之前就出现问题,先计算再转换再赋值
    long total3 = momey *((long)years);//先把一个转换为long类型
    System.out.println(total3);//200e
    

运算符

int a = 1;
int b = a++;	//b=3  先给b赋值 再自增
int c = ++a;	//c=5    先自增   再给b赋值

很多运算都会使用工具类来操作

比如说 幂次方 运算 pow

逻辑运算符
//与(and) 或(or) 非(取反)
boolean a = true;
boolean b = false;

System.out.println("a && b");//false 逻辑与运算:两个变量都为真,结果才为true
System.out.println("a || b");//true	逻辑或运算:两个变量有一个真,结果才为true
System.out.println("!(a && b)");//true 如果是真 则变为假 假则变为真

//短路运算
int c = 5;
boolean d = (c<4)&&(c++<4);    //左边是错的右边就不执行
System.out.println(d);//d=false
System.out.println(c);//c=5
位运算

A = 0011 1100

B = 0000 1101

A&B 0000 1100 //如果两个都为1,则为1,否则为0

A|B 0011 1101 //有一个为1则为1,否则为0

A^B 0011 0001 //两个相同为0,否则为1

~B 1111 0010 //取反

二进制的位运算 效率极高

*左移 << 2

右移 >> /2

a += b; //a = a+b

a -= b; //a = a-b

字符串连接符 + ,String

int a =10;
int b =20;
System.out.println(""+a+b);//1020
System.out.println(a+b+"");//30
//字符串在前面则全部转换为String类型
//如果在后面则不影响前面的
三元运算符
public static void main(String[] args){
	// x ? y : z
    //如果x==true 则结果为y  否则结果为z
    
    int score = 80;
    String type = score <60 ? "不及格":"及格";
}

java中运算符的优先级

优先级记忆方法:单目乘除为关系,逻辑三目后赋值。(前辈总结的)

单目运算符:一次作用一个变量的运算符,又叫一元运算符
单目:单目运算符+ –(正负数) ,++ –,!(逻辑非),~(按位取反)
乘除:算数运算符:* / % + - (* / %优先级肯定是大于±的)
为:位运算符:~(按位取反)<<(左移) >>(右移),^(也可以位运算,二进制异或)
关系:关系运算符:> < >= <= == !=
逻辑:逻辑运算符(除!)&& || & | ^
三目:条件运算符A > B ? X : Y
后:无意义,仅仅为了凑字数
赋值:= += -= *= /= %= |= &= ^=
说明:前优先级大于后,比如单目运算符也是位运算符,的优先级是单目级别的。

Scanner对象

  1. scanner.next();
    • 输入有效字符后将其后面的空白作为结束符号
    • 不能得到带有空格的字符串
  2. scanner.nextline();
    • 以enter为结束符
    • 可以获得空白
//从键盘接收数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");
String str = scanner.nextline();
System.out.println(str);
scanner.close();//关闭流 节省资源

循环

while 和do while区别
  • while先判断后执行,dowhile是先执行后判断
  • dowhile总会保证循环体至少执行一次。主要区别!
For循环
  • for循环是支持迭代的一种通用结构,是最有效、最灵活的循环结构

  • for循环执行的次数是在执行前就确定了。语法格式如下:

    for(初始化;布尔表达式;迭代){
        //代码
     }
    //ideaj 快捷方式100.for
    

99乘法表

public class ForDemo03 {
    //99乘法表
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print( i +"*" +j +"="+ i*j +"\t");
            }
            System.out.println();
        }
    }
}

增强for循环

for(声明语句:表达式){
//代码
}
  • break:直接退出循环不执行循环剩下的语句
  • continue:终止某次循环,接着进行执行下一句循环

Java方法

  • 方法的原子性,一个方法值完成一个功能

    修饰符  返回类型  方法名(参数类型 参数名){
    	方法体
    	return	返回值;
    }
    

    形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。?

    实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。

  • 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

  • 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。指向对象本身。

重载

重载就是一个类中,有相同的函数名称,但是形参不同的函数

重载的规则

  • 方法名称必须相同
  • 参数列表必须不通(个数,类型,参数的排列顺序不通等)
  • 方法的返回类型也可以不一样
  • 仅仅返回类型不应不构成重载
public static  double max(double num1,double num2){
    double result  = 0;
    return result;
}
public static int max(int num1,int num2){
    int result  = 0;
    return result;
}
public static int max(int num1,int num2,int num3){
    int result  = 0;
    return result;
}

递归

方法调用方法本身

递归结构包括:

  • 递归头:什么时候不调用自己方法。如果没有,就陷入死循环(边界条件)
  • 递归体:什么时候需要调用自身方法

数组

  • 数组是相同类型数据的有序结合
  • 每一个数据称作数组元素,都有一个下标
  • 数组长度是确定的,一旦创建就不可以改变大小
  • 数组的元素必须是相同类型,不能混合,可以使任意数据类型(基本类型和引用类型)
  • 数组本身是在堆中的
  • 数组也是对象
public static void main(String[] args) {
        int[] nums; //声明一个数组
        int  arr[]; //不建议使用这种方法

        nums = new int[10];
    
    	int[] arr2 =new int[10];
        nums[0] =1;
        nums[1] =2;
        nums[2] =3;
        nums[3] =4;
        nums[4] =5;
        nums[5] =6;
        nums[6] =7;
        nums[7] =8;
        nums[8] =9;
        nums[9] =10;

        int sum = 0;
        for (int i = 0; i <nums.length ; i++) {
                sum = sum + nums[i];     
        }
        System.out.println(sum);//sum=55
    }

内存

  • 堆:存放new的对象和数组。

    ​ 可以被所有的线程共享,不会存放别的对象引用

  • 栈:存放基本变量类型(包含这个基本类型的具体数值)

    ​ 引用对象的变量(存放这个引用堆里面的具体地址)

  • 方法区:可以被所有线程共享

    ​ 包含所有的class和static变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XYD4dJZ3-1628763518490)(C:\Users\半城烟雨 半城殇\AppData\Roaming\Typora\typora-user-images\image-20210808164732727.png)]

  • 静态初始化:创建+赋值
int[] a = {1,2,3,4,5};
System.out.println(a[0]);
  • 动态初始化:后期手动赋值 包含默认初始化
int[] b = new int[10];
b[0] = 1;
  • 数组的默认初始化:数组是引用类型,它的元素相当于类的实例变量,因此数组一旦分配空间,其中的每个元素也被按照市里变量同样的方式被隐式初始化。

多维数组

多维数组可以看成数组的数组,如二维数组里的每一个元素都是一个一维数组。

创建一个二维数组

int a[][] = new int[2][5];
int b[][] = {{1,2},{2,2},{3,3}};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMHy4WxK-1628763518494)(C:\Users\半城烟雨 半城殇\AppData\Roaming\Typora\typora-user-images\image-20210808180634816.png)]

Arrays类

  • 打印数组:Arrays.toString(arr);

  • 升序排序:Arrays.sort(arr);

八大排序之冒泡排序

比较两个相邻的数,如果第一个比第二个大则交换位置

每次比较都会产生一个最大或者最小的数

下一轮则可以少一次排序

public static void main(String[] args) {
        // 新建一个数组
        int[] a = {2,2,3,4,5,6,142,56213,41,2};
        //数组调用方法
        int[] sort= sort(a);
        System.out.println(Arrays.toString(sort));
    }

    public static int[] sort(int[] array){
        //新建临时变量
        int temp = 0;
        //外层循环判断要走多少次
        for (int i = 0; i < array.length-1 ; i++) {
            //添加一个标识符减少没必要的比较
            boolean flag = false;

            //内层循环 第一个数比第二个数大则换位
            for (int j = 0; j < array.length-1 ; j++) {
                if(array[j]>array[j+1]){
                    temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                    flag = true;
                }
            }
            if (flag== false){
                break;
            }
        }
        return  array;
    }

nt temp = 0;
//外层循环判断要走多少次
for (int i = 0; i < array.length-1 ; i++) {
//添加一个标识符减少没必要的比较
boolean flag = false;

        //内层循环 第一个数比第二个数大则换位
        for (int j = 0; j < array.length-1 ; j++) {
            if(array[j]>array[j+1]){
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                flag = true;
            }
        }
        if (flag== false){
            break;
        }
    }
    return  array;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值