• 20145231第三周学习笔记


    20145231 《Java程序设计》第3周学习总结

    教材学习内容总结

    基本概念:

    类类型:Java两个数据类型系统之一,另一个为基本类型;

    类:具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制;

    对象:存在的具体实体,具有明确的状态和行为;

    类与对象的关系:类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象;类的产生,是从少数实例,推广到大量相似的实例抽象化过程;类是对象的设计图,对象是类的实例,生成对象要先定义类;

    新建对象:使用new关键词,同时要声明参考名称,将该名称参考至新建对象;

    了解并熟悉标准类:可使用import,写出需要用到的类名称,通过建立实例、调用函数实现所需功能;

    打包基本类型:将基本类型当做对象操作,使用基本类型目的在于效率,而对象本身可以携带更多信息;

    数组在Java中在是对象,数组是用来收集数据,是具有索引的数据结构,撰写代码时将[]放在类型关键词之后;

    代表建立数组对象的类由JVM动态产生,可以将int[]这样的写法,看作类名称,根据int[]而声明的变量即为参考名称;

    用类类型建立的数组,将类型关键词从int、double等换为类名称并将每个索引参考至类类型初始值null;

    数组复制:可使用for循环结构,也可以使用System.arraycopy()方法,System.arraycopy()的五个参数分别是来源数组、来源起始索引、目的数组、目的起始索引、复制长度;

    字符串:打包字符数组的对象,可使用+号连接字符串;

    将字符串剖析为基本类型:eg:Byte.parseByte(number);

    使用javac没有-encoding选项时,会使用操作系统默认编码;

    实现对象初始化流程的封装是通过构造函数;方法封装了操作对象的流程;Java中还可以使用private封装对象的私有数据成员;封装的主要目的:隐藏对象细节,将对象当做黑箱进行操作;

    想在其他包的类程序代码中存取某包的类或对象成员,则该类或对象成员必须是公开成员,使用public进行声明;

    被声明为static的成员,属于类;在static方法或区块中不能用非static数据或非法成员;

    使用import static语法时,注意名称冲突问题;

    教材学习中的问题和解决过程

    问题一:为什么1.0-0.8不等于 0.2?

    解决过程:Java遵守IEEE 754浮点数运算规范,使用分数与指数来表示浮点数,而恰好0.1使用分数表示为无限循环,无法精确表示,从而造成运算上的误差;

    补充:为了得到更好的精确度,可以使用java.math.BigDecimal类。

    import java.math.BigDecimal;
    
    public class DecimalDemo {
        public static void main(String[] args) {
            BigDecimal operand1 = new BigDecimal("1.0");
            BigDecimal operand2 = new BigDecimal("0.8");
            BigDecimal result = operand1.subtract(operand2);
            System.out.println(result);
        }
    }
    

    运行结果如图:

    问题二:浅层复制和深层复制到底有何区别?

    解决过程:浅层复制复制的是每个索引中的参考,即将c1每个索引处参考的对象也给c2每个索引来参考,并没有真正复制出对象,而深层复制复制的是c1每个索引参考的对象;

    问题三:this关键字不能出现在被声明为static的地方?

    解决过程:不能,this在对象建立后,为“这个对象”的参考名称,在构造函数参数与对象数据成员同名时,用this加以区别;

    代码调试中的问题和解决过程

    1、提升精确度,对比两种类型中数值比较的差异,类类型中用equals()比较对象内含值是否相同;

    import java.math.BigDecimal;
    
    /**
     * Created by lenovo on 2016/3/19.
     */
    public class DecimalDemo2 {
        public static void main(String[] args) {
            BigDecimal op1 = new BigDecimal("0.1");
            BigDecimal op2 = new BigDecimal("0.1");
            BigDecimal op3 = new BigDecimal("0.1");
           BigDecimal result = new BigDecimal("0.3");
            if(op1.add(op2).add(op3).equals(result)){
                System.out.println("等于 0.3");
            }
            else{
                System.out.println("不等于 0.3");
            }
        }
    }
    

    运行结果如图:

    2、区分运用于基本类型和类类型的不同;类类型中:=是用在指定参考名称参考某个对象,是用在比较两个参考名称是否参考同一对象;

    import java.math.BigDecimal;
    
    public class bijiao {
        public static void main(String[] args) {
    
    
            BigDecimal a = new BigDecimal("0.1");
            BigDecimal b = new BigDecimal("0.1");
            System.out.println(a == b);
            System.out.println(a.equals(b));
        }
    
    }
    

    运行结果如图:

    3、体会基本类型打包,体会打包带来的好处;

    public class IntegerDemo {
        public static void main(String[] args) {
            int date1 = 10;
            int date2 = 20;
            Integer wrapper1 = new Integer(date1);
            Integer wrapper2 = new Integer(date2);
            System.out.println(date1/3);
            System.out.println(wrapper1.doubleValue()/3);
            System.out.println(wrapper1.compareTo(wrapper2));
        }
    }
    

    运行结果如图:

    4、数组复制与C语言中不同,直接复制出现问题,体会复制参考和复制对象的区别;

    public class Copy {
        public static void main(String[] args) {
            int[] scores1 = {88,81,74,68,78,76,77,85,95,93};
            int[] scores2 = new int[scores1.length];
            for (int i=0;i<scores1.length;i++){
                scores2[i] = scores1[i];
            }
        }
    }
    
    public class Copy {
        public static void main(String[] args) {
            int[] scores1 = {88,81,74,68,78,76,77,85,95,93};
            int[] scores2 = new int[scores1.length];
           System.arraycopy(scores1,0,scores2,0,scores1.length);
        }
    }
    
    import java.util.Arrays;
    
    public class CopyArray {
        public static void main(String[] args) {
            int[] scores1 = {88,81,74,68,78,76,77,85,95,93};
            int[] scores2 = Arrays.copyOf(scores1,scores1.length);
            for(int score :scores2){
                System.out.printf("%3d",score);
            }
            System.out.println();
            scores2[0] = 99;//不影响score1参考的数组对象
            for(int score : scores1){
                System.out.printf("%3d",score);
            }
        }
    }
    

    运行结果如图:

    5、关于字符串的比较,不同形式进行比较,显示结果不一样,原因在于name1、name2参考的是同一个对象,而new一定是新建对象,不同对象在类类型中==的含义显示的结果就是false;

    public class Name {
        public static void main(String[] args) {
            String name1 = "Justin";
            String name2 = "Justin";
            String name3 = new String("Justin");
            String name4 = new String("Justin");
            System.out.println(name1 == name2);
            System.out.println(name1 == name3);
            System.out.println(name3 == name4);
        }
    }
    
    public class Name {
        public static void main(String[] args) {
            String name1 = "Justin";
            String name2 = "Justin";
            String name3 = new String("Justin");
            String name4 = new String("Justin");
            System.out.println(name1.equals(name2));
            System.out.println(name1.equals(name3));
            System.out.println(name3.equals(name4));
        }
    }
    

    运行结果如图:

    6、在类中定义方法进行封装:(不用返回值,方法名称前可以声明void);

    class CashCard {
            String number;
            int balance;
            int bonus;
            CashCard(String number,int balance,int bonus){
                this.number = number;
                this.balance = balance;
                this.bonus = bonus;
            }
            void store(int money){
            if(money > 0){
                this.balance += money;
                if(money > 1000){
                    this.bonus++;
                }
            }
            else{
                System.out.println("储值为负");
            }
        }
        void charge(int money){
            if(money > 0){
                if(money <= this.balance){
                    this.balance -= money;
                }
                else {
                    System.out.println("钱不够了");
                }
            }
            else{
                System.out.println("扣负数?这不是叫我储值吗?");
            }
        }int exchange(int bonus){
            if(bonus>0){
                this.bonus -= bonus;
            }
            return this.bonus;
        }
        }
    

    7、建立多个同一类中的对象,可用数组,无需个别声明参考名称:(问题:每次在新建对象时可以直接写出数据成员,而之前都不用声明也不用写出构造函数吗?即为什么代码二无需代码一也能出现正确结果?)

    class Card {
        String number;
        int balance;
        int bonus;
        Card(String number,int balance,int bonus){
            this.number = number;
            this.balance = balance;
            this.bonus = bonus;
        }
    }
    
    import java.util.concurrent.Callable;
    
    public class CashApp {
        public static void main(String[] args) {
            CashCard[] cards = {
                    new CashCard("A001",500,0),
                    new CashCard("A002",300,0),
                    new CashCard("A003",1000,1),
                    new CashCard("A004",2000,2),
                    new CashCard("A005",3000,3)
            };//全都是参考至cards的对象
            for(CashCard card : cards){
                System.out.printf("(%s,%d,%d)%n",card.number,card.balance,card.bonus);
            }
        }
    }
    
    public class CardApp {
        public static void main(String[] args) {
            CashCard[] cards = {
                    new CashCard("A001",500,0),
                    new CashCard("A002",300,0),
                    new CashCard("A003",1000,1),
            };
            Scanner scanner = new Scanner(System.in);
            for(CashCard card:cards){
                System.out.printf("为(%s,%d,%d)储值:",card.number,card.balance,card.bonus);
                card.store(scanner.nextInt());
                System.out.printf("明细(%s,%d,%d)%n",card.number,card.balance,card.bonus);
            }
        }
    
    }
    

    运行结果如图:


    补充:托管代码截图

    其他(感悟、思考等,可选)

    本周的学习任务较上周难度明显增大,学习量也增大。困难之处在于都是新知识新定义,而且内容比较抽象不易理解,在学习过程中产生了很多疑惑,也有自己查资料解决,但还是觉得理解的不够清晰透彻,在看书过程中产生的问题往往书后面会有一定的解释,这也说明我在一个正确的方向上思考吧。另外,敲代码、运行代码、调试代码的确有助于理解新概念,通过实践慢慢掌握慢慢体会,我相信我会掌握。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 2/2 20/20
    第二周 250/450 2/4 21/41
    第三周 450/900 3/7 20/61 对类及对象有了较深认识
    第四周 000/0000 2/9 00/00

    参考资料

  • 相关阅读:
    .NET Core依赖注入集成Dynamic Proxy
    MediatR-进程内的消息通信框架
    03-EF Core笔记之查询数据
    02-EF Core笔记之保存数据
    01-EF Core笔记之创建模型
    EF Core 基础知识
    CQRS+ES项目解析-Equinox
    CQRS+ES项目解析-Diary.CQRS
    不要让事实妨碍好故事:Facebook精准广告产品与硅谷创业揭秘,4星奇书《混乱的猴子》
    会讲故事的前物理学家万维钢解读、推荐过的书24本,好书一半
  • 原文地址:https://www.cnblogs.com/xzh20145231/p/5297528.html
Copyright © 2020-2023  润新知