Java语法基础

Java语法基础

CS-Notes 面试笔记

数据类型

数据类型介绍

数据类型转换

小->大 :自动转换
大->小 : 强制转换: (int)

  • 基本数据类型 ——> String
    • val + ""
  • String ——> 基本数据类型
    • parsexx方法:如parseInt/Float

参数重载/可变参数

可变参数
将传递的参数变成一个数组

void f(int...nums)

一个形参列表只能有一个可变参数
可变参数可以和普通参数在一起,但可变参数必须要放在最后

权限修饰符

alt text

继承

在OOP的术语中,我们把Person称为超类(super class),父类(parent class),基类(base class),把Student称为子类(subclass),扩展类(extended class)。

继承树如下:

alt text

关于继承中的构造函数

在Java中,任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();

子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。

因此,如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。

向下转型/向上转型

向上转型没问题,但下转型可能会出问题

instanceof 符号
instanceof实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。如果一个引用变量为null,那么对任何instanceof的判断都为false。

多态

多态分为:

  • 对象多态
  • 行为多态

编译看左边,运行看右边

多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

多态的问题:无法调用子类的独有方法
解决方法:使用强制类型转换(转换前先使用 instanceof 判断对象的真实类型)

  • overload:重载

  • override:覆写

对于继承中对象引用类型和实际类型的一些实验

1
2
3
4
5
6
7
8
9
10
public class Main{
public static void main(String[] args){
Person p = new Person("小明",12);
Student s = new Student("小红",20,99);
Student ps = new PrimaryStudent("小军",9,100,5);
System.out.println(ps.getScore()); //ps不能使用PrimaryStudent类中的新方法
ps.run(); // PrimaryStudent run

}
}

抽象类

  • 如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法:

  • 又因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。

  • 因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。

  • 如果不实现抽象方法,则该子类仍是一个抽象类;

面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。

抽象类是为了更好得支持多态

标准javabean类

alt text

java变量

java变量分为

  • 成员变量
    • 实例成员变量
    • 静态成员变量
  • 局部变量

final

final(最终)可以修饰以下三种东西

  1. 类 (不可以再被继承)
  2. 方法(不可以被重写了)
  3. 变量(有且只能赋值一次)

java常量

用 static final 修饰的就是常量;常量所有字母都大写,单词之间用下划线分割

作用: 常量常用来记录系统的配置信息;编译时常量会被替换成字面量,保证性能一样

枚举类

alt text

enum是一个class,每个枚举的值都是class实例,因此,这些实例有一些方法

  1. name() : 返回常量名

  2. ordinal() : 返回索引

接口

java提供了一个关键字 interface 定义接口

1
2
3
4
5
6
7
jdk8 之前,只能定义常量和抽象方法
public interface 接口名{
//成员变量(常量)
//成员方法(抽象方法)
public static finalint NUM;
(public abstract) void fc(){};
}

tips:

  1. 接口不能创建对象

  2. 接口是被用来实现(implements)的,实现接口的称为实现类,一个类可以同时实现多个接口

  3. 实现类可以实现多个接口,必须重写完全部接口全部抽象方法,否则这个类必须定义成抽象类

好处

  1. 弥补了类 单继承的不足,一个类可以实现多个接口,使得类的角色更多,功能更强大

  2. 让程序可以面向接口编程,有利于解耦合

jdk8以后,接口新增3中形式的方法:
alt text

  • 静态方法不能被重写
  • 默认方法可重写也可不重写 (只有接口的实现类的对象可以调用)

新增原因:便于项目拓展和维护(当项目需要添加新功能时,如果只能新增抽象方法,会导致接口的所有实现类都要重写该方法,工作量很大, 因此如果新增实例方法就能解决这个问题)

java类的五大成分

成员变量、构造器、方法、代码块、内部类

代码块

写在类中用于初始化变量

alt text

内部类

如果一个类在另一个类的内部,这个类就是内部类

场景: 当一个类的内部,包含了一个完整的事物,且这个事物没必要单独设计成类时,就设计成内部类

分为以下四种:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

成员内部类

alt text

静态内部类

alt text

匿名内部类

是一种特殊的局部内部类

alt text

匿名内部类语法:

1
2
3
new 类或接口名(参数值){
类体(一般是方法重写)
}

对于抽象类来说,匿名内部类本质是一个子类,并且会立即创建一个子类对象。
对于接口来说,匿名内部类本质是一个实现类。

抽象类和接口本来都不能 new 一个对象,但匿名内部类通过 在其后加一个{},并重写抽象方法,实现了功能。

反编译后的calss文件代码:
alt text

作用:用于立即创建一个子类对象

常见使用形式:
作为一个对象参数 传输给 方法 使用;
alt text

Lambda 表达式

1
2
3
4
5
6
7
8
9
10
11

使用函数式接口:
IFunctionalMethod iFunctionalMethod = new IFunctionalMethod() {
@Override
public void helloWord() {
System.out.println("impl hello word");
}
};
使用lambda表达式简化
IFunctionalMethod iFunctionalMethod = () -> System.out.println("impl hello word");

lambda 只能简化 函数式接口的 匿名内部类

函数式接口 : 有且只有一个抽象方法的接口,注解是(@FunctionalInterInterface)

形式:

1
2
3
4
Swim s1 = () ->{
//重写方法的方法体
}


Java语法基础
https://cs-lb.github.io/2024/08/15/Java/Java语法基础/
作者
Liu Bo
发布于
2024年8月15日
许可协议