一.代码块
1、代码块:
在类中或者方法中,使用{}括起来的一段代码,就称它是代码块。
代码块分为:局部代码块、初始化代码块、静态代码块三种
2、局部代码块:
直接定义在方法内的代码块;一般结合if,while ,for等关键在这里插入代码片
字一起使用,表示一块代码区域
void save() {
{
// 代码块当中 定义的变量,我们称它是局部变量
int a = 10;
System.out.println(a);
}
if(true)
{
}
}
3、初始化代码块:
直接定义在类当中的代码块;初始化代码块本质上放到构造方法当中执行的,因此每次创建对象的时候,都会执行初始化代码块; 可以通过反编译查看
public class Test {
// 初始化代码块是每创建一个对象,就会调用一次
{
int b = 10;
System.out.println("初始化代码执行了");
}
public static void main(String[] args) {
System.out.println("main执行了");
}
}
4、静态代码块:
在初始化代码块前面加上一个static ,此代码块称为静态代码块。静态代码块在加载字节码时就会自动调用,在主方法之前执行的。只执行一次。静态代码块随着字节码加载也加载进了JVM 此时main方法还没有执行,因为方法需要JVM调用。 先把字节码加载进JVM,JVM再去调用main方法 用来做一次性初始化操作
public class Test {
//静态代码块随着字节码加载也加载进了JVM;此时main方法还没有执行,因为方法需要JVM调用。先把字节码加载进JVM,JVM再去调用main方法用来做一次性初始化操作。静态代码块只执行一次。
static {
System.out.println("静态代码块执行了");
}
public static void main(String[] args) {
System.out.println("main执行了");
}
}
二.构造器和方法的细节
构造器特性:
1.如果我们的类当中没有定义任何构造器,系统会给我们默认提供一个无参的构造器。
2.如果我们的类当中定义了构造器,那么系统就不会再给我们提供默认的无参构造器。
作用:构建创造一个对象。同时可以给我们的属性做一个初始化操作。
下面主要学习构造器和方法的区别:
我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物。(按:老外喜欢打比喻,我也就照着翻译)。要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别。同样地,要理解构造器,那么就要了解构造器和方法的区别。所有学习java的人,尤其是对那些要认证考试的,理解构造器是非常重要的。下面将简单介绍一下 ,最后用一个表作了些简单的总结。
1.功能和作用的不同
构造器是为了创建一个类的实例。用来创建一个对象,同时可以给属性做初始化。这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus();
相反,方法的作用是仅仅是功能函数,为了执行java代码。
2.修饰符,返回值和命名的不同
构造器和方法在下面三个方便的区别:修饰符,返回值,命名。
和方法一样,构造器可以有任何访问的修饰: public, protected, private或者没有修饰(通常被package 和 friendly调用). 不同于方法的是,构造器不能有以下非访问性质的修饰: abstract, final, native, static, 或者 synchronized。
3.返回类型
方法必须要有返回值,能返回任何类型的值或者无返回值(void),构造器没有返回值,也不需要void。
4.命名
构造器使用和类相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。
构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。
5.调用:
构造方法:只有在对象创建的时候才会去调用,而且只会调用一次。
一般方法:在对象创建之后才可以调用,并且可以调用多次。
6."this"的用法
构造器和方法使用关键字this有很大的区别。方法引用this指向正在执行方法的类的实例。静态方法不能使用this关键字,因为静态方法不属于类的实例,所以this也就没有什么东西去指向。构造器的this指向同一个类中,不同参数列表的另外一个构造器,我们看看下面的代码
public class Platypus {
String name;
Platypus(String input) {
name = input;
}
Platypus() {
this("John/Mary Doe");
}
public static void main(String args[]) {
Platypus p1 = new Platypus("digger");
Platypus p2 = new Platypus();
}
}
在上面的代码中,有2个不同参数列表的构造器。第一个构造器,给类的成员name赋值,第二个构造器,调用第一个构造器,给成员变量name一个初始值 “John/Mary Doe”.
在构造器中,如果要使用关键字this,那么,必须放在第一行,如果不这样,将导致一个编译错误。
7."super"的用法
构造器和方法,都用关键字super指向超类,但是用的方法不一样。方法用这个关键字去执行被重载的超类中的方法。看下面的例子:
class Mammal {
void getBirthInfo() {
System.out.println("born alive.");
}
}
class Platypus extends Mammal {
void getBirthInfo() {
System.out.println("hatch from eggs");
System.out.print("a mammal normally is ");
super.getBirthInfo();
}
}
在上面的例子中,使用super.getBirthInfo()去调用超类Mammal中被重载的方法。
构造器使用super去调用超类中的构造器。而且这行代码必须放在第一行,否则编译将出错。看下面的例子:
public class SuperClassDemo {
SuperClassDemo() {}
}
class Child extends SuperClassDemo {
Child() {
super();
}
}
在上面这个没有什么实际意义的例子中,构造器 Child()包含了 super,它的作用就是将超类中的构造器SuperClassDemo实例化,并加到 Child类中。
编译器自动加入代码
编译器自动加入代码到构造器,对于这个,java程序员新手可能比较混淆。当我们写一个没有构造器的类,编译的时候,编译器会自动加上一个不带参数的构造器,例如:public class Example {}
编译后将如下代码:
public class TestConstructors {
TestConstructors() {
super;
}
}
三.最短路径(两个方法Floyd-Warshall和Dijkstra)
1.Floyd-Warshall
2.Dijkstra
四.图书管理系统-借书系统
1.代码
void bls_menu() //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~显示借书系统主菜单
{
system ("cls");
printf("\n `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` ");
printf("\n\n 1.借书登记\n\n");
printf("\n\n 2.还书登记\n\n");
printf("\n\n 3.借阅情况查看\n\n");
printf("\n\n 4.返回上一层\n\n");
//printf("\n\n ^~^请按键选择and回车确定哦 *·*\n");
printf("\n `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~`\n ");
return ;
}
void lbs()//library booking system借书系统
{
void borrow();//借书系统
void turn();//还书系统
void rinfor();//借书的信息
char choose;
bls_menu();
getchar();
scanf("%c",&choose);
for(;;)
switch(choose)
{
case '1': borrow();
break;
case '2': //turn();
break;
case '3': rinfor();
break;
case '4': main1();
break;
}
}
void borrow()
{
FILE *fp,*fp2;
char tname[20]={'\0'}; //图书的名字
char tauthor[20]={'\0'}; //作者
char tpublisher[20]={'\0'};//出版商
char tkind[20]={'\0'}; //种类
char tnumber[20]={'\0'}; //书号
int tstock=0; //库存
float tprice=0; //单价
struct library *head=NULL,*p1,*p2,*q;
int tid=0;
char trname[20]={'\0'};
char tdate[20]={'\0'};
char tbname[20]={'\0'};
char hit=0;
char target[20]={'\0'};//要借的书的名字
int k=0,i=0,n=0,flag=0,loop=0;
system("cls");
if((fp=fopen("library.txt","r"))==NULL)//判断文件是否存在
{
system("cls");
printf("\n图书馆无任何库存,按任意键退出。\n");
getch();
exit(0);
}
else
{
printf("\n请输入要借阅的书籍的名称:\n");
scanf("%s",target);//获得要借的书的名字
k=sum();//库存的总量
for(i=0;i<k;i++)//将文件中的数据存入链表
{
fscanf(fp,"%s%s%s%s%s%d%f",tnumber,tname,tauthor,tpublisher,tkind,&tstock,&tprice);
n++;
if(n==1)
{
p1=p2=(struct library*)malloc(Len_L);
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct library*)malloc(Len_L);
}
strcpy(p1->number,tnumber);
strcpy(p1->name,tname);
strcpy(p1->author,tauthor);
strcpy(p1->publisher,tpublisher);
strcpy(p1->kind,tkind);
p1->stock=tstock;
p1->price=tprice;
}
if(n==0)//没有库存的情况
{
head=NULL;
}
else//封链表
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
q=head;//从链表的头开始
for(;q!=NULL;)//循环链表,和目标比较
{
if(!strcmp(q->name,target))//相同返回0.不同返回1
{
//找到目标的情况
flag=1;//标记
loop=q->stock;//记录此时的库存
(q->stock)--;//库存减一,因为被借走了
}
q=q->next;
}
if(flag&&(loop>0))//将更改后的数据写入文件
{
fp=fopen("library.txt","w");
fclose(fp);
fp=fopen("library.txt","a");
q=head;
for(;q!=NULL;)
{
fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",q->number,q->name,q->author,q->publisher,q->kind,q->stock,q->price);
q=q->next;
}
free(q);
fclose(fp);
}
if(flag&&(loop>0))//
{
if((fp2=fopen("reader.txt","r"))==NULL)
{
fp2=fopen("reader.txt","w");//打开读者文件
fclose(fp2);
}
fp2=fopen("reader.txt","a");//打开读者文件,添加
if(n!=0)
{
printf("\n请按以下格式输入读者信息:\n证号 姓名 归还日期 借书书名\n请输入:");
}
scanf("%d %s %s %s",&tid,trname,tdate,tbname);//获得读者信息*****************************
fprintf(fp2,"%-8d%-23s%-18s%-10s\n",&tid,trname,tdate,tbname);//将信息写入读者文件************************
fp=fopen("library.txt","w");//删除图书馆文件信息
fclose(fp);
fp=fopen("library.txt","a");//重新追加信息
q=head;
for(;q!=NULL;)
{
fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",q->number,q->name,q->author,q->publisher,q->kind,q->stock,q->price);
q=q->next;
}
fclose(fp);
fclose(fp2);
printf("\n借书登记成功,按任意键返回\n");
getch();
lbs();
}
else
{
printf("\n此书暂无库存,按任意键返回!\n");
}
getch();
lbs();
}
void rinfor()
{
FILE *fp2;
int id=0,n=0,i=0,k=0;
char rname[20]={'\0'};
char date[20]={'\0'};
char bname[20]={'\0'};
if((fp2=fopen("reader.txt","r"))==NULL)
{
system("cls");
printf("\n文件不存在,按任意键返回\n");
}
k=sum2();
if(k==0)
{
system("cls");
printf("\n无任何信息,按任意键返回\n");
}
fp2=fopen("reader.txt","r");
system("cls");
printf("\n证号\t读者姓名\t\t还书日期\t书名\n");
for(i=0;i<k;i++)
{
fscanf(fp2,"%d%s%s%s",&id,rname,date,bname);
printf("\n%-8d%-23s%-18s%-10s\n",id,rname,date,bname);
}
fclose(fp2);
printf("查询完毕,按任意键返回\n");
getch();
lbs();
}