Java笔记6
在上一篇中,虽然写到了继承,但是并没有详细深入。这篇来看看相关问题。
继承共同行为 先做出如下假定:有个游戏有多个角色,包括剑士,魔法师等,每个角色都有血量,名字,等级,攻击方式等。 观察发现,每个角色都有名字,血量,等级三个共同特点,那么就可以将这部份提升为一个父类role(我觉得基类可能是个更好的名字)。然后剑士,魔法师这些子类(派生类)继承这些共有的属性,扩展自己的方法(攻击方式)。
重新定义行为 进一步观察,发现每个角色都要攻击,那么就可以把“攻击”这个方法(fight())提取到父类中。然后在子类中重写(Override)这个方法。父类中的fight()方法实际是空的,具体的攻击行为留到子类中重写。我这里写一个调用fight()方法的方法:
1234static void drawFight(Role role){ System.out.println(role.getName); role.fight();}
我将传入的参数定义为Role类型,这样不管我传入的时剑士还是魔法师类型都可 ...
数据库笔记1
前面一直没有重视数据库的知识,今天一上课发现有好多不懂的地方,现在开始补一补。本文将参考福达的SQL必知必会,强调SQL语句的使用,对于数据库的理论知识讲的不多。
数据库数据库,表与模式 数据库:保存有组织的数据的容器。注意与数据库软件的区别,这些软件是DBMS,数据库管理系统。 表:某种特定类型的数据的结构化清单,一个数据库中的表的名字绝不能相同,但是不同数据库中的可以。 模式:关于数据库和表的布局及特征的信息。表具有一些特性,这些特性定义了数据如何存储,包含存储什么样数据,数据如何分解,各部分信息如何命名等信息,这就是模式。模式可以用于描述特定的表,也可以描述整个数据库。
列和数据类型 列(column):表中的一个字段,所有表都是由一个或多个列组成。在使用时应注意分解数据,将一条信息分解为合适的n个字段。例如:对于一条详细的地址,有的时候可以只要一个字段,但是有的时候需要门牌号单独作为一个字段用于排序。 数据类型:数据类型有多种,关于数字的,字符的,日期的,等等。问题在于,基本的数据类型基本都一样,但是部分高级的数 ...
Clion的配置
刚才看到安装已久的Clion想点开试试,结果发现在配置上有点问题。
首先要安装Mingw,这里的安装我就不介绍了,主要是把gcc和g++安上。Clion还支持用VS的编译器和调试器,还支持Cygwin和WSL(Windows内置Linux)。但是后面几个我还没空折腾。 安装Clion后需要配置编译器和调试器的位置,先看下图:Detect表示检测,Bundled表示捆绑的。Debugger和Cmake可以用内置的,也可以选择自己的,但是Mingw的Debugger不在支持版本内,Cmake的版本也是有要求的。C和C++的编译器填Mingw内的相关程序就行。还有非常坑的一点:project的名字绝对不能用test!
Java笔记5
上一篇主要回顾了一些细枝末节,这篇讲继承与多态。
类的继承 class SubClass extends SuperClass中的extends表示SubClass继承于SuperClass,但是extends本意是扩展的意思。因为翻译问题,子类和父类有各种名字。子类继承父类的全部成员变量和方法(有关于private的有点小例外),但是构造器不算。 一个子类只能有一个父类,是单继承关系,但是可以有多层继承关系。所有的类都是java.lang.Object类的子类或间接子类。 子类扩展(extends)了父类,父类派生(derive)了子类。 方法的重写要遵循“两同两小一大”的规则,“两同”即方法名,形参列表相同;“两小”即子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”指子类方法的访问权限要比父类的更大或相等。而且,字类和父类的静态与非静态要对应。 当子类覆盖了父类后,在子类中就不能直接访问父类中的方法,但是可以通过super(实例方法)和父类类名(类方法, ...
Java笔记4
这篇的主要内容是查漏补缺。原因是今天想继续下一部分:继承和多态,结果发现林的书有许多东西讲的太精简,甚至有失偏颇。所以下面我将结合李的书和博客多前面的内容进行回顾。
1.数组内存中的数组 数组引用变量只是一个引用,类似于指针,它存放了对象的真是地址,但是这只是类比理解,实际上还是有差别的。实际的数组对象存放在堆中,而引用变量如果是一个局部变量就是在栈内存中。(是不是又像c++)同样的,当一个方法执行时,每个方法都会建立内存栈,然后将变量依次放入栈中,当使用完时也就被销毁了。堆中的对象是不会这样的,只要有引用指向它,它就会存在,当没有任何引用指向它时,它就会被垃圾管理器回收。这和C++不一样,C++中的需要自己手动创建,手动释放。 引用的指定并不是唯一的,不是我被指定给了某个对象就不能再被指定给别人,只要类型相符就没有问题。
基本类型数组的初始化 对于基本类型数组,数组元素的值是直接存在对应的数组元素中的,因此,初始化数组时先为该数组分配内存空间,然后将数组的值放入里面就行。注意细节:分配空间后,里面并不是空的,而是默认值,关于默认值前面的笔 ...
Java笔记3
气温骤降,头疼的厉害。
今天发生了一些难过的事,心情真的不好,状态糟糕透了,但是这件事也激励我要努力学习,加油!
继续学习Java。
1.构造函数
123456789101112131415161718192021class CashCard { String number; int balance; int bonus; public CashCard(String number, int balance, int bonus) { this.number = number; this.balance = balance; this.bonus = bonus; }}
构造函数与类名称同名,不用声明返回类型。构造函数支持函数重载。若没有写构造函数,编译程序会自动加入一个内容为空,参数为空的构造函数。所以新建对象的语法就是这么来的。
123CashCard card = new CashCard();
在使用方法重载时要注意自动装箱和拆箱,会依照以下顺 ...
Java笔记2
一周过去了,又有些收获。
1.基本类型打包器的一点内幕
编译程序会以下代码
1Integer number = 100;
转换为
1Integer localInteger = Integer.valueOf(100);
查看src.zip文件夹中的java/lang中的Integer.java,有关valueOf()的操作内容如下:
12345public static Integer valueOf(int i){ if(i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
IntegerCache.low和IntegerCache.high的默认值是-128和127.当i的值在这中间时就会检查前面是否有相同的值,如果有就直接返回这个实例。所以
123Integer i1=100;Inte ...
Java笔记1
最近学习Java有了一些小收获,不成体系,在此记录。
1.Eclipse的源码体系结构
这里只提最基础的,毕竟刚开始学习。
首先需要新建一个Java project,一个project中可能会有多个package,包中是源码,也就是以.java结尾的文档,这其中就是类。一个.java的文档中可以有多个类,但是只能有一个公共类,且公共类的名字要与文档名相同。一个包中可以有多个.java的文档。
2.一个包中可以有多个.java的文档,而且每个都可以有一个main方法。
3.Java的数据类型分为两大类,包括基础数据类型和引用类型。
基础数据类型就是常说的八种,byte,short,int,long等等,但是要注意的是,Java不像C++那样没有严格指定数据的长度,而是规定死了,不需要为硬件平台的兼容担心。
注意,Boolean类型的不允许用数字转换,只有true和false。
4.类是对象的抽象。
1234class Clothes { String color; char size;}
声明一个类,然后就可以让类为模板创建对象。
1Clothes c1 ...
物理地址
什么是物理地址?
注意,本篇中数字后的D和H表示十进制和十六进制,注意区别
物理地址不是真实地址。CPU访问的是虚拟地址空间,每一个内存单元在空间中都有个唯一的地址。
CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在 CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以有不同的形成物理地址的方式。
8086是16位结构的CPU ,这也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU ,能一次性处理、传输、暂时存储16位的地址。
运算器一次最多可以处理16位的数据;
寄存器的最大宽度为16位;
寄存器和运算器之间的通路为16位。
重要8086CPU有 20位地址总线,可以传送20位地址,达到1MB寻址能力。即能表示2^20个不同的地址,一共是2^20^=1048576byte=1024k=1M。(一个地址指向一个内存单元,8bit)。但是8086CPU又是16位结构,在内部一次性处理、 ...
结构体
本篇内容包括结构体,共用体和枚举。
一.结构体1.声明123456struct inflatable{ char name[20]; //结构的成员 float volume; double price;};
如上所示,声明了一个结构体。结构定义的是新类型(inflatable)的特征。定义了结构后就可以声明这种类型的变量。
12struct inflatable hat;inflatable mainframe;
可以省略struct,这样就强调inflatable是一种新的类型。
对于结构的声明,应注意位置,关键是在使用的地方的前面,但是,最好在main函数的前面。C++不提倡使用外部变量,但是提倡外部结构声明。
123456inflatable guest ={ "yl", 1.88, 29.99};
关键在于用逗号分隔。
在C++11中是与此类似的,等号是可选的,如果大括号内是空的,那么值将是0,字符串每字节也是0。同时,不予许窄缩。
这种声明方式也是可以的,但是显然不好。
12345678str ...