java 继承和多态
基础语法利用extends来进行继承,例如:
public class Sub extends Base{ ...}
以上表明Sub类继承Base类,具体继承还要分两种情况。
如果在同一个包中,那么Sub继承了Base中的public,protected和默认访问级别的成员变量和方法
如果在不同的包中,不继承默认访问级别的成员变量和成员方法,其他和上一个相同。
默认访问级别就是前面没有加任何关键字。
java不支持多继承,一个类只能继承于一个类,但是父类可以有多个子类,就像一棵树。下级继承会继承同一分支上所有的成员和方法。
java中有一个所有类的祖先叫object类,如果没有使用extends关键字那么会自动继承这个类。
方法覆盖覆盖指的是父类中的函数在子类中重新写。要满足下列条件:
子类方法名称,函数签名(包括参数位置)和返回类型都要和父类方法一致
在子类中,必须要先覆盖函数,才可以重写函数
Base类中:public void method(){ ...}Sub类中:public int method(){ ...
c 文件操作
基础文件总的来说其实就只有两个操作,打开(关闭)和读写。本文也围绕这两个方面展开
文件格式
文件一般由三部分组成:路径,文件名,后缀。
例:"E:\\ch10.doc"或者"E:/ch10.doc"
之所以要两个\是因为在c语言中\作为转义字符。
流
流按方向分为:输入流和输出流。从文件获取数据的流称为输入流,向文件输出数据称为输出流。
例如,从键盘输入数据然后把该数据输出到屏幕上的过程,相当于从一个文件输入流(与键盘相关)中输入(读取)数据,然后通过另外一个文件输出流(与显示器相关)把获取的数据输出(写入)到文件(显示器)上。
换行符
在Linux系统中,换行符是0x0a(LF)。因为c是在unix上发展起来的,所以访问Linux文件时,不需要转换,直接可以访问。
在windows系统中使用0x0d(CR ‘\r’) 和 0x0a(LF ‘\n’)合起来作为换行符。所以把windows下文件给c程序还要先把CR-LF转换成LF
缓冲文件系统
缓冲文件系统:系统自动为每个打开的文件在内存开辟一块缓冲区,缓冲区的大小一般由系统决定。当程序向文件中输 ...
c语言的动态内存分配
malloc头文件: malloc.h
原型 void* malloc( size)(不标准写法)
其中size表示的是你想申请的字节数,为了准确我们一般使用sizeof函数,而返回的是一个void指针,这就导致了我们一般都要强制类型转换到对应的类型。
例: int p=(int)malloc(sizeof(int))
int p=(int)malloc(10*sizeof(int)) //数组
前面的int* 就是强制类型转换
此外,malloc一般分配完内存后还要进行检查看是否分配成功
if(p==NULL){ exit(1);//退出程序}
而且malloc是不会自动初始化的,所以在分配完内存后最好先用NULL初始化一下。
realloc字面意思,就是给一个已经分配内存的指针增加内存,原内存中的数据不变
头文件 #include 有些编译器需要#include
原型: void realloc(void mem_address, unsigned int newsize);
mem_address是原指针,newsize是新的空间,可以大 ...
接口
接口的基本特征在java中接口有两种意思
第一种是概念性的接口,指的是封装的内容对外界提供的服务(一开始一听接口一定以为就是这个吧)
第二种是一种接口类型
定义接口使用interface关键字,实现接口使用implement关键字。这个类似于父类和子类。
注意点:
接口成员变量默认是public或static或final类型的,必须显示初始化。例如public interface A{ int a; protected int b; int c = 3;//正确,显式初始化表示定义同时要赋值,并且默认是上面三种类型|
方法默认是public abstract类型。JDK8开始才可以有默认方法和静态方法之前只能有抽象方法。默认方法用default关键字声明,可以有自己的实现,接口实现类可以直接访问默认方法,也可以覆盖它。静态方法可以在接口内部访问或者实现接口的类通过使用接口名字来访问。public interface A{ void method();//默认是public abstract public abstract void ...
java 对象的生命周期
创建对象的方式有四种显式创建的方式:
new创建
运用反射,调用java.lang.Class或java.lang.reflect.Constructor类的newInstance()方法
调用对象的clone()方法
运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法
//通过反射创建Class objClass = Class.forName("Customer");Customer cl = (Customer)objClass.newInstance();//通过克隆创建Customer c3 = (Customer)c2.clone();
通过new或反射的方法创建的时候,都会调用构造方法。但是通过克隆创建不会执行构造方法。在Object类中就定义了clone()方法
protected Object clone()throws CloneNotSupportedException{ if(!(this instanceof Cloneable)) { ...
java 异常处理
异常处理流程有两种办法抛出异常:
通过try-catch抛出,例如
public void method A(int money){ try { if(--money<=0) { throw new SpecialException("Outof money"); } } catch(SpecialException e) { 处理异常 }}
在方法声明处声明抛出
public void method A(int money)throws SpecialException{ if(--money<=0) { throw new SpecialException("Out of money"); }}
每次抛出异常之后,都要找到catch块,如果在当前方法中没有找到, ...
gdb
进入gdb首先gdb一般都是用来调试c或c++的,gdb是要运行可执行文件的,所以先要进行编译。具体命令如下:
gcc -g 源文件.c -o 输出的目标文件
-g是用来插入编译所需的信息, -o是用来生成可执行文件
生成的时候会产生一大堆信息,如果不想看的话可以使用 -q 选项,如果想永久设定可以在bashrc中设置别名 alias gdb = ‘gdb -q’
执行
名称
用途
简写
start
进入main函数
无
run
重新开始运行 run-text 加载文本文件 run-bin加载二进制文件
r
next
执行一行程序,不进入函数,直接把函数执行完
n
step
执行一行程序,进入函数
s
list
查看程序,list+函数名查看函数
l
continue
继续执行到断点处
c
quit
终止程序
q
set 参数
设置断点
无
nexti
运行一条机器指令
ni
jump + 标号
跳转到某一位置执行
j
run < input.txt
重定向
无
注意jump命令跳转后仍是一直执行,所以要在某一位置手动 ...
java switch foreach
switchswitch的条件(switch括号中的内容)可以有一下几种。
可以自动转换成int的类型(byte,short,int,char)
字符串类型String color = "red";switch(color){ case "red": System.out.println("红色"); break; case "blue: System.out.println("蓝色"); break; default: System.out.println("其他颜色");}
枚举类型enum Colour(red,blue);Colour c = Colour.red;Switch(c)...
foreach语句
foreach是for的特殊简化版本。用来遍历数组或集合
语法:for(变量类型 变量名 : 待输出的集合或数组){ ...}其实这也只能说是稍稍简化,直接写for就可以了。
java 数据类型和变量
基础因为是记笔记,这里只说一下和c++不同的地方。
定义及使用的方式和c++基本一致,就是有些名字改了而已。
类变量自动初始化,boolean初始化为false,其他初始化为0。但是普通的变量还有自己初始化。这里和c++不同的是如果没有初始化会报错。当然,如果一直没有使用的话不初始化也不会报错。
boolean 就是c++中的bool型。但是有一点不同,这里只能赋true or false,赋一个整数变成bool型是不可以的。但是无语的是底层实现其实还是非零是true,零是false。也就是说,在java中,int i = 1; if(i)的行为是不被允许的,因为整型不可以变成boolean型。
byte 一个字节,和char不同,这个是整型的。当然,java中也有char
在java中,如果数学表达式都是整数,则返回值只能是int或long型。如果把返回值赋给byte型,要进行强制类型转换。强制类型转换例:byte a = (byte)(1+1);
可以用下划线分隔,例如:int a = 10_000_000;实际上就是1000万,这样可以增加可读性。
此外,可以在后面加尾标表示类型 ...
java初探
源文件结构java源文件可能包含以下内容:
包声明语句
包引入语句
类声明
接口声明
这些内容都不是必须的。此外要注意只能有一个类或接口是public的(一般也是private)。
包声明语句包声明语句把类放到特定的包中。例如package com.abc.dollapp;public calss appmain{...};class doll{...};在这个例子中appmain和doll都在com.abc.dollapp包中。
在一个java文件中,只能有一个package语句。如果没有提供package,那么就表明在系统默认的包中。
包的作用
用于区分名字相同的类。例如定义了两中车类名都叫car,一种实际上是奔驰,一种是宝马。把他们丢在不同的包中就可以区分他们,相当于使用了不同的命名空间1。
1:命名空间实际上就是在函数前的一些附加消息。因为可能同时引入了多个库,库文件中可能某些函数名字相同,这个时候只有通过前面添加一些信息来辨别。典型例子就是using namespace std;这个含义就是使用标准命名空间。不然就要写std::c ...