java

一个Java源文件可以包含多个类的定义,但只能定义一个public类,且public类名必须与文件名一致。如果要定义多个public类,必须拆到多个Java源文件中


基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响
引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)


方法可以让外部代码安全地访问实例字段,外部代码通过public方法操作实例,内部代码可以调用private方法


如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法
没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int类型默认值是0,布尔类型默认值是false


Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类。只有Object特殊,它没有父类
子类无法访问父类的private字段或者private方法;protected允许子类访问父类的字段和方法

子类自动获得了父类的所有字段,严禁定义与父类重名的字段!

可以安全地向上转型为更抽象的类型,可以强制向下转型,最好借助instanceof判断

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

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

继承是 is 关系,组合是 has 关系


Override和Overload不同的是,如果方法签名不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override

Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型

多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法


final修饰符有多种作用:

  • final修饰的方法可以阻止被覆写;
  • final修饰的class可以阻止被继承;
  • final修饰的field必须在创建对象时初始化,随后不可修改

通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;

定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;

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

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

这种尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程


面向抽象编程的本质就是:

  • 上层代码只定义规范(例如:abstract class Person);
  • 不需要子类就可以实现业务逻辑(正常编译);
  • 具体的业务逻辑由不同的子类实现,调用者并不关心

所谓interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。因为接口定义的所有方法默认都是public abstract的,所以这两个修饰符不需要写出来(写不写效果都一样)

接口中可以定义default方法,实现类可以不必覆写default方法。default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。

default方法和抽象类的普通方法是有所不同的。因为interface没有字段,default方法无法访问字段,而抽象类的普通方法可以访问实例字段

abstract class interface
继承 只能extends一个class 可以implements多个interface
字段 可以定义实例字段 不能定义实例字段
抽象方法 可以定义抽象方法 可以定义抽象方法
非抽象方法 可以定义非抽象方法 可以定义default方法

静态字段属于所有实例“共享”的字段,实际上是属于class的字段;

调用静态方法不需要实例,无法访问this,但可以访问静态字段和其他静态方法;

静态方法常用于工具类和辅助方法


Java内建的package机制是为了避免class命名冲突,包名推荐使用倒置的域名,例如org.apache

JDK的其它常用类定义在java.util.*java.math.*java.text.*,……

编写class的时候,编译器会自动帮我们做两个 import 动作:

  • 默认自动import当前package的其他class
  • 默认自动import java.lang.*

如果不确定是否需要public,就不声明为public,即尽可能少地暴露对外的字段和方法

把方法定义为package权限有助于测试,因为测试类和被测试类只要位于同一个package,测试代码就可以访问被测试类的package权限方法

一个.java文件只能包含一个public类,但可以包含多个非public类。如果有public类,文件名必须和public类的名字相同


JVM通过环境变量classpath决定搜索class的路径和顺序;

不推荐设置系统环境变量classpath,始终建议通过-cp命令传入;

jar包相当于目录,可以包含很多.class文件,方便下载和使用;

MANIFEST.MF文件可以提供jar包的信息,如Main-Class,这样可以直接运行jar包

posted @ 2023-03-06 21:25  黄一洋  阅读(9)  评论(0)    收藏  举报