Java语法基础
Java语法基础
数据类型
数据类型介绍
数据类型转换
小->大 :自动转换
大->小 : 强制转换: (int)
- 基本数据类型 ——> String
val + ""
- String ——> 基本数据类型
- parsexx方法:如p
arseInt/Float
- parsexx方法:如p
参数重载/可变参数
可变参数
将传递的参数变成一个数组
void f(int...nums)
一个形参列表只能有一个可变参数
可变参数可以和普通参数在一起,但可变参数必须要放在最后
权限修饰符

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

关于继承中的构造函数
在Java中,任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();
子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。
因此,如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。
向下转型/向上转型
向上转型没问题,但下转型可能会出问题
instanceof 符号
instanceof实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。如果一个引用变量为null,那么对任何instanceof的判断都为false。
多态
多态分为:
- 对象多态
- 行为多态
编译看左边,运行看右边
多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
多态的问题:无法调用子类的独有方法
解决方法:使用强制类型转换(转换前先使用 instanceof 判断对象的真实类型)
overload:重载
override:覆写
对于继承中对象引用类型和实际类型的一些实验
1 | |
抽象类
如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法:
又因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。
因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。
如果不实现抽象方法,则该子类仍是一个抽象类;
面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。
抽象类是为了更好得支持多态
标准javabean类

java变量
java变量分为
- 成员变量
- 实例成员变量
- 静态成员变量
- 局部变量
final
final(最终)可以修饰以下三种东西
- 类 (不可以再被继承)
- 方法(不可以被重写了)
- 变量(有且只能赋值一次)
java常量
用 static final 修饰的就是常量;常量所有字母都大写,单词之间用下划线分割
作用: 常量常用来记录系统的配置信息;编译时常量会被替换成字面量,保证性能一样
枚举类

enum是一个class,每个枚举的值都是class实例,因此,这些实例有一些方法
name() : 返回常量名
ordinal() : 返回索引
接口
java提供了一个关键字 interface 定义接口
1 | |
tips:
接口不能创建对象
接口是被用来实现(implements)的,实现接口的称为实现类,一个类可以同时实现多个接口
实现类可以实现多个接口,必须重写完全部接口的全部抽象方法,否则这个类必须定义成抽象类
好处
弥补了类 单继承的不足,一个类可以实现多个接口,使得类的角色更多,功能更强大
让程序可以面向接口编程,有利于解耦合
jdk8以后,接口新增3中形式的方法:
- 静态方法不能被重写
- 默认方法可重写也可不重写 (只有接口的实现类的对象可以调用)
新增原因:便于项目拓展和维护(当项目需要添加新功能时,如果只能新增抽象方法,会导致接口的所有实现类都要重写该方法,工作量很大, 因此如果新增实例方法就能解决这个问题)
java类的五大成分
成员变量、构造器、方法、代码块、内部类
代码块
写在类中用于初始化变量

内部类
如果一个类在另一个类的内部,这个类就是内部类
场景: 当一个类的内部,包含了一个完整的事物,且这个事物没必要单独设计成类时,就设计成内部类
分为以下四种:
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
成员内部类

静态内部类

匿名内部类
是一种特殊的局部内部类

匿名内部类语法:
1 | |
对于抽象类来说,匿名内部类本质是一个子类,并且会立即创建一个子类对象。
对于接口来说,匿名内部类本质是一个实现类。
抽象类和接口本来都不能 new 一个对象,但匿名内部类通过 在其后加一个{},并重写抽象方法,实现了功能。
反编译后的calss文件代码:
作用:用于立即创建一个子类对象
常见使用形式:
作为一个对象参数 传输给 方法 使用;
Lambda 表达式
1 | |
lambda 只能简化 函数式接口的 匿名内部类
函数式接口 : 有且只有一个抽象方法的接口,注解是(@FunctionalInterInterface)
形式:
1 | |