java初学笔记(一)

12 篇文章 0 订阅

Java基础

System.out.print("...")
System.out.println("...")
System.out.printf("%d %x %f %e %s", ...)
// 十进制, 十六进制, 浮点数, 科学记数法, 字符串
import java.util.Scanner;
Scanner input = new Scanner(System.in);
String name = input.nextLine();
int age = input.nextInt();
while(input.hasNext()) {
}

一、变量和数据类型

基础数据类型

  • 整数类型
    • byte(1), short(2), int(4), long(8)
  • 浮点数类型
    • float(4), double(8)
  • 字符类型
    • char(2)
  • 布尔类型
    • boolean(4)

引用数据类型

数组, 实例对象

  1. 双引号"..."表示字符串, 用"""..."""表示多行字符串(文本块)
  2. 字符串内容具有不可变特性
  3. 空值null, 表示不存在,即不指向任何对象
  4. 数组:
// 静态初始化
VarType val[] = {};
VarType[] val = {};
// 动态初始化
VarType val[n];
var val = new VarType[n];
// 多维数组,每一维都是独立的一个一维数组
  1. 遍历数组:
for(int i = 0; i < arr.length; i++) {
    arr[i];
}
for(VarType n: arr){	// Iterator模式
    n;
}
for(Iterator<?> iter = list.iterator(); iter.hasNext();) {
    iter.next();
}

修饰符

  • 访问作用域

    修饰符类内部同一个包子类其它包
    public
    protected×
    default××
    private×××
  • 状态修饰

    • final: 不可变常量
    • static: 静态变量

面向对象编程

多态

  1. 方法重写(Override)
    • 在继承类中, 使用相同的方法名称和参数(参数类型、个数、顺序相同), 可以对父类方法进行覆盖重写
    • 使用@Override装饰可以让编译器检查是否进行了正确的重写
  2. 方法重载(Overload)
    • 使用相同的方法名称和不同的参数(参数类型、个数、顺序不同)进行方法重载, 对不同参数进行相同操作, 方法重载的返回值类型通常都是相同的。
  3. 引用
    • 一个类或者接口可以引用任意其子类的实例对象,并进行操作。

方法参数

  1. 可变参数
    • 使用VarType... val的格式定义可变参数,相当于数组类型
    • 没有参数传入的时候val为空数组而不是null
  2. 参数传递
    • 基础类型是值复制传递, 互不影响
    • 引用类型是指向的复制传递, 改变指向的内容会相互影响
    • String类为不可变, 改变时指向会改变, 所以互不影响

抽象类

  • abstract修饰的类为抽象类
  • abstract修饰的方法为抽象方法
  • 抽象方法没有方法体, 声明结束以分号;结尾
  • 抽象类无法实例化, 只能被继承
  • 抽象类
    • 只能被一个class extends
    • 可以定义实例字段
    • 可以定义抽象方法
    • 可以定义非抽象方法

接口

  • 使用interface声明一个接口
  • 接口定义的所有方法默认都是public abstract, 所以可以省略不写
  • 接口只能被实现, 一个类可以实现多个接口, 使用关键字implements
  • 接口内只能声明静态常量, 默认public static final, 所有可以省略不写, 编译器会自动转换
  • 接口
    • 可以implements多个interface
    • 不能定义实例字段
    • 可以定义抽象方法
    • 可以定义default方法
interface Person {
    String getName();
    default void run() {
    // default方法无法访问实例字段
        System.out.println(getName() + " run");
    }
}

为什么要有接口

因为java中为了避免多重继承可能带来的继承关系混乱所以只允许单一继承,java为了 满足多重继承的需要,采用了规格的多重继承即接口,如果使用,即使没有继承关系的不同种类的对象也可以做共通的处理(我们可以在接口中定义一个方法,然后在两个没有继承关系的对象的不同父类中写一个相同方法签名和返回类型的方法)

接口和抽象类的区别

1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
2. 接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
3. 一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过extends关键字扩展多个接口。
4. 接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)。
5. 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。

备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实例是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然会报错。

类实现两个接口有同名方法时会发生的几种情况:

1. 两个接口方法签名相同返回类型相同时 不会编译出错,可以直接override
2. 两个接口方法签名相同返回类型不同,会编译出错。
3. 两个接口方法名相同,在实现类里这两个同名方法签名符合overload条件的话可以同时实现不会报错,只要符合overload那方法返回类型就不重要了,一样不会报错。

类实现两个接口有同名default方法时会发生的几种情况

1. 如果两个方法的方法签名相同方法返回类型相同那么需要在实现类override这个同名方法。
2. 如果两个方法方法签名相同,返回类型不同会编译出错。
3. 如果两个方法符合overload条件可以正常实现。

关于接口中的静态方法,静态变量

  • 静态变量: 可直接通过实现类或者实现类的实例直接访问到接口的静态变量,但如果多继承时这样调用会编译出错。
  • 静态方法: 无法通过实现类和它的实例访问到接口的静态方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值