判断推理与条件证明
/*
最近一项调查显示,近年来在某市高收入人群中,
本地人占70%以上,这充分说明外地人在该市获得高收入相当困难。
以下哪项如果为真,才能支持上述结论
正确答案: A
外地人占该市总人口的比例高达40%
外地人占该市总人口的比例不足30%
该市中低收入人群中,外地人占40%
该市中低收入人群中,本地人占不足30%
判断推理与条件证明题
已知条件:高收入人群中本地人占70%以上
推出结论:外地人占该市高收入人群的30%
证明结论:外地人在该市获得高收入相当困难
反例:如果没有其它条件,如果外地人就100人并且都是高收入人群
需要数据:外地人在本市的比例
D选项可以这么举例子:本市不存在中低收入的人群
如果不严谨,就再比如说本市就1个中低收入的本地人,3个中低收入的外地人
这个时候如果高收入外地人大于3人结论就不成立了
BC选项明显不对
*/
Java中的值传递
class Example{
String str=new String("tarena");
char[] ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
//引用类型变量,传递的是地址,属于引用传递
str="test ok";
ch[0]='g';
}
/*
String和char数组都是引用类型,引用类型是传地址的
会影响原变量的值,但是String是特殊引用类型
因为String类的值不可变,考虑到了内存安全等问题
String类存储字符串是用的char字符存储
而char字符使用final修饰
改变后会创建新的对象
方法中str副本指向了一个新的字符串,change函数形参里的str只是拿到了一个副本
但是并没有改变原本的str指向的字符串
方法中ch虽然也是一个副本,
但方法利用它修改了它所指向的字符数组中的第一个元素
方法结束后,所有副本弹出结束,
但是我们的成员变量str和ch还存在,它们依然是之前的地址
所以str的内容不变,ch第一个元素被改变
下面举一个通俗的例子
*/
public void change(char chs[]){
char[]chs2={'b'};
chs=chs2;//参数副本指向新地址
}
public void change2(char chs[]){
chs[0]='b';//参数副本还是指向原来地址,所以修改了值
}
}
重写run方法
class Bground extends Thread{
public static void main(String args[]){
Bground b = new Bground();
b.run();
}
public void start(){
for(int i=0;i<10;i++){
System.out.println("Value of i = "+i);
// 编译通过但没输出
}
}
/*
对于线程而言,start是让线程从new变成runnable
run方法才是执行体的入口
但是在Thread中,run方法是个空方法,没有具体实现
Bground继承了Thread,
但是没有重写run方法,那么调用run方法肯定是无输出
下面扔一串Thread的代码
@Override
public void run() {
if (target != null) {
target.run();
}
}
也就是,这道题故意给你挖个坑
把start和run方法调换了位置
调整过来就行了
调整过来后
由于只有一个线程,程序依次输出1-9
start我听过别人说,是一个准备工作(比如你要吃苹果,不得先洗一下,真正吃时间是洗完后)
并没有获得cpu,调用run()才是获得了cpu
*/
}
Java枚举类
enum AccountType {
SAVING, FIXED, CURRENT;
private AccountType() {
System.out.println("It is a account type");
}
}
class EnumOne {
public static void main(String[]args) {
System.out.println(AccountType.FIXED);
/*
输出:
It is a account type
It is a account type
It is a account type
FIXED
枚举类有三个实例,故调用三次构造方法
打印三次It is a account type
枚举类的每一个值都是一个对象
比如SAVING表示的就是
public static final AccountType SAVING = new AccountType();
*/
}
}
按位取反
/*
下面代码输出结果是?
int i = 5;
int j = 10;
System.out.println(i + ~j);
Compilation error because”~”doesn’t operate on integers
-5
-6
15
正确答案:C
说明:
-3按位取反 2
-2按位取反 1
-1按位取反 0
0按位取反 -1
1按位取反 -2
2按位取反 -3
相当于+1再取负数
公式法:~n=-n-1
*/
显式调用构造函数
class Person1 {
String name = "No name";
public Person1(String nm) {
name = nm;
}
}
class Employee1 extends Person1 {
String empID = "0000";
public Employee1(String id) {
super("nm"); // need to add
empID = id;
}
}
class Test {
public static void main(String args[]) {
Employee1 e = new Employee1("123");
System.out.println(e.empID);
}
}
/*
父类没有无参的构造函数
所以子类需要在自己的构造函数中
显式调用父类的构造函数
需要加入
super("nm");
否则报错:
Implicit super constructor Person() is undefined.
Must explicitly invoke another constructor
隐式父类构造函数 Person() 未定义
必须显式调用另一个构造函数
*/
Lambda表达式
/*
下面哪些写法能在 java8 中编译执行()
正确答案: A D
dir.listFiles((File f)->f.getName().endsWith(“.Java”));
dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
dir.listFiles((_.getName().endsWith(“.Java”)));
dir.listFiles( f->f.getName().endsWith(“.Java”));
Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法
它由三部分组成:
形参列表 形参列表允许省略形参类型
如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
箭头->
代码块 如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号
那么那条语句就不要用花括号表示语句结束
Lambda代码块只有一条return语句,甚至可以省略return关键字
Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句
Lambda表达式会自动返回这条语句的值
*/
定义二维数组
/*
下面哪个语句是创建数组的正确语句?( )
正确答案: A B D E
float f[][] = new float[6][6];
float []f[] = new float[6][6];
float f[][] = new float[][6]; // 编译错误
float [][]f = new float[6][6];
float [][]f = new float[6][];
也就是说
定义二维数组
两个[][]可以任意排列
但第一个中括号必须有值
*/