Java基础编程学习笔记(上)(一)

简介: Java基础编程学习笔记(上)(一)

第一章:Java语言概述



一.java语言的特点


>面向对象性:两个基本概念:类、对象;三大特性:封装、继承、多态


>健壮性:吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制


>跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。“Write once , Run Anywhere”


 

二.JDK,JRE和JVM的关系


JDK包含JRE,JRE包含JVM.


5a9d9a706072f597635b74c45cff6066_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


第二章:Java基本语法


一.Java程序的运行方式


1.java程序编写-编译-运行的过程


编写:我们将编写的java代码保存在以“.java”文件的源文件中

编译:使用javac.exe命令编译我们的java源文件。格式:javac 源文件名.java

运行:使用java.exe命令解释我们的字节码文件。格式:java 类名


2.在一个java文件中可以声明多个class。但是,只能最多有一个类声明为public的。


而且要求声明为public的类的类名必须与源文件相同


3.程序的入口是main()方法。格式是固定的。


4.输出语句:


System.out.println():先输出后换行

System.out.print():只输出数据


5.每一行执行语句都以“:”结束。


6.编译的过程:编译以后,会生成一个或多个字节码文件。


字节码文件的文件名与java源文件中的类名相同。


二.Java的注释方式


1.java规范的三种注释方式:


单行注释

多行注释

文档注释(java特有)


2.单行注释和多行注释的作用:


①对所写的程序进行解释说明,蹭墙可读性。方便自己,方便别人

②调试所写代码


3.特点:单行注释和多行注释,注释内容不参与编译。


换句话说,编译以后生成的class结尾的自问吗文件中不包含注释掉的信息。


4.文档注释的使用:


   注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档。


5.多行注释不可以嵌套使用


/**


文档注释

@author shkstart

@version v1.0

这是我的第一个java程序!非常的开森!


*/


三.变量的分类


8bcdd20ae1e7b5896e3a8e0f494c1889_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


1.基本数据类型


 基本数据类型之间的运算规则:


 前提:这里讨论的只是7种基本类型变量的运算,不包含boolean类型的。


①自动类型提升:

   当容量小的数据类型与容量大的数据类型的变量作运算时,结果自动提升为容量大的数据类型。

   byte    char,short    int    long    float    double


   特别的:当byte,char,short做运算 结果为int型。


fe80ec0bb98960753883f75bf7c33edc_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


②强制类型转换:


  强制类型转换:自动类型提升运算的逆运算。

  1.需要使用强转符:()

  2.注意点:强制类型转换,可能导致精度损失。


2.引用数据类型(String)


String类型变量的使用

①String属于引用数据类型

②申明String类型变量时,使用一堆""

③String可以和8种基本数据类型做运算。且运算只能是连接运算:+

④运算的结果仍然是String类型


四.原码,反码,补码


4d16619be8c57432c4b89c81c36d39d9_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


例子:以数字-14为例(二进制)


9e3bc96c9bad89a91ca4172e21ad5724_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


特别的:计算机底层都以补码的方式来存储数据!


五.运算符


1.算数运算符


d4ad5502c820b82534562255f9c74dc1_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


2.赋值运算符

 =    +=    -=    *=    /=    %=


注意:


3b9ff2de7ce3395778810affc4f59996_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


3.比较运算符


114bfd7a43fa85c840ad97a248c81d5c_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


比较运算符的结果是boolean类型


4.逻辑运算符


ec07a9dcbc0799997a26452124bae0d9_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


注意:


cf940428ab8d9da8e0f2af568b75fb01_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


5.位运算符


483644b5f550f626cf1794f8152991dd_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


e380d50c6f5feb3a1a84951994f32275_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


示例:


c89e66a606d87c67678fb898f71b1523_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


2594aec78715049c471f4e231d766bb6_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


结论:


1.位运算符操作的都是整形的数据

2.<<:在一定范围内,每向左移一位,相当于*2

3.>>:在一定范围内,每向右移一位,相当于/2


面试题:最高效计算2 * 8  2<<3  ||  8<<1


6.三元运算符


1.结构:(条件表达式)?表达式1:表达式2

2.说明:

①条件表达式的结果为boolean类型

②根据条件表达式真或假,决定执行表达式1还是表达式2

如果表达式为true,则执行表达式1

如果表达式为false,则执行表达式2

3.表达式1和表达式2要求是一致的

4.三元运算符可以嵌套使用


5.凡是可以使用三元运算符的地方都可以使用if-else,反之不成立

6.如果程序可以是使用三元运算符,也可以使用if-else

 那么优先选择三元运算符。原因:简洁,执行效率高。


六.程序流程控制


1.分支语句

①if-else语句(三种)


12952707d34450e759e353cb9b1091df_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png

6473ed9479c7dd784aa1f9bec61fa600_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


说明:

1.else 结构是可选的

2.针对于条件表达式:

 如果多个条件表达式之间是“互斥”关系(无交集关系),哪个判断和执行语句申明在上面还是下      面,无所谓。

 如果多个条件表达式之间有交集的关系,需要根据实际情况,考虑清楚哪个结构申明在上面。

 如果多个条件表达式之间有包含关系,通常在范围小的申明在大的上面。


②switch-case语句


026c904496cb7eac35e570ab8fc4605f_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


说明:


one.根据switch表达式的值,依次匹配各个case中的常量,一旦匹配成功

测进入想要case结构中,调用其执行语句

当调用执行语句之后,程序会继续向下执行其他case结构中的执行语句

直到遇到break关键字或switch-case结构末尾为止。


two.break,可以使用在switch-case结构中,表示一但执行到此关键字,就跳出switch-case结构


three.switch结构中的表达时,只能是如下6种类型之一:

byte,short,char,int,枚举类型(jdk5.0新增),String类型(jdk7.0新增)


four.case只能声明变量,不能申明范围。


five.break关键字是可选的(非必要)


six.default:相当于if-else结构中的else

    default结构中是可选的


if-else与switch-case的区别与应用


0b1ba3f38dcbd8fdf0f6f880edf803d7_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd3lrMTEyMjMz,size_20,color_FFFFFF,t_70,g_se,x_16.png


2.循环语句

       循环语句的分类


f23ce4ebdc4b9b8c819421677587649b_837fa8b17425485ebb4663687490f68b.png


循环结构的4个要素

①初始化条件

②循环条件  ----->>是boolean类型

③循环体

④迭代条件


1.for循环


for循环的结构


for(①;②;④)

{

    ③

}


执行过程: ① - ② - ③ - ④ - ② - ③ - ④ - .........-②


for循环的使用:


/*

题目:输入两个正整数m,n。求其最大公约数和最小共倍数


说明:break关键字的使用

*/


import java.util.Scanner;
class ForTest
{
    public static void main(String[] args) 
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个正数");
        int m = scan.nextInt();
        System.out.println("请输入一个正数");
        int n = scan.nextInt();
        //获取最大公约数
        //获取两个数中的最小值
        int min = (m <= n)?m:n;
        for(int i = min; i >= 1; i--)
        {
            if(m % i == 0 && n % i == 0)
            {
            System.out.println("最大公约数为" + i);
            break;//一旦在循环体在执行到break就跳出循环
            }    
        }
        //获取最小公倍数
        //获取两个数中的较大值
        int max = (m >= n)?m:n;
        for(int i = max; i <= m * n; i++)
        {
            if(i % m == 0 && i % n == 0)
            {
            System.out.println("最小公倍数为" + i);
            break;//一旦在循环体在执行到break就跳出循环
            }    
        }
    }
}




嵌套for循环的使用:


/*

嵌套循环的使用

1.嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环


2.外层循环:B

 内层循环:A


3.说明

①内层循环结构遍历一遍,只相当于外层循环体执行一次

②假设外层循环执行m次,内层循环执行n次,此时内部循环的循环体一共执行了m*n次


4.技巧:

 外曾循环控制行数,内层循环控制列数


*/
class ForForTest
{
    public static void main(String[] args) 
    {
        //******
        //System.out.println("******");
        for(int i = 1; i <= 6; i++)
        {
            System.out.print('*');
        }
        System.out.println("\n");
        /*
        ******
        ******
        ******
        */
        for(int j = 1; j <= 4; j++)
        {
            for(int i = 1; i <= 6; i++)
            {
                System.out.print('*');
            }
            System.out.println();
        }
        /*
        *
        **
        ***
        ****
        *****
        */
        for(int i = 1; i <= 5; i++)//控制行数
        {
            for(int j = 1; j <= i; j++)//控制列数
            {
                System.out.print('*');
            }
            System.out.println();
        }
        /*         i(行号)  j(*的个数)  规律 i + j = 5
        ****       1        4
        ***        2        3
        **         3        2
        *          4        1
        */
        for(int i = 1; i <= 4; i++)
        {
            for(int j = 1;j <= 5-i; j++)
            {
                System.out.print('*');
            }
            System.out.println();
        }


2.while循环


while循环的结构



while(②)


{

   ③;

   ④;

}


执行过程:①---②---③---④---②---③----④---②...........②


说明:

1.写while循环千万小心不要丢了迭代条件,一旦丢了,可能会导致死循环

2.我们写程序,要避免出现死循环

3.for循环和while循环是可以相互转化的!

 区别:for循环while循环的初始化条件部分的作用范围不同:

 i在for循环内有效,出了for循环就失败了

 i在while循环结束以后,i仍可以调用


3.do-while循环


do-while循环的结构


do

{

   ③;

   ④;

}while(②)


执行过程: ①---③---④---②---③---④---②---③---④---②.......②


说明:

1.do-while至少执行一次循环体

2.开发中,使用for和while更多一些,do-while相对较少


4.嵌套循环


实例一:九九乘法表


/*
嵌套循环的应用1:
九九乘法表
1 * 1 = 1
2 * 1 = 2  2 * 2 = 4
....
9 * 1 = 9  ...............  9 * 9 = 81
*/
class NineNineTable 
{
    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) + "   ");
            }
            System.out.println();
        }
    }
}


实例二:


/*
100以内的所有质数的输出
质数:素数,只能被1和它自己本身整除的自然数
---->>从2开始到这个数减1为止,都不能被这个数本身整除
*/
class PrimeNumberTest
{
    public static void main(String[] args) 
    {
        boolean isFlag = true;//标识i是否被j除尽过
        for(int i = 2; i <= 100; i++)
        {
            for(int j = 2; j < i; j++)
            {
                if(i % j == 0)
                {
                    isFlag = false;
                }
            }
            if(isFlag == true)
            {
                System.out.println(i);
            }
            isFlag = true;//重置isFlag
        }
    }
}


对该题目的两种优化方式:


优化一:


class PrimeNumberTest1
{
    public static void main(String[] args) 
    {
        boolean isFlag = true;//标识i是否被j除尽过
        //获取当前时间距离1970-01-01 00:00的毫秒数
        long start = System.currentTimeMillis();
        for(int i = 2; i <= 100000; i++)
        {
            //优化二:对本身是质数的自然数是有效的
            for(int j = 2; j <= Math.sqrt(i); j++)
            {
                if(i % j == 0)
                {
                    isFlag = false;
                    break;//优化一:只对本身不是质数的自然数是有效的
                }
            }
            if(isFlag == true)
            {
                System.out.println(i);
            }
            isFlag = true;//重置isFlag
        }
        //获取当前时间距离1970-01-01 00:00的毫秒数
        long end = System.currentTimeMillis();
        System.out.println("所花费的时间为:" + (end - start));//13142  优化一:1301 
    }
}




优化二:


class PrimeNumberTest2
{
    public static void main(String[] args) 
    {
        //获取当前时间距离1970-01-01 00:00的毫秒数
        long start = System.currentTimeMillis();
        label:for(int i = 2; i <= 100000; i++)
        {
            //优化二:对本身是质数的自然数是有效的
            for(int j = 2; j <= Math.sqrt(i); j++)
            {
                if(i % j == 0)
                {
                    continue;
                }
            }
            System.out.println(i);
        }
        //获取当前时间距离1970-01-01 00:00的毫秒数
        long end = System.currentTimeMillis();
        System.out.println("所花费的时间为:" + (end - start));//13142  优化一:1301 优化二:275
    }
}



5.特殊关键字的使用(break,continue)


                       使用范围              循环中使用的作用         相同点


break:           switch-case          结束当前循环               关键字后面不能声明执行语句

                       和循环结构中


continue:        循环结构中         结束当次循环              关键字后面不能声明执行语句


6.补充内容:


1.如何从键盘获取不同类型的变量:需要使用Scanner类


具体实现步骤:

1.导包:import Java.util.Scanner;

2.Scanner的实例化

3.调用Scanner类的相关方法,来获取指定类型的变量注意:

需要根据想要的方法:来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,会报异常:IputMisMatchException

导致程序终止。




2.产生随机数


//产生随机数

//公式  [a,b]  :      (int)(Math.random() * (b - a + 1) + a)

目录
相关文章
|
6天前
|
Kubernetes 负载均衡 Java
k8s的出现解决了java并发编程胡问题了
Kubernetes通过提供自动化管理、资源管理、服务发现和负载均衡、持续交付等功能,有效地解决了Java并发编程中的许多复杂问题。它不仅简化了线程管理和资源共享,还提供了强大的负载均衡和故障恢复机制,确保应用程序在高并发环境下的高效运行和稳定性。通过合理配置和使用Kubernetes,开发者可以显著提高Java应用程序的性能和可靠性。
56 31
|
7天前
|
Java 编译器 开发者
注解的艺术:Java编程的高级定制
注解是Java编程中的高级特性,通过内置注解、自定义注解及注解处理器,可以实现代码的高度定制和扩展。通过理解和掌握注解的使用方法,开发者可以提高代码的可读性、可维护性和开发效率。在实际应用中,注解广泛用于框架开发、代码生成和配置管理等方面,展示了其强大的功能和灵活性。
60 25
|
3月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
9天前
|
Java 开发工具
课时6:Java编程起步
课时6:Java编程起步,主讲人李兴华。课程摘要:介绍Java编程的第一个程序“Hello World”,讲解如何使用记事本或EditPlus编写、保存和编译Java源代码(*.java文件),并解释类定义、主方法(public static void main)及屏幕打印(System.out.println)。强调类名与文件名一致的重要性,以及Java程序的编译和执行过程。通过实例演示,帮助初学者掌握Java编程的基本步骤和常见问题。
|
11天前
|
开发框架 Java 开发工具
【Java全栈学习笔记-U1-day01】Java介绍
本笔记整理了Java学习的基础内容,涵盖程序理解、Java语言特性、JDK安装与配置、Java程序开发工具及编写步骤。重点介绍了Java程序的基本结构、编译和运行过程,以及输出语句的使用。通过实例演示了IDEA创建Java程序的方法,并强调了编码规范和注意事项。适合初学者复习和交流学习。 主要内容: 1. 理解程序:计算机组成、程序定义。 2. 简介:Java语言特点、技术平台、JDK作用。 3. 编写Java程序:编写、编译、运行步骤,基本结构。 4. 输出语句 5. DEA使用:新建工程、保存位置、文件介绍、新建类。 6. 扩展:注释、代码规范、大小写敏感、缩进等。
|
3月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
3月前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
102 12
|
3月前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
287 2
|
4月前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
4月前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####

热门文章

最新文章