java的基础学习(1)

在暑假荒废一星期,武汉看海之后。为了面对接下来的广州实习,我又重新温习了java的一些基本特征和进行手打代码。因为之前的学习更多是停留在纸面的理解上,没有实际的代码编辑。这两天学习要点在于对java的继承,重载,方法覆盖,多态以及约瑟夫问题。

重载,具有相同的方法名,但在参数的个数,类型,顺序上至少要有一个不同。返回类型和修饰符可以不同,但如果仅仅是返回类型不同,或仅仅是修饰符不同,是不足以构成方法的重载的。

方法的覆盖,是在父类已有成员方法的基础上,子类可以有对同名成员方法的不同实现,将会使父类中的该方法覆盖掉,虽然覆盖后的父类方法并不实现,但是却是不可缺少的。

多态相对就比较复杂了,可以从多个角度叙述这个特征,它也是java中的一个比较突出的特点和优点。多态可以理解为一个实例对象(父类)的多种状态,利用多态可以很便利的实现不同子类之间的联系。详见贴出的代码。

约瑟夫问题,一个典型例子就是丢手帕问题,一群小孩围成一个圈,从第K个小孩开始数数,数M下,第M个人就出圈。问题的类型常常是出圈的序列和最后一个出圈的人。

下面给出多态问题的代码(动物喂食)

/*
* 作者:
* 功能:多态
*
*/
package com.keweimeng;

public class demo3 {

public static void main(String[] args) {
// TODO Auto-generated method stub
/*Sheep sheep1=new Sheep();
sheep1.cry();
An an=new Sheep();
an.cry();
an=new Bird();
an.cry();*/

Master master=new Master();
master.feed(new Bird(), new chongz());
}

}

class Food
{
String name;
public void showName()
{

}
}

class grass extends Food
{
public void showName()
{
System.out.println("草");
}
}

class chongz extends Food
{
public void showName()
{
System.out.println("虫子");
}
}

//主人类
class Master
{
//给动物喂食物,多态
public void feed(An an,Food f)
{
an.eat();
f.showName();
}
}

class An
{
int age;
String name;

public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

//动物会叫
public void cry()
{
System.out.println("不知道怎么叫");
}

//动物吃东西
public void eat()
{
System.out.println("不知道吃什么");
}
}

class Sheep extends An
{
public void cry()
{
System.out.println("咩咩叫");
}

public void eat()
{
System.out.println("羊爱吃草");
}
}
class Bird extends An
{
public void cry()
{
System.out.println("喳喳叫");
}
public void eat()
{
System.out.println("鸟爱吃虫");
}
}

 

下面给出约瑟夫问题:

package com.josephus;

/*
* 作者:
* 时间:2016.7
* 功能:约瑟夫问题,丢手帕问题
*/
public class demo4 {

public static void main(String[] args) {
// TODO Auto-generated method stub
CycLink cyclink=new CycLink();
cyclink.setLen(9);
cyclink.CreateLink();
cyclink.setk(2);
cyclink.setm(2);
cyclink.show();
cyclink.play();
}

}

class Child{
int no;//编号
Child nextchild=null;
public Child(int no)
{
this.no=no;
}
}

//环形链表
class CycLink
{
//先定义一个指向链表第一个小孩的引用
Child firstchild=null;
Child temp=null;
//链表长度初始化为零
int len=0;
int k=0;
int m=0;

//设置链表大小
public void setLen(int len)
{
this.len=len;
}

//设置开始数数的人k
public void setk(int k)
{
this.k=k;
}

//第m个人出列
public void setm(int m)
{
this.m=m;
}

//开始游戏
public void play()
{
Child temp=this.firstchild;
//先找到开始数数的人
for(int i=0;i<k;i++)
{
temp=temp.nextchild;
}
while(this.len!=1){
//数m下
for(int j=0;j<m;j++)
{
temp=temp.nextchild;
}
Child temp2=temp;
//找到要出圈的前一个小孩
while (temp2.nextchild!=temp)
{
temp2=temp2.nextchild;
}

//将数到m的小孩退出圈
temp2.nextchild=temp.nextchild;
//让temp指向下一个数数的小孩
temp=temp.nextchild;
//this.show();
this.len--;
}
//输出最后一个小孩
System.out.println("最后出圈的是:"+temp.no);
}
//初始化环形链表
public void CreateLink()
{
for(int i=1;i<=len;i++)
{
if(i==1){
Child ch=new Child(i);
this.firstchild =ch;
this.temp=ch;
}

else {
//创建最后一个小孩
if(i==len){
Child ch=new Child(i);
temp.nextchild=ch;
temp=ch;
temp.nextchild=this.firstchild;
}
else{
//继续创建小孩
Child ch=new Child(i);
temp.nextchild=ch;
temp=ch;
}
}
}
}

//打印环形链表
public void show()
{
Child temp=this.firstchild;
do{
System.out.print(temp.no+" ");
temp=temp.nextchild;
}while(temp!=this.firstchild);
}
}

posted @ 2016-07-08 11:12  佛图  阅读(172)  评论(0编辑  收藏  举报