JavaSE语法总结

JavaSE语法总结

1. 前言

我们在学完一个东西之后,一定要做总结,因为只有学会总结,你才会发现自己原来已经学了这么多东西,那这些东西你是否都掌握了呢?那就要看你有么有学会总结了。把每一章最重要的点给写下来,方便自己复习,也方便别人来参考,一举多得的事情,所以希望大家都能学会总结。把自己会的东西都给写下来。

2.认识Java

Java之父

在前面学习Java的时候,我们认识到詹姆斯·高斯林老爷子,也就是Java之父,真的是非常厉害阿!学习Java的小伙伴来一起认识认识这位老爷子吧!

img

安装JDK

大家还记得就是在一开始,要写Java代码的时候,是不是要安装一个叫做JDK的东西,这玩意就是我们运行Java的工具,如果不装他,你是运行不了Java代码的。有多少人还记得JDK,JVM,JRE这些东西阿!比如我现在问你这三者有什么关系,你们能一下子回答上来吗?

他们三者的关系:

  • JDK:Java开发包工具
  • JRE:Java运行环境
  • JVM:Java虚拟机
  • 你只要安装了JDK,JDK里面就会有JRE和JVM这两个东西,具体看下面这个图
    image-20230411170753879

3.数据类型

还记得我们Java里面有哪些数据类型吗?学到现在不会还有小伙伴们不知道吧!

Java里面分两种类型:一个是基本数据类型,一个是引用数据类型。

基本数据类型

数据类型包装类占字节数
byteByte1
shortShort2
intInteger4
longLong8
floatFloat4
doubleDouble8
charCharacter2
booleanBooleanJava里面没说

引用数据类型

数据类型
数组
String
枚举
自定义类

4.运算符

运算符我们学过很多个阿!在C语言里面已经见得不少了,但是在Java里面,我们又学到了几个新的运算符和一些新的规则:

运算符功能
右移运算符(>>)一个数的二进制往右移动n位,移动完成之后,会在左边补0或者是补1,这是要看符号位,如果是正数,则补0,如果是复数,则补1。
左移运算符(<<)一个数的二进制往左移动n位,移动完成之后,会在右边补0。
(无符号右移)>>>一个数的二进制往右移动n位,移动完成之后,会在左边补0。这个符号,无论你是正数还是负数,通通只会补0。
&& ||Java里面没有1是真,0是假的这种概念了,所以你不能在这两个符号左右两边写个0或1,这两个符号,左右两边必须是布尔表达式。

5.程序的逻辑控制

判断条件

在Java里面,只要是涉及到判断条件,括号里面一定是一个布尔表达式,不能跟C语言一样,在括号里面写个1或者写个0,这样代码是编译不通过的。

//这样的代码编译一定会报错,是无法通过的error
public static void main(String[]){
    /*if(1){
        System.out.println(true);
    }else{
        System.out.println(false);
    }error*/
    //正确写法
    if(1 == 1){
        System.out.println(true);
    }else{
        System.out.println(false);
    }
}

面试题

在Java里面也有if,switch,for,while,do while这些语句,其中最特殊的就是switch语句了,这里面会有一道面试题,他会问你switch的括号里面哪些数据类型能放,哪些不能放。

  • switch里面可以放的数据类型有:char,byte,short,int,String,enum(枚举)
  • switch里面不可以放的数据类型有:long,float,double,boolean

6.方法的使用

如何定义一个方法

权限访问修饰符 (静态关键字) 返回值类型 方法名(){
    语句;
}
public static void fun1(){
    
}

可变长参数

在Java里面引入了一个新的概念叫做可变长参数,比如说我要做很多数的加法,我总不能一个个的去定义变量对吧!这个时候就可以用到可变长参数:

public class Test {

    //两个数字的加法
    public static int add(int a, int b) {
        return a + b;
    }

    //三个数字的加法
    public static int add(int a, int b, int c) {
        return a + b + c;
    }

    //如果要做很多数的加法怎么办呢?我猜同学们一下子就会想到数组
//    public static int add(int[] arr) {
//        int sum = 0;
//        for (int i = 0; i < arr.length; i++) {
//            sum = sum + arr[i];
//        }
//        return sum;
//    }

    /**
     * 在Java中引入了可变长参数的概念,我们来看看这究竟是什么东西,当我把这个东西
     * 定义出来之后,你会发现上面那个参数是数组的方法报错了,这是为什么呢?我们知道
     * 方法的重载参数列表必须是不一样的,既然报错了,那是不是就说明这个可变长参数,
     * 其实本质上就是数组呢?其实就是这样的。其实就是一个数组。但是用起来会比数组
     * 更方便一点。
     */
	//可变长参数写法:类型... 变量名; 只能是三个点阿!不能是n个点
    public static int add(int... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum + arr[i];
        }
        return sum;
    }

    public static void main(String[] args) {
        //两个参数
        int ret1 = add(1, 2);
        System.out.println(ret1);

        //三个参数
        int ret2 = add(1, 2, 3);
        System.out.println(ret2);

        //多个参数,数组写法
        //int ret3 = add(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
        //System.out.println(ret3);

        //多个参数,可变长参数写法,会比数组写起来更方便一点
        int ret4 = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        System.out.println(ret4);
    }
}

什么是重载

重载的特点:

  1. 方法名必须相同。
  2. 方法参数类型,顺序,个数必须不同。
  3. 与方法返回值无关。
  4. 不一定在同一类里才能发生重载,不在同一个类里,继承关系下也能发生重载。

什么是重写

重写的特点:

  1. 方法名必须相同。
  2. 方法参数类型,顺序,个数必须相同。
  3. 返回值没有特殊情况必须一样,特殊情况如果父类和子类构成协变类型的话,返回值就可以不一样。
  4. 不能重写private,static,final所修饰的方法。
  5. 子类重写的方法的访问权限必须大于等于父类。

面试题

面试官问你重写和重载的区别是什么,你是不是就可以把上面这几点说给他听。

7.数组的使用

数组的概念

在Java里面数组也是一个引用类型。

如何定义一个数组

public static void main(String[] args){
    //三种创建方式
    int[] arr1 = new int[10];
    int[] arr2 = {1,2,3,4,5,6,7,8};
    int[] arr3 = new int[]{1,2,3,4,5,6,7,8};
}

如何遍历一个数组

public static void main(String[] args) {
    //三种方式
    int[] arr1 = new int[10];
    int[] arr2 = {1, 2, 3, 4, 5, 6, 7, 8};
    int[] arr3 = new int[]{1, 2, 3, 4, 5, 6, 7, 8};

    //1.for循环
    for (int i = 0; i < arr1.length; i++) {
        System.out.println(arr1[i]);
    }
    System.out.println("=============================");
    //2.for-each增强型for循环
    for (int x : arr2) {
        System.out.println(x);
    }
    System.out.println("=============================");
    //3.Arrays工具类里面的toString方法
    System.out.println(Arrays.toString(arr3));
}

数组可以当作为返回类型

在Java里面可以返回一个数组了,可以将数组作为返回值了,我记得在C语言里面是做不到的。

public class Test2 {

    //数组作为返回值
    public static int[] fun1() {
        int[] arr = new int[10];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i + 1;
        }
        return arr;
    }

    public static void main(String[] args) {
        int[] ret = fun1();
        System.out.println(Arrays.toString(ret));
    }

}

二维数组

在Java里面二维数组其实是一种特殊的一维数组,他长什么样子的呢?

image-20230411190606618

//二维数组的定义,遍历什么的我就不写了,大家知道就行
public static void main(String[] args) {
    int[][] arr = {{1, 2, 3}, {4, 5, 6}};
}

8.类和对象

什么是类

类是描述一个对象的属性和行为的集合。

类里面有属性和方法:

  • 属性分为两个:
    • 普通成员属性:属于对象的属性,存放在对象当中,要想访问这个属性,必须先得有这个对象才行。
    • 静态成员属性:属于类的属性,存放在方法区,想要访问这个属性,直接通过这个类就可以访问。
  • 方法分为两个:
    • 普通成员方法:属于对象的方法,想要调用这个方法,也必须得有这个对象才行。
    • 静态成员方法:属于类的方法,想要调用这个方法,通过类去调用就可以访问到。

什么是对象

对象就是通过我们定义好的一个类,来构造出一个实体出来,类就像是一个模板,我们通过这样的模板,去实实在在创造一个实体出来,这就叫实例化对象。并且一个类可以实例化多个对象。

构造方法

  1. 方法名和类名相同,没有返回值。
  2. 作用:为了帮助我们的成员属性进行初始化。
    • 就地初始化:public int age = 16;
    • 默认初始化:就是什么值也不给,默认会有一个初始值。
  3. 当我们没有添加任何一个构造方法的时候,编译器会默认为我们添加一个无参的构造方法,如果我们自己写了构造方法,那么编译器就不再提供无参的构造方法了。
  4. 构造方法也可以发生重载。

this关键字

  1. this是当前对象的应用。
  2. this.data; 可以通过this来访问类里面的成员属性。
  3. this.func(); 可以通过this来访问类里面的成员方法。
  4. this(); 可以通过this来访问构造方法。但是必须是放在构造方法里的第一行,并且不能嵌套调用构造方法。
  5. 静态方法里面不能使用this关键字。

封装

封装是指我们有一些属性不想被你直接访问到,我们想隐藏这些细节,就会通过private来修饰我们的成员属性或者是成员方法,加上private关键词之后,被私有化的属性和方法,就只能在当前内里面使用,出了当前内就访问不到了,如果想要访问的话,可以写一些公开的接口,比如说get和set方法。就可以通过这些方法来间接的访问我们私有化的属性。

包的概念

包其实就是一个文件夹,不同的包里,可以存在两个同名的文件,包的作用就是为了方便我们更好的管理这些类。然后还记得导包用的是哪个关键字吗?import对不对,这个关键字要牢记阿!

访问修饰限定符
  • private:只能在当前类访问。

  • 包访问权限(default):只能在当前类或者是当前包中能访问。

  • protected:只能在当前类或者是当前包中能访问,或者是不同包下的子类,通过super关键字来访问。

  • public:哪里都可以访问得到。

static关键字

被static修饰的属性和方法,被称为静态属性和静态方法,他们不依赖于对象的,就是说不需要通过对象,也可以访问,只需要通过类名就可以调用静态属性和静态方法。并且在静态方法里面是不能调用非静态的属性和方法,因为非静态的属性和方法,是依赖于对象的,所以没有办法直接在静态方法里调用。

代码块

  1. 实例代码块

    class Person{
        //实例代码块
        {
            
        }
    }
    
  2. 静态代码块

    class Person{
        //静态代码块
        static{
            
        }
    }
    
  3. 局部代码块

    这个几乎用不到,就不举例了。

  4. 同步代码块

    这个以后会遇见的,到时候再讲吧!

当代码块和构造方法一起出现的时候,他们执行顺序是:先是静态代码块并且他只会执行一次,然后是实例代码块,然后是构造方法。

内部类

  1. 静态内部类

    //静态内部类的定义
    class Outter {
        static class Inner {
    
        }
    }
    
    public class Test2 {
    
        public static void main(String[] args) {
            //静态内部类实例化
            Outter.Inner inner = new Outter.Inner();
        }
    }
    
  2. 非静态内部类

    //非静态内部类的定义
    class Outter2 {
        class Inner2 {
    
        }
    }
    
    public class Test2 {
    
        public static void main(String[] args) {
            //非静态内部类的的实例化
            Outter2 outter2 = new Outter2();
            Outter2.Inner2 inner2 = outter2.new Inner2();
        }
    }
    
  3. 匿名内部类

    public static void main(String[] args) {
        //匿名内部类:没有名字的类,常用来实现接口
        new Runnable(){
            @Override
            public void run() {
                System.out.println("你好世界");
            }
        };
    }
    

继承

大家思考一下为什么要有继承,继承是用来干什么的,继承就是为了实现对我们的代码的复用,如果有两个类里面有同样的东西,我们就可以对这两个类进行一个共性的抽取,然后让这两个类,去继承另一个类,从而实现对代码的优化。

继承关键字

继承的关键字是extends,当子类继承父类的时候,子类会继承父类里不是static,final所修饰的成员属性和方法,并且Java是单继承,一个子类只能继承一个父类。

//当父类里面有属性和方法的时候,子类继承父类,子类也会拥有父类的属性和方法
class Animal{
    public String name;
    public int age;
    
    public void func(){
        
    }
}

class Dog extends Animal{
    
}
super关键字

super是用来指代父类的引用,他有哪几个作用,大家还记得吗?

  1. super.data; 通过super来访问父类的成员属性
  2. super.func(); 通过super来访问父类的成员方法
  3. super(); 通过super来访问父类的构造方法,这个特性必须放在构造方法里的第一行,并且也不能嵌套调用。

面试题:面试官问你super和this的区别是什么,你什么就可以把以上这几点给他讲讲。

再谈代码块

如果父类和子类里面都有静态代码块,非静态代码块和构造方法的话,执行顺序是怎样的呢?

执行顺序是:父类的静态代码块,然后是子类的静态代码块,然后再是父类的非静态代码块和构造方法,最后是子类的非静态代码块和构造方法

final关键字的使用
  1. final所修饰的变量,就称为常量,因为他不可被修改。
  2. final所修饰的方法,不能被重写。
  3. final所修饰的类,不能被继承。

多态

多态就是给的东西不同,我能给你展现的功能就不一样,就像是一个电脑的USB接口,你插上U盘,他就可以给你自动读取里面的数据。插上键盘,就可以敲代码。我们正是需要这种思想来帮助我们简化代码。完成更多的功能。

多态的实现条件

在Java中要实现多态,必须满足以下条件:

  1. 必须要继承一个类。
  2. 子类必须重写父类的方法。
  3. 通过父类的引用来调用子类重写的方法。

多态里面最重要的就是重写了,如果子类没有重写父类的方法,没有体现出区别,那多态就没什么意义了。关于重写可以看看前面方法那块,这里就不做过多赘述了。

向上转型

还记得向上转型吗?就是通过父类去接收子类的实例,然后通过父类的引用调用子类重写父类里的方法,这就是向上转型,我们说向上转型是有缺点的,就是他只能访问父类自己的成员,不能访问子类的成员。

向下转型

我们之前说过向下转型很不安全,把一个大的东西,放到一个小的东西里面,肯定是有风险的,所以我们常常会搭配instanceOf关键字来一起使用,在使用前先检查检查,确定这个对象里面是我想要的对象,然后再通过这个对象去调用自己的方法。

9.抽象类和接口

抽象类

还记得抽象类的特点吗:

  1. 里面可以有抽象方法,也可以有普通方法。
  2. 不能被实例化。
  3. 子类继承了抽象类,必须要把抽象类里面的抽象方法给重写了。
  4. 类和方法都是被abstract所修饰。
  5. 抽象方法不能被private,static,final给修饰,因为抽象方法存在的意义就是被重写。你加上这些东西就不能重写了。
  6. 抽象方法没有方法体。
  7. 抽象类里面可以没有抽象方法,但是如果里面有抽象方法的,一定只能是存在抽象类里面。
  8. 虽然不能被实例化,但是可以发生向上转型。

以上这几点,你都记住了吗?

接口

还记得接口的特点吗:

  1. 成员属性默认是被public static final所修饰的。
  2. 成员方法默认是被public abstract所修饰的。
  3. 接口里面可以有default方法。
  4. 不能被实例化
  5. 实现接口的关键字是implements,当一个类实现这个接口的时候,必须重写里面的方法。
  6. 一个类可以实现多个接口。
  7. 接口里面可以有静态方法。

面试题:面试官问你接口和抽象类的区别是什么,你就可以把这上面几点说给他听。

10.String类的使用

我们说String这个类型声明出来的字符串是不可修改的,因为底层的value数组是被private所修饰的,所以我们拿不到这个value数组,所以也没有办法修改它,所以你对字符串的任何一个操作,什么toUpperCase,toLowerCase这些都是创建了一个新的字符串,并没有在原来的基础上做出改变。如果想要改变字符串里面原本内容,最好用StringBuilder和StringBuffer这两个类,因为这两个类的字符串可以被修改。面试官如果问你他们三个有什么区别,你怎么回答。

他们三者的区别:

  1. String类型的字符串是不可修改的,而Stringbuilder和StringBuffer这两个字符串是可以修改的。
  2. StringBuilder是线程不安全的,因为里面的方法没有加锁,而StringBuffer是线程安全的。里面的方法都加了锁。

11.异常的使用

异常我们讲的最多就是那五个关键字,大家还记得是哪五个吗?分别是throw,throws,try,catch,finally这是异常里面最关键的东西,把这五个学好。你就很厉害了。还记得他们作用是什么吗?

throws:用来申明一个异常,一般放在方法参数列表后面,花括号的前面。只能抛出Exception和Exception子类的异常。

throw:用来抛出一个异常,一般放在方法体里面。只能抛出Exception和Exception子类的异常。

try:用来存放有异常的语句。当然没有异常的语句也可以往里放。

catch:用来捕获一个异常。如果有多个异常的时候,可以写多个catch,如果异常里面有父子类关系的话,把子类放在前面,父类放在后面。

finally:用来释放各种连接资源。通常放在catch语句块之后,也可以放在try语句块之后。这个语句块的特点就是,无论程序如何执行,最后一定会执行里面的代码。

总结

以上就是我对JavaSE里的语法做的总结,我并没有把每一点都拿来讲,我就挑了一些我觉得比较重要的,然后敲代码也会经常用到的一些点放到上面了。然后看到这里,希望大家也能和我一样把知识点进行一个复盘。这样你会越学越好的。

致谢

感谢你一路看到这里,如果你觉得我写的不错的话,请给我一键三连!!!😉😉

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值