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);
}
}

时间: 2024-08-09 19:19:32

java的基础学习(1)的相关文章

【Java】基础学习0-为什么学习Java?

背景 众所周知,Java的开发人员数量远远要多于Python的开发人员.作为企业的软件开发来讲,一般公司都选择Java作为第一个开发语言.市场上很多的管理系统,特别是B/S架构的网站,数据查询相关产品,基本上都是Java开发的. 博主有一定的Python基础,但是在最近的工作过程中越来越感觉到多掌握一门编程语言的重要性.现在很多公司的招聘信息中明确表示,测试必须要熟悉Android/iOS中的一种,iOS开发需要iOS环境,安卓开发也要Java基础.那么你就比只会Python编写测试脚本的其他测

Java web基础学习之开发环境篇

Tomcat + Eclipse添加Java EE插件 因为之前进行Java SE学习已经配置了JDK,安装了Eclipse for Java SE,所以选择了在Eclipse上添加插件的方式来配置Web开发环境 Tomcat是免安装版,直接解压即可: Eclipse中"帮助-安装新软件",work with处选择Mars - http://download.eclipse.org/releases/mars(注意对应自己版本): 选择Web.Java EE那个选项进行安装即可,如果报

Java入门基础学习源码,有C或C++语言基础的可以快速掌握

以下为完整源码,需要1.8版本JDK,否则部分新特性可能出现兼容问题,去掉注释号即可运行 package hello; import java.util.Scanner; public class Hello { public static void main(String[] args) { // TODO 自动生成的方法存根 /* //这是第一个程序 System.out.println("这是一个减法计算器"); Scanner in = new Scanner(System.i

java 线程基础学习

今天趁空闲时间看了点线程方面的知识 首先看的是volatile关键字,按照我之前书上看到的一点知识,自己的理解是,volatile关键字会阻止编译优化,因为cpu每次读取数据是并不是从高速缓存中读取,而是取内存中的数据.这是自己的一点简单的理解,可能有错误.我之前只是看了点线程方面的知识,只是在自己写代码的时候很少(根本没用到),就是自己学习的时候跟着书上敲了代码. 实习的时候要我写个压力测试,1000个线程同时发请求,统计请求失败的次数,我用了volatile关键字,但是感觉有点问题,今天就测

JAVA多线程基础学习三:volatile关键字

Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个关键字的作用就是告诉编译器,只要是被此关键字修饰的变量都是易变的.不稳定的.那为什么是易变的呢?因为volatile所修饰的变量是直接存在于主内存中的,线程对变量的操作也是直接反映在主内存中,所以说其是易变的. 一.Java内存模型 Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理

Java的基础学习

正真第一次接触Java是在2016.5.15,有点不知所措担心这担心那但我决定朝着这个目标走下去.来到教室时老师正在讲fou语句使用,或许是自己之前看了点C#的视频老师讲的那些内容基本上都懂不过操作起来有点吃力.在我来之前他们已经上了三节课但当我看到旁边学员水平发现这不是三节课差距.我只能不断告送自己只要努力就一定可以的. public class Demo1 { public static void main(String[]args){ System.out.println("春晓"

Java【基础学习】之暴力求素数【用数组返回】

1 */ 2 import java.util.*; 3 public class Main{ 4 public static void main(String[] args) { 5 Scanner sc=new Scanner(System.in); 6 int n; 7 n=sc.nextInt(); 8 int[] ans=new int[1000]; 9 ans=f(n); 10 for(int i=0;i<ans.length;i++) { 11 if(ans[i]==0) { 12

Java语言基础学习笔记(七)

烈7A茨谙9m繁5暗MChttp://www.zcool.com.cn/collection/ZMTg3NzE1Njg=.html 3馗iC蓖17握WM啦http://www.zcool.com.cn/collection/ZMTg3NzE2NTI=.html 夜H5P栏k睹19RH评http://www.zcool.com.cn/collection/ZMTg3NzE3MjQ=.html 帐褂61Z仔1D3都瓮1幽Vhttp://www.zcool.com.cn/collection/ZMTg

java web基础学习 Forward和Redirect区别

Forward和Redirect代表了两种请求转发方式:直接转发和间接转发.对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法. 对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的.它本质上是两次HTTP请求,对应两个request对象. 对于直接方式,客户端浏览器只发出一次请求,Servlet把请求转发给Servlet.HTML.JSP或其它