public boolean totalValueBiggerThan(MerchandiseV2 merchandiseV2) {
return count * purchasePrice > merchandiseV2.purchasePrice * merchandiseV2.count;
}
boolean m0BiggerThan = m0.totalValueBiggerThan(m);
解释:m0调用totalValueBiggerThan方法,则count * purchasePrice这两个变量都取m0的成员变量,只是省略了this.count和this.purchasePrice这两个变量,后面的merchandiseV2.purchasePrice * merchandiseV2.count即m2.purchasePrice*m2.count
-
在构造方法里才能调用重载的构造方法,语法为this(实参列表)
构造方法不能自己调用自己
调用重载的构造方法时,不可以使用成员变量
构造方法中调用重载的构造方法时,必须是方法的第一行 -
静态变量用static修饰
静态变量不赋值java也会按其类型赋予初始值
静态变量全大写 -
一般用private修饰构造函数,使用public static来创建构造函数中的成员变量,再创建public get方法获取成员变量
-
数组的单纯创建方式为:arrayRefVar = new dataType[arraySize];数组的声名+创建方式为dataType[] arrayRefVar = new dataType[arraySize],也可以dataType[] arrayRefVar = {value0, value1, ..., valuek};类实例化的方式为Test t = new Test()
元素为引用数据类型的数组中的每一个元素都需要实例化
- 动态初始化,数组定义与为数组元素分配控件和赋值的操作分开进行。
int[ ] a; //定义数组,即声明一个int类型的数组a[ ]
a=new int[3]; //给数组元素分配内存空间。
a[0]=3; a[1]=9; a[2]=8; //给数组元素赋值。
- 静态初始化,在定义数组的同时就为数组元素分配空间并赋值。
int[ ] a = { 3, 9, 8};
-
如果父类里没有无参构造方法,子类里实现无参构造方式时必须在构造方法第一行用super调用一个有参构造方法;
可以用子类的引用给父类的引用赋值,也就是说,父类的引用可以指向子类的对象:举个例子
正常是 Phone ph = new Phone(),但Phone继承于Merchandise()时可以写成:
public class Phone extends Merchandise()
Merchandise m2 = new Phone()
这里,能调哪些方法,是引用决定的,具体要执行哪个类的方法,是引用指向的对象决定的。 -
重载overloading调用哪个方法只取决于参数的引用类型有关,与引用指向的对象无关
-
instanceof 操作符,可以判断一个引用指向的对象是否是一个类型或其子类,如果引用为null则返回false
-
pretected访问修饰符可以让不同包里的子类调用
类内部 本包 子类 外部包
private
default default
protected protected protected
public public public public -
final修饰符修饰类后不能被继承,final修饰变量后必须在构造函数中初始化值且不能再被赋值,构造方法不能被final修饰,且final修饰方法后虽然能被子类继承,但不能被重写。
final修饰引用,其意义为引用指向是不能变的,但引用指向的对象是可以改变的 -
hashCode和equals是最常覆盖的两个方法,覆盖原则为 equals为true,hashCode就应该相等,即equals为true是hashCode相等的充分非必要条件,hashCode相等是equals为true的必要不充分条件
-
java的String类型变量是不可变的,声名了两个较短的String类型内容一样时,java会做优化,让这两个引用指向同一个String类型地址,如:
s1 = "aaabbb"
s2 = "aaa" + "bbb"
s1 == s2 和s1.equals(s2)都返回true
但当String很长时,他们用==比较就会返回false(因为比较的是地址),但用equals比较时会返回true(他是一位一位字符进行比较) -
反射:通过反射获得属性(其实这里没想明白,可以实例化类后直接获取属性啊,为啥还要反射获取)
摘抄大佬反射笔记:
想要使用反射,先要得到class文件对象,也就是Class类的对象
Class类主要API:
成员变量 - Field
成员方法 - Constructor
构造方法 - Method
获取class文件对象的方式:
1:Obiect类的getClass()方法
2:数据类型的静态属性class
3:Class类中的静态方法:Public static Class ForName(String classname)
获取成员变量并使用
1:获取Class对象
2:通过Class对象获取Constructor对象
3:Object obj = Constructor.newInstance()创建对象
4:Field field = Class.getField("指定变量名")获取单个成员变量对象
5:field.set(obj,"")为obj对象的field字段赋值
如果需要访问私有或者默认修饰的成员变量
1:Class.getDeclaredField()获取该成员变量对象
2:setAccessible(true)暴力访问
通过反射调用成员方法
1:获取Class对象
2:通过Class对象获取Constructor对象
3:Constructor.newInstance()创建对象
4:通过class对象获取Method对象 ------getMethod(“方法名”)
5:Method对象调用invoke方法实现功能
如果调用的是私有方法那么需要暴力访问
1:getDeclareMethod()
2:setAccessiable(true)
-
枚举,一个特殊的类,只是在声名时将calss换为enum,构造方法必须是private(一般不写也是private),且在枚举声名内开头就创建所有枚举对象,枚举就是为了限定一个类可以有的实例个数
-
接口,定义时用interface,不用class,接口中只定义方法签名和返回值,不定义实现,不能定义局部变量,也不能new一个实例,接口内方法都是public abstract修饰的,可不写
一般会有个接口文件,再来一个实现接口方法的类,用implements+接口文件名,类似于继承的extends,在主函数中可以用实现接口的类的引用,给接口的引用赋值。类似于可以使用子类的引用给父类赋值
接口可以继承,甚至多继承其他接口,继承时使用extends,继承的接口可以有重读的方法,但签名相同时返回值必须完全一样在java8中接口中允许有缺省实现的抽象方法,接口中可以有私有方法,不需要用default修饰,但还是不能有成员变量
注:如果一个类实现了两个接口,且两个接口里有相同的缺省方法,编译器会报错实现有缺省方法的接口后,面对每个缺省方法一个类可以有三种选择:
- 默默继承,相当于把这部分代码拷贝到当前类中
- 重新声明此方法为abstract,相当于把这部分代码拒之门外,对应的,这个类也必须是抽象的
- 覆盖,重新实现
-
抽象类,用abstract修饰,抽象类不可以被实例化,可以有抽象方法。@是java中的注解,@override代表此方法覆盖了父类的方法/实现了继承的接口的方法,否则会报错,相当于一种检查。
-
静态内部类:在类中用static修饰的类,可以有访问控制符,和静态方法,静态变量一样,都是类静态组成部分,内部类和外部类可以互相访问彼此的私有成员变量和方法。非公有类和静态内部类的实际区别在于能否访问类的private成员
成员内部类:在类中直接定义的类,不可以包含任何静态的成分,可以有final static的基本数据类型变量
局部内部类:类方法中定义的类,不能包含静态成分,不能有访问控制符,使用的参数是final类型
匿名类:用来创建接口或者抽象类的实例,任何可以new一个对象的地方都可以使用匿名类,不能有名字的类,不能被引用,只能在创建时用new语句来声明他们,在类的某个地方,他的特性就是某个地方类的特性,即在某类中使用匿名类,他就有和匿名类的特性/语法
-
collection类组,包含很多数据接口(list,set,map等),
ArrayList可以理解为python中的列表,初始化方式为:ArrayList<E> objectName =new ArrayList<>(); 有add()添加元素,类似append(),有get(index)访问元素,有set(index,newparms)修改元素,有remove(index)删除元素,有size()获得元素数量等。
LinkedList指链表,不再赘述
HashSet指不允许重复的集合,相当于python的set -
泛型作用:1. 告诉编译器做类型检查是否一致 2. 在使用的地方帮我们做类型强制转换
-
一个栈内存只指向一个堆地址,当该栈内存指向的堆地址改变时,之前的堆地址则变为垃圾需要被垃圾收集器清除。
-
this调用本类属性相当于python中self调用本类成员变量,this调用本类方法时this可加可不加,类内构造方法互相调用时this()必须放在调用构造方法的首行,构造方法可以调用类方法,类方法不能调用构造方法;
-
static属性可以由类名称直接调用,可以在没有实例化对象下使用;static方法只允许调用static方法或static变量,非static方法允许调用static属性和static方法
网友评论