X32专项练习部分10

本文探讨了高收入人群构成的判断推理,分析了Java中的值传递、重写run方法、枚举类实例与构造函数,以及Lambda表达式和二维数组的使用。通过实例揭示了Java中引用类型的特性,并解释了编程中的关键概念和常见陷阱。
摘要由CSDN通过智能技术生成

判断推理与条件证明

	/*
    最近一项调查显示,近年来在某市高收入人群中,
    本地人占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][];

    也就是说
    定义二维数组
    两个[][]可以任意排列
    但第一个中括号必须有值
 */

总目录

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muskfans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值