1.关于>>和<<(20190710)
左移n位 右移n位
正数 乘以2的n次方 对2的n次方取模
负数 用0填充最低位 用符号位填充最高位
用>>>运算时会用0填充最高位而不是符号位
2 关于Java值传递和引用传递的理解(20190714)
2.1按值传递与引用传递
按值传递是指将所有的参数的拷贝传递给方法,方法不能修改传递给他的值任何参数的内容。
引用传递是指在调用方法时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
注:java中对象名是指对对象的引用
2.2对于基本数据类型的传递
基本数据类型的传递是按值传递。
`public static void main(String[] args) {
int num = 5;
add(5);
System.out.println(num);
}
private static void add(int a) {
a=a+5;
}
`
输出为5
证明在add方法对参数的操作并没有影响到程序中保存的num值,这符合按值传递的定义。
2.3对于对象当作参数传递到方法中
在java中程序中的对象名中即为对象的引用。
这个前提下传入方法的是这个对象的一个引用,我们先假设将对象传递进方法是引用传递,那么如果我们将这个引用指向一个新的对象,原有的对象应当指向这个新的对象。
依据代码做判断,如下:
public static void main(String[] args) {
People p1=new People("张三",15);
People p2 = new People("李四",15);
swap(p1,p2);
System.out.println(p1);
System.out.println(p2);
}
private static void swap(People a,People b) {
People p = new People("王六",18);
p=a;
a=b;
b=p;
}
输出:
People [name=张三, age=15]
People [name=李四, age=15]
很明显,方法外的对象名并没有指向在方法内创建的新的对象,证明在方法内对这个参数进行指向的改变并没有影响到方法外这个对象名的内容。这证明将对象当作参数传递到方法中并不是引用传递。
ps:对象引用的定义
每种编程语言都有自己的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。
所有这些在 Java 里都得到了简化,一切都被视为对象。因此,我们可采用一种统一的语法。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用”。
3.关于权限修饰符(20190719)
对于权限修饰符的表格一般来说是一个比较简单的问题。
权限修饰符
当前类 同一包下的类 不同包下的子类 不同包下的非子类
public 1 1 1 1
protected 1 1 1 0
默认 1 1 0 0
private 1 0 0 0
0代表不能访问,1代表能访问
我偶然间发现一个关于protected的问题,令我非常迷惑。
大致的问题就是我在子类中,无法new一个父类的对象去访问父类的protected域。
我在一卷227页发现书里说 ‘不能在代码中直接调用 object.clone 方法,因为protected修饰符比较微妙
第五章关于protected修饰符有大致这么一个说法,
为了避免滥用受保护机制,子类中的方法只能访问子类对象中的protected域,不能访问其他的父类的对象的protected域。
所以这个问题还真的是一个规定。
4.反射
作用:
在运行时分析类的能力。
在运行时查看对象。
实现通用的数组操作代码。
利用Method对象。
4.1 获取class类
1.对象.getclass()
2.Class.forName("className")
3.T.class
4.2 分析类
在java.lang.reflect包中有可以分析具体某类信息的
Field 类的域
Method 类的方法
Constructor 类的构造器
可以通过这三个类的方法去访问这个类的相应的信息。
4.3分析对象
1.获取对象对应的class对象
2.通过class对象调用Field的相应方法(getDeclaredFields)获取域
3.用与对象去获取原始对象的这个域的值
ps:setAccessible 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
4.4创建泛型数组
java.lang.reflect 中的Array类允许动态创建数组
Array.newInstance(元素类型,数组长度);
获取要创建的数组的类的class对象
调用方法
4.5调用类的任意方法
1.获取对象对应的class对象
2.通过class对象获取想要调用的Method对象(1.getDeclareMethods 方法获取所有方法再对数组进行匹配 2. getMethod获取单个方法)
3.使用invoke方法调用步骤2找到的方法
4.6创建一个新的对象的实例
Class对象.newInstacne();//调用无参构造方法
Constructor.newInstance(Object... initargs)
使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。