黑马程序员java自学之--自测题

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

package com.itheima;

/**
 * 第1题: 1、 以下代码哪个是正确的?为什么? a. byte b = 1 + 1; b. byte b = 1; b = b + 1; c. byte
 * b = 1; b = b += 1; d. byte b = 1; b = ++b;
 * @author Administrator
 *
 * 第1题选择正确答案a
 */
public class Test1 {
    public static void main(String[] args) {
        /*//选项a检验
        byte b = 1 + 1;//类型自动提升时右边1+1为常量int类型答案为2,byte的范围为-128~127,而2在byte类型的范围中可以给byte
        //答案正确
        */
        
        /*//选项b检验
        byte b = 1;//此处的int为1,在byte的-128~127的数字范围中,可以赋给b
        b = b + 1;//此处编译不通过。因为b为一个因为在自动类型提升时b+1结果转换为int,在不损失精度的前提下int类型要强制转换为byte类型
        //答案错误
        */
        
        /*
        //选项c检验
        byte b = 1;//此处的int为1,在byte的-128~127的数字范围中,可以赋给b
        b = b +=1;//此处运算因为b是一个变量。运算时先算右边b=b+1,再赋给b,在算b=b+1时错误原因同b选项一样。
        //答案错误
        */
        
        /*选项d检验
        byte b = 1;//此处的int为1,在byte的-128~127的数字范围中,可以赋给b
        b = ++b;//此处运算为b先加1变为一个byte数b,再把b赋给b,在运算++b的时候错误原因同b选项,可能变量改变时超出byte的-128~127的范围。
        //答案错误
        */
    }

}

package com.itheima;

import java.util.Scanner;

/**
 * 第2题、 从键盘接受一个数字,打印该数字表示的时间,最大单位到天,例如: 键盘输入6,打印6秒; 键盘输入60,打印1分; 键盘输入66,打印1分6秒;
 * 键盘输入666,打印11分6秒; 键盘输入3601,打印1小时1秒
 *
 * @author Administrator
 *
 */
public class Test2 {
    public static void main(String[] args) {
        toTime();
    }

    public static void toTime() {
        int minutes = 0;
        int hours = 0;
        int days = 0;
        Scanner in = new Scanner(System.in);
        int seconds = 0;
        System.out.println("请输入一个整数(0表示退出)");
        while ((seconds = in.nextInt()) != 0) {
            days = seconds / (24 * 60 * 60);//获取天
            seconds %= (24 * 60 * 60);//得到获取天后的秒数
            hours = seconds / (60 * 60);//获取小时
            seconds %= (60 * 60);//得到获取小时后的秒数
            minutes = seconds / 60;//获取分钟
            seconds %= 60;//获取秒
            System.out.println((days == 0 ? "" : days + "天")
                    + (hours == 0 ? "" : hours + "小时")
                    + (minutes == 0 ? "" : minutes + "分")
                    + (seconds == 0 ? "" : seconds + "秒"));
        }

    }

}

package com.itheima;
/**
 * 第3题。 定义一个二维int数组,编写代码获取最小元素。
 * @author Administrator
 *
 */
public class Test3 {
    public static void main(String[] args) {
        getMinIntArray();
    }
    public static void getMinIntArray(){
        int[][] arr = {{12,19,0},{59,29,10},{31,-4,90}};//定义一个二维int数组
        int min = arr[0][0];
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if(arr[i][j] < min){
                    min = arr[i][j];
                }
            }
        }
        System.out.println("int二维数组中最小的是:" + min);
    }
}


package com.itheima;
/**
 * 第4题。编程计算3乘8等于几,什么方法效率更高?
 * @author Administrator
 *思路:3*8.可以看到8=2*2*2,所以可以把3想做左移3位,因为左移一位为乘以2.
 */
public class Test4 {
    public static void main(String[] args) {
        System.out.println(3<<3);
    }
}


package com.itheima;

/**
 * 第5题.分析运行结果,说明原理。(没有分析结果不得分)
 * class A {
 *  void fun1() {
 * System.out.println(fun2()); }
 * int fun2() { return 123; } }
 *  public class B extends A
 * { int fun2()
 * { return 456; }
 *  public static void main(String args[])
 * { B b = new B();
 * b.fun1();
 * A a = b;
 * a.fun1(); } }
 *
 * @author Administrator
 * 分析结果:
 * 类A有fun1,fun2两个方法,类B是继承的类A并且类B覆盖了父类A的fun2;
 * 在产生一个一个B类的对象b时,b调用fun1,而在类B中没有直接写fun1方法,但是父类B写了这个方法
 * 所以使用父类A的fun1,而在父类A中的这个fun1函数在内部调用调用fun2方法,而在类B中覆盖了此方法,所以使用类B的fun2方法、
 * 在产生一个A类的对象a时,是引用a指向对象b,而b对象是B类的一个对象,这里使用了多态性,父类的引用指向子类的实例
 * 所以对象a在调用fun1时使用的还是父类A类的fun1方法,而在A类中调用fun2方法,此时使用的是B类覆盖的fun2方法。
 */
public class Test5 extends A{
    int fun2()
     { return 456;
     }
     public static void main(String args[])
    {
         Test5 b = new Test5();
     b.fun1(); //打印456;
     A a = b;
     a.fun1(); //打印456
     }
}
class A {
     void fun1()
       {
           System.out.println(fun2());
       }
     int fun2()
       {
           return 123;
       }
 }

package com.itheima;
/**
 *  第6题.
 *  定义一个包含私有成员变量和函数的类,再定义一个内部类,在内部类函数中访问外部成员变量,并调用外部函数。
 *  在外部类函数中创建内部类对象,调用内部类函数。
 * @author Administrator
 *
 */
public class Test6 {
    private int Test6x = 8;
    public void showX(){
        System.out.println("外部类打印变量:"+Test6x);
    }
    class A{
        private int Ax = Test6x;
        public void AShowX() {
            showX();
            System.out.println("内部类打印变量:"+Ax);
        }
    }
    public static void main(String[] args) {
        Test6 test = new Test6();
        Test6.A a = test.new A();
        a.AShowX();
    }
}

package com.itheima;

/**
 * 第7题. 编写一个可以获取文件扩展名的函数,形参接收一个文件名字符串,
 *  返回一个扩展名字符串。
 *
 * @author Administrator
 *
 */
public class Test7 {
    public static void main(String[] args) {
        getExtensionName("afahgo.fasdf.txt.jpg");
    }

    public static void getExtensionName(String filename) {
        int index = filename.lastIndexOf('.');//获取最后一个“.”的位置
        String s = filename.substring(index+1);//获取最后一个"."的之后的子串。
        System.out.println(s);
    }
}

package com.itheima;
/**
 * 第8题.throw和throws有什么区别?
 * try、catch、finally分别在什么情况下使用?
 * @author Administrator
 *
 */
public class Test8 {
    /*
     * throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
     * throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。
     * try用来写可能产生异常的代码,
     * catch用来捕获try代码中产生的异常,并进行处理或抛出,
     * finally是始终执行的代码块,常用于关闭资源。
     * catch就是对相应的try的监视,相应的try中产生了异常,catch就会捕获来处理,
     * finally是不管try和catch写了什么都会执行代码,就算有return,finally中的代码也会执行,当然强行关闭程序,
     * 就可能执行不到。
     * */
}

package com.itheima;
/**
 * 第9题. 写一个正则表达式,可以匹配尾号5连的手机号。
 * 规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。例如:18601088888、13912366666
 * @author Administrator
 *
 */
public class Test9 {
    public static void main(String[] args) {
        regxDemo("15343255555");
    }
    public static void regxDemo(String str){
        /*
         * [1]表示第一个数字为1
         * [3458]表示第二个为数字3或4或5或8
         * \d{4}表示四个为数字
         * (\d)表示把这个数字封装为一个组
         * \1{4}表示取封装的1的组而且出现四次
         * */
        String reg = "[1][3458]\\d{4}(\\d)\\1{4}";
        boolean b = str.matches(reg);
        System.out.println(b);
    }
}

package com.itheima;


/**
 * 编写函数,从一个字符串中按字节数截取一部分, 但不能截取出半个中文(GBK码表), 例如:从“HM程序员”中截取2个字节是“HM”,
 * 截取4个则是“HM程”,截取3个字节也要是"HM" 而不要出现半个中文
 *
 * 思路:
 *    汉字的默认编码gbk。
 *    所以一个汉字两个字节。都是负数。
 *    只有判断最后一个字节是否是负数。
 *    如果是,就往前继续看有多少负数。如果是偶数个,不舍弃。
 *    如果是奇数个,即舍弃最后一个字节。
 */
public class Test10 {
    public static void main(String[] args)
    {
        System.out.println(getString("abzM你好哈哈哈", 5));
    }

    public static String getString(String str, int n)
    {
        byte[] arr = str.getBytes();
        int count = 0;
        for(int x = n-1; x>=0; x--)
        {
            if(arr[x]<0)
            {
                count++;
            }
            else
                break;
        }

        if(count%2==0)
            return new String(arr,0,n);
        else
            return new String(arr,0,n-1);
    }
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值