0716 Employee/Student/ 实参与形参 /方法的重载/Animal 继承


   day02

类与对象
   什么是对象?
     一切皆对象,具体的事物
   一个人(张三),一只狗(旺财),一只猫(花花)...

  什么是类?
      具有相同特征和行为的对象的集合,类是抽象的概念
      没有实体
   人类
   狗类
   猫类...


类 --- 月饼模子
对象 --- 月饼

类的基本结构(javaBean)
   私有的成员变量
   空参的构造方法
   有参的构造方法
   set get方法
   其他的业务方法

练习:
   创建一个员工类
    属性:员工编号 姓名 性别 年龄 薪资 部门
    行为:展示员工信息
    加薪
   写测试类
       创建对象 ,调用方法


创建对象的过程,对象的内存结构图


方法
   方法的基本结构
        public static void main(String[] args) {
            方法体
        }

       a.访问修饰符 
        public --公有的--只要不出工程都可以访问
        protected --保护类型 -- 子类和同一个包内可以访问  
        默认 -- 同一个包内可以访问
        private --私有的 --只有本类可以访问

       b.可选修饰符 staitc final native
   
       c.返回值类型

       d.方法名
     
       e.形参列表
    
       f.方法体

      方法的作用:封装重用的代码,完成特定业务逻辑功能
    
   实参与形参
      实参--实际参数---调用环境中的参数
      形参--形式参数---方法原型中声明的参数
  java中调用方法就是实参向形参赋值过程


  继承
   什么是继承?
     public class Father{  } //父类 超类 基类
     public class Child extends Father{//子类 派生类

     }
   子类继承父类所有的非私有成员,构造方法也不能继承,static修饰的方法不能继承

   继承中的构造方法
       在调用子类构造方法时,必须首先调用父类的构造方法(编译器强制的)
        ,目的是初始化父类的成员变量


构造方法
   一类特殊的方法
   public Dog(...){

    }
   构造方法与类同名,没返回值,但也不用void修饰
   构造方法的作用
   Dog dog = new Dog(...);// new 构造方法(...)
   创建对象,开辟对象的内存空间,初始化成员变量


多态(同名方法,完成不同的业务功能,展现出多种形态)
(重载与重写) 
   静态多态
        方法的重载
        在同一个类中,方法名相同,形参列表不同的两个方法
        所谓形参列表不同:
           a.参数的个数不同
           b.参数类型不同
           c.参数类型的顺序不同
    在程序的编译器通过参数列表就可以确定要调用那个方法

   动态多态
   方法的重写
       前提条件:继承关系
       在子类中创建一个与父类方法同名的方法
       这两个方法应该有如下特点:
         方法名相同,形参列表相同,返回值类型相同(兼容)
         子类方法的访问修饰访问>=父类方法的访问修饰范围
   向上造型
      父类的引用指向子类的实例
      Aniaml dog = new Dog();
      Animal cat = new Cat();
         dog.eat(); cat.eat();
     dog cat 称为上转型对象,上转型对象调用的子类重写父类的方法
    而且这种调用时程序运行的时候决定的,所以称为动态多态


static 与 final 
   static称为静态的,用static修饰的成员属于类,而不是对象
  静态成员变量 
     
  静态方法
      static修饰的方法只能调用本类静态的成员(编译器强制检查)

  案例:统计小狗个数
  内存结构图

  final 修饰变量,变量一旦初始化就不可修改
  基本类型:值不可改变
  引用类型:对象不可改变,但对象的内容可以修改

  final修饰方法,这个方法不能被重写
  final修饰类,这个类不能被继承


抽象类与接口
  什么是抽象类?
  有一些类没有必要实例化,实例化没有意义,它可以封装通用
  的业务代码
  Animal -- 没有必要实例化
  Dog
  Cat
  Fish ...

   抽象类用abstract修饰
   抽象方法:用abstract修饰的方法,只有方法的声明,没有方法的实现
   在子类中实现抽象方法

  一个子类继承抽象类,就必须实现抽象中中声明的所有抽象方法,否则
  这个子类也必须声明为抽象类

  案例:写Cat类,继承Animal,测试

  侧重点在代码重用
  什么是接口?
   更加纯粹的抽象类,将抽象类中非抽象的因素都剥离了,专注于
   顶层设计

   接口中只能由两种成员
     a. public abstract 修饰的方法
     b. public static final 修饰的变量 -->常量
 侧重点在设计对象

     一个类只能继承一个一般类或者抽象类
    但是一个类可以实现多个接口(变相的实现了多继承)
    接口可以继承接口,而且是多继承
     

package demo02;

public class Employee {
	 //私有的成员变量
     private int id;
     private String name;
     private String sex;
     private int age;
     private float salary;
     private String dept;
     //空参的构造方法
     public Employee() {
    	 super();
    	 // TODO Auto-generated constructor stub
     }

	//有参的构造方法
     public Employee(int id, String name, String sex, int age, float salary, String dept) {
    	 super();
    	 this.id = id;
    	 this.name = name;
    	 this.sex = sex;
    	 this.age = age;
    	 this.salary = salary;
    	 this.dept = dept;
     }

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public float getSalary() {
		return salary;
	}
	public void setSalary(float salary) {
		this.salary = salary;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
     
	//展示员工信息
	public void printInfo(){
		  System.out.println(id+","+name+","+sex+","+age+","+salary+","+dept);
	}
     
	//加薪
	public void addSalary(float salary){
		 this.salary += salary;
	}
     
}
package demo02;

public class TestEmp {
    public static void main(String[] args) {
		 //创建员工对象
    	Employee e = new Employee(1, "jack", "男", 23, 12000, "系统开发部");
    	e.printInfo();
    	//加薪
    	e.addSalary(500);
    	e.printInfo();
	}
}
package demo02;

public class Student {
   //类的成员
	//成员变量 -- 对象的特征
    private int id;//学生编号
    private String name;//姓名
    private String sex;//性别
    private int age;//年龄
    
    //空参的构造方法    
    public Student() {
    }
    

    //有参的构造方法
	public Student(int id, String name, String sex, int age) {
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

    //set get 方法
	//get -- 读方法
	public int  getId(){ // id属性
		 return this.id;
	}
	
	//set --写方法
	public void setId(int id){
		  this.id = id;
	}
	
	

	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public String getSex() {
		return sex;
	}


	public void setSex(String sex) {
		this.sex = sex;
	}


	public int getAge() {
		return age;
	}


	public void setAge(int age) {
		this.age = age;
	}


	//成员方法 -- 对象的行为
    //打印学生的基本信息
    public void printInfo(){
    	 System.out.println(id+","+name+","+sex+","+age);
    }


}
package demo02;

public class TestStudent {
      public static void main(String[] args) {
		   //创建学生对象
    	 // Student stu = new Student();
    	  Student stu = new Student(1, "tom", "男", 22);
    	  stu.setName("张三");
    	  System.out.println(stu.getName());
    	  stu.printInfo();
	}
}
package demo02;

public class Demo01 {
    public static void main(String[] args) {
		//主方法是调用环境
    	String msg = "hello world";
    	printInfo(msg);//实际参数
	}
    
    public static void printInfo(String msg){//形式参数
    	  System.out.println(msg);
    }
}
package demo02;

public class Demo02 {
	/**
	 *  方法的重载
	 * @param args
	 */
    public static void main(String[] args) {
		   int num = add(1,2);
		   System.out.println(num);
		   num = add(1,2,3);
		   System.out.println(num);
		   float fnum = add(1.2f,3.6f);
	       
	}
    
    //加法 
    //两个整数相加
    public static int add(int a,int b){
    	  return a + b;
    }
    
    public static int add(int a,int b,int c){
    	return a + b +c;
    }
    
    public static float add(float a,float b){
  	  return a + b;
  }
    
    public static String add(int a,String b){
  	  return a + b;
  }
    
    public static String add(String a,int b){
    	  return a + b;
    }
    
}
package demo02;

public class Animal {
	private String name;
	private int age;

	public Animal() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Animal(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	   public void eat() {
		System.out.println(this.name + "ÔÚ³Ô¶«Î÷");
	}
}
package demo02;

public class Cat extends Animal{

	  @Override
	public void eat() {
         System.out.println(getName()+"正在喝鱼汤");
	}
}
package demo02;

public class Dog extends Animal{
    private  static int count;
	public Dog() {
       count++;
	}


   @Override
	public  void eat() {
		  System.out.println("µÚ"+count+"Ìõ¹·"+getName()+"ÔڿйÇÍ·");
	}
}
package demo02;

public class TestDog {
    public static void main(String[] args) {
		  Dog dog = new Dog();
		  dog.setName("旺财");
		  dog.setAge(1);
		  dog.eat();
		  
		  Cat cat = new Cat();
		  cat.setName("花花");
		  cat.setAge(2);
		  cat.eat();
		  System.out.println("---------------------");
		  //向上造型
		  Animal dog2 = new Dog();
		  dog2.setName("小黑");
		  dog2.setAge(3);
		  //dog2.eat();
		  
		  Animal cat2 = new Cat();
		  cat2.setName("小花花");
		  cat2.setAge(1);
		  //cat2.eat();
		  eat(cat2);
		  
	}
    
    //设计一个方法适合所有的调用环境
    public static void  eat(Animal an){
    	  an.eat();
    }
}
package demo02;

public class CountDog {
    public static void main(String[] args) {
		 //统计创建的小狗的数量
    	Dog dog1 = new Dog();
    	dog1.setName("旺财");
    	dog1.setAge(1);
    	dog1.eat();
    	Dog dog2 = new Dog();
    	dog2.setName("小黑");
    	dog2.setAge(2);
    	dog2.eat();
	}
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章