day03

JavaDay03总结

1、Error:(28, 1) java: 无法将类 Stu中的构造器 Stu应用到给定类型;
需要: int,java.lang.String,float
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
修改:构造方法不会继承,当父类有带参构造方法时,子类要继承父类,父类需添加无参构造方法
2、继承class 子类 extends 父类 子类拥有父类的属性和方法,父类的private修饰的属性不能被子类继承,若不希望子类继承父类的某个属性,则将该属性定义为private;之类最多直接继承一个父类,java所有类都是Object类的子类
3、重载:1.方法名相同 2.参数类型和个数至少一个不同 3.返回类型和修饰符可以不同
4、覆盖:子类有一个方法,与父类某方法的名称、返回类型、参数相同,则称子类方法覆盖父类方法;注:子类方法不能缩小父类方法的访问权限
5、多态:一个引用在不同情况下的多种状态,也可这样理解:通过指向父类的指针来调用不同子类中实现的方法;java允许父类的引用变量引用它的子类实例

这里写/*
作者:mys
功能:演示多态性
日期:2018/7/13
 */
package cn.mys;

public class Demo11
{
    public static void main(String []args)
    {
        /*Animal animal=new Animal();
        animal.show();
        Cat cat=new Cat();
        cat.show();
        Dog dog=new Dog();
        dog.show();
        */
       /* 父类的引用变量引用它的子类
	    Animal an=new Cat();
        an.show();
        an=new Dog();
        an.show();*/
       Master master=new Master();
       master.feed(new Cat(),new Fish());
       master.feed(new Dog(),new Bone());
    }
}
//食物
class Food
{
    public void showName()
    {
        System.out.println("不知道什么名字");
    }
}
//鱼类
class Fish extends Food
{
    public void showName() {
        System.out.println("鱼类");
    }
}
//骨头类
class Bone extends Food
{
    public void showName()
    {
        System.out.println("骨头类");
    }
}
//人类
class Master
{
    //给动物喂食
    public void feed(Animal an,Food f)
    {
        an.eat();
        f.showName();
    }
}
//父类Animal
class Animal
{
    public void show()
    {
        System.out.println("我是动物类!");
    }
    //动物吃
    public void eat()
    {
        System.out.println("我不知道吃什么!");
    }
}
//子类Cat
class Cat extends Animal
{
    //覆盖父类
    public void show()
    {
        System.out.println("我是猫类!");
    }
    //猫吃鱼
    public void eat()
    {
        System.out.println("猫吃鱼!");
    }
}
//子类Dog
class Dog extends Animal
{
    //覆盖父类
    public void show()
    {
        System.out.println("我是狗类!");
    }
    //狗吃骨头
    public void eat()
    {
        System.out.println("狗吃骨头!");
    }
}

6、约瑟夫问题

/*
作者:mys
功能:约瑟夫
日期:2018/7/13
*/
/*
问题:设编号1 2 3 4....n的n个人围成一圈,约定编号为k的人开始从1报数,
      数到m的那个人出列,他的下一位又从1开始报数,直到所有人出列。
*/
package cn.mys;

public class Josephu
{
    public static void main(String []args)
    {
        //创建一个环形链表
        CycLink cyclink=new CycLink();
        cyclink.setLen(5);//链表长度
        cyclink.createLink();//初始化链表
        cyclink.show();//显示链表
        cyclink.setK(2);//设置开始数数人的编号
        cyclink.setM(2);//设置数到几的人退出
        cyclink.play();//开始数数
    }
}
//定义一个小孩类
class Child
{
    int num;//编号
    Child nextChild=null;//指向下一个小孩
    public Child(int num)//初始化编号
    {
        this.num=num;
    }
}
//定义环形链表
class CycLink
{
    //定义一个指向第一个小孩的引用
    Child firstChild=null;
    Child temp=null;
    int len=0;
    int k=0;
    int m=0;
    //设置m
    public void setM(int m)
    {
        this.m=m;
    }
    //设置k
    public void setK(int k)
    {
        this.k=k;
    }
    //设置链表大小
    public void setLen(int len)
    {
        this.len=len;
    }
    //初始化循环链表
    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向下走一步
                temp.nextChild=firstChild;//环形链表最后一个小孩指向第一个小孩
            }
            else
            {
                //继续创建小孩
                Child ch = new Child(i);
                temp.nextChild=ch;//搭桥
                temp=ch;//temp向下走一步
            }
        }
    }
    //显示链表
    public void show()
    {
        Child temp=firstChild;//从第一个小孩开始
        do {
            System.out.println(temp.num);
            temp=temp.nextChild;
        }while(temp!=firstChild);
    }
    //开始play
    public void play()
    {
        while(len!=1)
        {
            //1.找到开始数数的人
            Child temp = firstChild;
            for (int i = 1; i < k; i++)//注意此处i!=k
            {
                temp = temp.nextChild;
            }
            //2.数m下
            for (int j = 1; j < m; j++) {
                temp = temp.nextChild;
            }
            //找到要出圈小孩的前一个小孩
            Child temp2 = temp;//temp2从temp开始
            while (temp2.nextChild != temp)//找到temp2,其下一个小孩等于temp小孩
            {
                temp2 = temp2.nextChild;
            }
            //3.将数到m的小孩退出圈
            temp2.nextChild = temp.nextChild;
            temp = temp.nextChild;//temp指向下一个数数的小孩
            this.len--;
        }
        //打印最后一个小孩
        System.out.println("最后一个小孩:"+temp.num);
    }
}

7、抽象类:当父类的方法不能确定时,用abstract关键字修饰该方法(抽象方法),该类(抽象类);当一个继承类的父类是抽象类的话,需要把抽象类中的所有方法全部实现
注意事项:

  1. 抽象类不能被实例化
  2. 抽象类不一定有抽象方法
  3. 一旦类包含了abstract方法,则该类必须声明为abstract
  4. 抽象方法不能有主体eg.abstract void aaa(){}错误
/*
作者:mys
功能:抽象类的必要性
日期:2018/7/13
 */
package cn.mys;

public class Demo12 {
    public static void main(String []args)
    {
        Cat cat=new Cat();
        //Animal an=new Animal(); 抽象类不能被实例化
    }
}
//父类Animal(抽象类)
abstract class Animal
{
	 //叫
     //abstract public void cry(); 抽象类不一定有抽象方法
     // abstract public void cry(){} 抽象方法不能有主体
     public void aaa()//抽象类中可以有实现了的方法:普通方法
     {
	     System.out.println("aaa");
     }
}

//子类Cat
// 当一个继承类的父类是抽象类的话,需要把抽象类中的所有方法**全部实现**
class Cat extends Animal
{
    //实现父类
    public void cry()
    {
        //do nothing...
    }
}

8、接口:给出一些没有内容的方法,封装到一起,某各类要使用的时候,根据具体情况写出方法,语法:class 类名 implements 接口{ 方法; 变量;}
注意事项

  • 1.接口不能实例化
    2.接口中所有的方法都不能有主体
    3.一个类可以实现多个接口
    4.接口中可以有变量(但不能被private、protected修饰)
    【a】接口中的变量都是 static,且是final类型,因此在定义时需要初始化
    【b】java开发中,将常用的变量定义在接口中,作为全局变量使用。访问方式:接口名.变量名
    5.一个接口不能继承其他的类,但可以继承别的接口
    小结:接口是更加抽象的抽象类,抽象类中的方法可以有主体,而接口中的方法都没有主体,接口体现了多态和高内聚低耦合的设计思想。
/*
作者:mys
功能:接口(计算机 USB 相机 手机)
日期:2018/7/13
 */
package cn.mys;

public class Demo13 {
    public static void main(String []args)
    {
        //在接口中定义的变量通过*接口名.变量名*调用
        System.out.println(Usb.a);
        //创建一个计算机
        Computer computer=new Computer();
        //创建一个相机
        Camera camera=new Camera();
        //创建一个手机
        Phone phone=new Phone();
        //使用接口
        computer.useUsb(camera);
        computer.useUsb(phone);
        //Usb Usb=new Usb();接口不能实例化
    }
}
//usb接口
interface Usb
{
    //接口可以定义变量,且变量是static,因此在定义时也要初始化
    int a=1;
    //声明两个方法
    //开始工作
    public void start();
    //停止工作
    public void stop();
    //public void stop(){} 接口中所有方法不能有主体
}
//一个类
class Bbb
{

}
//一个接口,不能继承其他的类
/*interface Aaa extends Bbb
{

}*/
//一个接口
interface Aaa 
{

}
//编写相机类,并实现Usb接口
//一个重要原则:当一个类实现了一个接口,就要把该接口的方法都实现
class Camera implements Usb,Aaa//一个类可以实现多个接口
{
    //实现两个方法
    public void start()
    {
        System.out.println("相机开始工作");
    }
    public void stop()
    {
        System.out.println("相机停止工作");
    }
}
//编写手机类
class Phone implements Usb
{
    //实现两个方法
    public void start()
    {
        System.out.println("手机开始工作");
    }
    public void stop()
    {
        System.out.println("手机停止工作");
    }
}
//编写计算机类
class Computer
{
    //使用Usb接口
    public void useUsb(Usb usb)
    {
        usb.start();
        usb.stop();
    }
}

原文地址:https://www.cnblogs.com/xq-mys/p/9305469.html