• Java小知识点总结


    配置

    数据库配置文件

    我以yml为例,以后直接复制,不要在自己写了

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
        username: root
        password: 123456
    

    基础知识

    Switch

      分支需要注意的问题,例如switch case 这个条件分支,switch的变量和case后的常量必须是同一个类型的

    例如

      int a =9;
            switch (a)
            {
                case a<10:  //这是错的
                    System.out.println("abc");
                    break;
                case 8:
                    System.out.println("123");
                    break;
            }
    

    a是int变量,第一个case后面是a<10是一个Bool值的类型,这就是错的,第二个case后的8才是对的。

    对于switch这个分支条件,我居然还是不熟悉。例如以下的例子:

    package com.company;
    
    public class Main {
    
        public static void main(String[] args) {
    
            int age=8;
    
            switch (age) {
    
                case 0:
                    System.out.println("0");
    
                case 1:
                    System.out.println("1");
                default:
                    System.out.println("默认");
            }
    
        }
    }
    

    像这种,输出的结果是默认,这是毫无疑问的,但是接下来的这个例子,我就疏忽了:

    package com.company;
    
    public class Main {
    
        public static void main(String[] args) {
    
            int age=8;
    
            switch (age) {
                default:
                    System.out.println("默认");
                case 0:
                    System.out.println("0");
                case 1:
                    System.out.println("1");
    
            }
    
        }
    }
    

    这个例子的输出结果是 默认 0 1 ,我是出乎意料的,说明基本功不扎实。 这个例子把Default放到了第一位,所以会先执行default语句,而switch在执行过一次之后,假如没有break语句,那么switch会把接下来的所有分支都执行一边,所以break的意义还是非常大的。

    i++和++i

    这个其实很早就学过了,但是今天看了一道面试题,居然还是不会
    i++是先赋值,再加1,而++i是先加1,再赋值。

    注意:i=i++和i++不是一回事

    现在来开始讲解了,我举个栗子

        public void test(){
            int i=1;
            i=i++;
            System.out.println(i++);
        }    
    

    这个方法的执行结果是1,原因就是i++是先赋值,再加1。i=i++可以看下图,i=i++先执行的是i++,i会放到操作数栈,为1,然后++是在局部变量表加的,i这个时候为2,然后i++算完了,结果是i=2,操作数栈是1,这个时候i=i++,要把值赋值给i,这个时候,操作数栈的1会赋值给i,可以看见i从2又变成1了。

    下面的输出语句也是,由于i++的先赋值再加1的特点,会先输出,再加1
    我们再来看一个例子

        public void test(){
            int i=1;
            i++;
            System.out.println(i++);
        }
    

    这个代码输出的是2,这个例子很形象的讲述了i++先赋值在加1的特点,第二行单独的i++的时候,由于没有赋值对象,所以i++就变成了i=i+1;这个时候i是2了,然后下面输出语句的i++,会先打印,再加1,所以结果还是2
    好了,再贴一个for循环的例子

        public void test(){
            for (int i = 0; i < 10;i++) {
                System.out.println(i);
            }
        }
    

    这个例子都很熟悉了,输出结果就是0到9,现在我改一下

      public void test(){
            for (int i = 0; i < 10;i=i++) {
                System.out.println(i);
            }
        }
    

    我让i++那里有一个赋值了,完了i++先赋值后加1的特点出来了,结果就是无限循环输出0

    最后,我把我看的那道面试题放出来吧

        public void test(){
            int i=1;            //i=1
            i=i++;              //i=1,因为先赋值      
            int j=i++;          //j=1,i为2,详情见下图图解   
            int k=i+ ++i * i++; //2+ 3 * 3 ++i之后,i变成3了
            System.out.println("i=" + i);  //i++,3变4
            System.out.println("j=" + j);
            System.out.println("k=" + k);
        }
    

    答案是4 1 11,具体讲解看注释

    int j=i++;图解如下:

    快捷打代码

    由于我使用的IDE是idea,我不知道怎么去快捷的打出代码,Visual Studio可以双击Tab键补全代码,idea的方法是,打的时候找那种带有Create Loop字样的,例如我打一个for循环:

    img

    不要选择上面那个for,否则括号什么的还得自己去打。

    输入数据

    不知道Java里面是怎么输入的,总结一下:

    int a=cin.nextInt();//输入一个整数
    System.out.println(a);
    
    double b=cin.nextDouble();//输入一个双精度的浮点数
    System.out.println(b);
    
    String str=cin.next();//输入一个单词
    System.out.println(str);
    
    String str2=cin.nextLine();//输入一行,中间可有多个空格
    System.out.println(str2);
    

    这个是输入,但是我不是很懂下面两个输入字符的语句,两个不能同时输入?而且我还分不清两个的区别。

    输出的话,就是有一点,加ln的会换行,不加ln就不会换行了。

    代码折叠

    Visual Studio里面有一个很好用的功能,就是折叠代码,用的是#region #endregion ,非常好用,idea呢也有这个功能,不过使用的是//region //endregion 把#换成了//

    super关键字

    Java中的super关键字,主要是调用父类的一些属性和方法,例如:

    Vae vae=new Vae();
    vae.Eat();
    vae.GetName();
    

    这里我的Vae类是继承了Person类的,如下:

    img

    img

    super类就是子类中可以调用父类的东西。

    instanceof 防止类型强制转换带来的错误

    Java中的强制类型转换,有时候类型转换会出现溢出的错误,我们可以使用 instanceof 来防止:

    int a=10;
    Object object=a;
    
    int b=(int)object;
    System.out.println(b);
    if (object instanceof Double) {
        Double c=(double)object;
        System.out.println(c);
    }else {
        System.out.println("这个object对象不能转化为Double类型的");
    }
    

    这样就不会出现强制类型转换的溢出错误了。

    继承

    Java中继承类的关键字是 extends 继承接口的关键字是 implements

    第一个Java程序

      这里我会使用命令框的方式写一个Java程序

    先新建一个文本文件,改名为Vae.java,然后写以下代码:

    class Hello{
        
        public static void main(String args[]){
            System.out.println("许嵩是最佳歌手");
        }
        
    }
    

    然后保存,使用命令框进行编译:javac Vae.java

    注意,有时候编码的话会报错: 编码GBK的不可映射字符

    原因参考:这篇文章

    这时会出现Hello.class

    再输入java Hello就可以输出语句了。如图:

    img

    Java的一个反编译软件,叫XJad,还不错

    img

    直接打开编译过的class字节码,是乱码,直接用XJad打开就可以看了

    img

    有一点有意思的是,注释是不会显示出来的,注释在代码编译的过程中,就没有了。

    Java多态,有一些需要讲一下

    1.成员变量

    成员变量的多态,是先父类再子类。

    2.成员函数

    成员函数的多态,是子类覆盖父类,因为函数有一种特性,就是函数会覆盖,所以父子类都有的方法,子类会覆盖父类

    3.静态函数

    静态函数和普通的成员函数是不一样的,都划在了静态内存区,调用的时候还是哪个类的对象调用的就显示哪个方法

    package com.company;
    
    public class Main {
    
    
        public static void main(String[] args) {
            System.out.println("大家好,我是Vae");
    
            Fu f=new Zi();
            System.out.println(f.num);
            f.start();
            Fu.Vae();
            Zi z=new Zi();
            System.out.println(z.num);
            z.start();
            Zi.Vae();
    
    
        }
    }
    
    class Fu{
        int num=3;
        void start(){
            System.out.println("我是父类");
        }
        static void Vae(){
            System.out.println("我是静态父类");
        }
    }
    
    class Zi extends Fu{
        int num=5;
        void start(){
            System.out.println("我是子类");
        }
        static void Vae(){
            System.out.println("我是静态子类");
        }
    }
    

    这个是代码,执行一下,结果如下:

    img

    也就是,普通方法的多态是会覆盖的。变量和静态方法,都还是调用的父类里面的。

    快捷敲代码

    1.快捷方式,打东西,后面.sout就可以快速输出

    imgimg

    其他的也是,比如.for .fori什么的

    添加测试类

    2.添加测试类,如果我想给一个接口,类啥的添加一个测试单元,我可以这样,在类上按下alt+enter键,出来这样,选择创建测试

    img

    img

    自己选择测试的方法和路径,用的Junit,这个我讲过

    接口上写注释

    3.接口上写注释,一般都在接口上写方法的注释,这样我们继承接口的方法实现,鼠标放上去会显示注释的内容

    注释这样写

    img

    在方法上面打出 /** 然后直接敲回车就可以了,写上汉字。来看看方法的实现的注释的展现

    img

    真的是很棒了,这个有开关,开关的地方在

    img

    错误集合

    java.lang.ClassNotFoundException:

    快气死我了,就是报这个错误,后来搜到一篇文章。点我 他说,要把你的jar包导入到lib文件夹下面才行,我尝试了可以了,Java Web可以链接数据库了,但是有几个问题还不懂,解决不了

    我现在是写死的数据库连接,我想读取配置文件都不行,报错,不懂。。。。。

    img

  • 相关阅读:
    Nginx/Apache图片缩略图技术
    MySQL 备份和恢复
    MySQL主从复制
    xcode针对不同IOS版本的代码编译问题
    java 5 ReadWriteLock
    java 5 Lock
    结对-及格程序查询系统-结对项目总结
    团队-象棋游戏-开发文档
    结对-及格程序查询-最终程序
    结对-及格程序查询-测试过程
  • 原文地址:https://www.cnblogs.com/yunquan/p/10542574.html
Copyright © 2020-2023  润新知