给函数传递参数时, 若为基本类型,则为值拷贝,是两个不同的变量;若为对象,则为引用指向同一个对象。
y为数,if(x=y)这种使用=方式会报错, java 不会自动的将 int 转换成 boolean 类型
比较两个对象的内容, 使用所有对象(不包括基本类型)中都存在的equals()方法
对于 == 和 != 这两个关系运算符来说,它们有两种使用场景:
- 作用于基本数据类型: 比较的是值
- 作用于对象: 比较的是内存地址
equals()的两种使用情况:
&& 和|| 运算符具有短路特性
增强版 for 循环, 定义了一个 float 类型的变量 x,继而将每一个 f 的元素赋值给它.
for(float x: f){ System.out.println(x); }
面向对象具有四大基本特点 抽象:属性和行为形成类,用类去构造实例;封装:属性和行为封装成类,来严格的访问控制;继承:在类基础上扩展形成新类;多态:同一函数具有不同功能。
访问权限, 从“最大权限”到“最小权限”依次是public、protected、包访问权限、private
所谓包访问权限,就是如果不对这个成员(类、字段、方法)提供访问修饰符,那么这个成员就可以被同一个包中的所有方法访问,但是这个包之外的成员无法访问。包访问权限也称默认访问权限
protected也提供包访问权限,不同于包访问权限的是:即使父类和子类不在同一个包下,子类也可以访问父类中具有 protected 访问权限的成员。(而对于包访问权限来说,如果子类和父类不在一个包下,子类是无法访问父类中具有包访问权限的成员的)
构造函数总是伴随着 new 操作符的执行被调用, 构造函数与类同名;每个类可以有一个以上的构造函数;构造函数可以有 0 个、1 个或多个参数;构造函数没有返回值;类中没有构造器,那么编译器就会自动为你创建一个无参构造器,一旦你显式地定义了构造器(无论有参还是无参),编译器就不会自动为你创建无参构造器。
重载 允许方法具有相同的方法名但接收的参数不同。
this 关键字 只能在非静态方法内部使用,static 方法中不会出现 this。因为 static 是为类而创建的,不需要任何对象。
初始化
初始化块 代码块的调用顺序为:静态初始化块、非静态初始化块、构造函数
class Root { // 静态初始化块 static{ System.out.println("Root的静态初始化块"); } // 非静态初始化块 { System.out.println("Root的普通初始化块"); } public Root(){ System.out.println("Root的无参构造器"); } }
重写重载 重写不仅方法名相同,参数列表和返回类型也相同;@Override
注解即表示方法重写,不过这个也可以不写,JVM 能够自动的识别方法覆盖。在覆盖一个方法的时候,子类方法不能低于父类方法的可见性。特别是, 如果超类方法是 public, 子类方法一定要声明为 public。
向上转型和向下转型
Animal cat = new Cat(...); // 向上转型 Cat->Animal
Animal animal = new Cat(...); // 向上转型 Cat->Animal Cat cat = (Cat) animal; // 向下转型
抽象类 抽象方法和抽象类都必须声明为 abstract,但除了抽象方法之外,抽象类还可以包含具体数据和具体方法。使用extends来扩展子类。
接口 关键字 interface 而不是 class 来创建接口,接口中是不能包含具体方法的。使用 implement来扩展实现类。接口中是允许出现常量的,将被自动被设置为 public static final 类型。
为什么有抽象类还要有接口,因为一个类可以实现多个接口,但是一个类只能继承一个父类