《java入门第一季》之面向对象(抽象类其实不抽象)

上一篇(http://blog.csdn.net/qq_32059827/article/details/51334198)对抽象类做了一些描述,这一篇根据两个案例加深一下印象。会觉得抽象类其实不抽象:

案例一:猫狗案例。

/*
	猫狗案例
		具体事物:猫,狗
		共性:姓名,年龄,吃饭

	分析:从具体到抽象
		猫:
			成员变量:姓名,年龄
			构造方法:无参,带参
			成员方法:吃饭(猫吃鱼)

		狗:
			成员变量:姓名,年龄
			构造方法:无参,带参
			成员方法:吃饭(狗吃肉)

		因为有共性的内容,所以就提取了一个父类。动物。
		但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
		而方法是抽象的类,类就必须定义为抽象类。

		抽象动物类:
			成员变量:姓名,年龄
			构造方法:无参,带参
			成员方法:吃饭();是抽象的

	实现:从抽象到具体
		动物类:
			成员变量:姓名,年龄
			构造方法:无参,带参
			成员方法:吃饭();

		狗类:
			继承自动物类
			重写吃饭();

		猫类:
			继承自动物类
			重写吃饭();
*/
//定义抽象的动物类
abstract class Animal {
	//姓名
	private String name;
	//年龄
	private int age;

	public Animal() {}

	public Animal(String name,int age) {
		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 abstract void eat();
}

//定义具体的狗类
class Dog extends Animal {
	public Dog() {}

	public Dog(String name,int age) {
		super(name,age);//访问父类中的有参构造方法,用super关键字。
	}

	public void eat() {//子类方法重写
		System.out.println("狗吃肉");
	}
}

//定义具体的猫类
class Cat extends Animal {
	public Cat() {}

	public Cat(String name,int age) {
		super(name,age);
	}

	public void eat() {//子类方法重写
		System.out.println("猫吃鱼");
	}
}

//测试类
class AbstractTest {
	public static void main(String[] args) {
		//测试狗类
		//具体类用法
		//方式1:
		Dog d = new Dog();
		d.setName("旺财");//继承自父类
		d.setAge(3);//继承自父类
		System.out.println(d.getName()+"---"+d.getAge());
		d.eat();
		//方式2:
		Dog d2 = new Dog("旺财",3);//super那边
		System.out.println(d2.getName()+"---"+d2.getAge());
		d2.eat();
		System.out.println("---------------------------");

		//使用多态的方式
		Animal a = new Dog();
		a.setName("旺财");
		a.setAge(3);
		System.out.println(a.getName()+"---"+a.getAge());
		a.eat();

		Animal a2 = new Dog("旺财",3);
		System.out.println(a2.getName()+"---"+a2.getAge());
		a2.eat();
		System.out.println("---------------------------");
		a = new Dog("露露",12);
		System.out.println(a.getName()+"---"+a.getAge());
		a.eat();
		System.out.println("---------------------------");
		//练习:测试猫类
		//方式一
		Cat c = new Cat();
		c.setName("小花");
		c.setAge(5);
		System.out.println(c.getName()+"---"+c.getAge());
		c.eat();
		System.out.println("---------------------------");
		//方式二
		Cat c1 = new Cat("xiaohua",4);
		System.out.println(c1.getName()+"---"+c1.getAge());
		c1.eat();
		System.out.println("---------------------------");
		//多态实现
		//方式一
		Animal a3 = new Cat();
		a3.setName("小花");
		a3.setAge(5);
		System.out.println(a3.getName()+"---"+a3.getAge());
		a3.eat();
		System.out.println("---------------------------");
		//方式二
		Animal a4 = new Cat("xiaohua",4);//注意这里书写的方式与老师上面讲解方式的不同,这里相当于给a3(重新分配了地址)(因为new了一下)。但是用了(同一个变量)a3,正确
		System.out.println(a4.getName()+"---"+a4.getAge());
		a4.eat();
		System.out.println("---------------------------");
		a3 = new Cat("tom",9);
		System.out.println(a3.getAge()+"----"+a3.getName());
		a3.eat();
	}
}

案例二:公司职员案例:

/*

	实现:
		员工类:
		普通员工类:
		经理类:
*/
//定义员工类
abstract class Employee {
	//姓名、工号以及工资
	private String name;
	private String id;
	private int salary;

	public Employee() {}

	public Employee(String name,String id,int salary) {
		this.name = name;
		this.id = id;
		this.salary = salary;
	}

	public String getName() {
		return name;
	}

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

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}

	//工作,工作内容不一样,定义一个抽象方法,在子类中必须要有方法重写
	public abstract void work();
}

//普通员工类
class Programmer extends Employee {
	public Programmer(){}

	public Programmer(String name,String id,int salary) {
		super(name,id,salary);
	}

	public void work() {
		System.out.println("按照需求写代码");
	}
}

//经理类
class Manager extends Employee {
	//奖金,经理独有的属性
	private int bonus; //bonus 奖金

	public Manager(){}

	public Manager(String name,String id,int salary,int bonus) {
		super(name,id,salary);
		this.bonus = bonus;//this代表本类的成员
	}

	public void work() {//父类工作的抽象方法子类要有方法重写
		System.out.println("跟客户谈需求");
	}

	public int getBonus() {
		return bonus;
	}

	public void setBonus(int bonus) {
		this.bonus = bonus;
	}
}

class AbstractTest4 {
	public static void main(String[] args) {
		//测试普通员工,利用多态实现
		Employee emp = new Programmer();
		emp.setName("林青霞");
		emp.setId("001");
		emp.setSalary(8000);
		System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
		emp.work();
		System.out.println("-------------");
		emp = new Programmer("林青霞","001",8000);//重新分配地址,重新分配内存空间
		System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
		emp.work();
		System.out.println("-------------");

		//由于子类有特有的内容,所以不采用多态方式
		Manager m = new Manager();
		m.setName("小吴");
		m.setId("002");
		m.setSalary(8000);
		m.setBonus(2000);
		System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getBonus());
		m.work();
		System.out.println("-------------");

		//通过构造方法赋值
		m = new Manager("刘意","czbk002",8000,2000);
		System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
		m.work();
	}
}
时间: 2024-10-01 07:59:42

《java入门第一季》之面向对象(抽象类其实不抽象)的相关文章

Java入门第一季——从此投身Java??

找工作告一段落. 最后的工作呢,和java紧密相关,也是阴差阳错,不过都是软件开发,都好了,不过以后侧重点肯定是在java这边,php有机会还是一直学下去的,那么美的说~ Java开发第一季  一.简介 1.1 Java SE--基础核心: 以此为基础,又分为Java EE(企业应用开发,JSP等),Java ME(嵌入式开发,安卓等): JVM(Java Virtual Machine): Java虚拟机,使Java代码可以跨平台运行: .java-->编译器-->.class-->解

《java入门第一季》之面向对象(谈谈接口)

软件中有接口,这里的接口与硬件中的接口还是有很大区别的. 这里介绍接口不考虑JDK8的新特性(JDK8开始接口里面可以有非抽象方法了,介绍JDK8新特性可能要到整个第一季写完吧!) 还是直接进入接口的学习: /* 接口的特点: A:接口用关键字interface表示 interface 接口名 {} B:类(实现)接口用implements(执行,实现)表示 class 类名 implements 接口名 {} C:接口不能实例化,就是说不能凭空的创建对象 那么,接口如何实例化呢? 按照多态的方

Java入门第一季

慕课网:http://www.imooc.com/learn/85 Java入门知识第一季 1.Java开发环境和IDE的使用: 2.变量和常量 3.常用的运算符 4.流程控制语句 5.数组:使用Arrays操作数组.foreach循环遍历数组 6.方法的定义,重载调用 跟着慕课网的教程,去一步一步补充完成小练习中的代码,学习效率会比较高~

《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)

根据排序算法,可以解决一些小案例.举例如下: /* * 把字符串中的字符进行排序. * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: * A:定义一个字符串 * B:把字符串转换为字符数组 * C:把字符数组进行排序 * D:把排序后的字符数组转成字符串 * E:输出最后的字符串 */ public class ArrayTest { public static void main(String[] args) { // 定义一个字符串 S

《java入门第一季》之面向对象(抽象类到底多抽象)

/* 抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的. 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须被称为是抽象类. 抽象类的特点: A:抽象类和抽象方法必须用abstract关键字修饰 B:抽象类中(不一定)有抽象方法,可以有具体的.但是有抽象方法的类必须定义为抽象类 C:抽象类不能实例化//Animal a = new Animal();无法实例化就是指:这个语句是没法执行的,抽象的不是具体无法创建该抽象类对象 因为它不是具体

《java入门第一季》之面向对象(接口收尾)

通过案例的形式,结束接口部分. /* 猫狗案例,加入跳高的额外功能 分析:从具体到抽象 猫: 姓名,年龄 吃饭,睡觉 狗: 姓名,年龄 吃饭,睡觉 由于有共性功能,所以,我们抽取出一个父类: 动物: 姓名,年龄 吃饭();//吃的不一样,定义为抽象方法 睡觉(){} 猫:继承自动物 狗:继承自动物 跳高的额外功能是一个新的扩展功能,所以我们要定义一个接口 接口: 跳高 部分猫:实现跳高 部分狗:实现跳高 实现: 从抽象到具体,这个具体意思是实现后都是具体内容 使用: 使用具体类 */ //定义跳

《java入门第一季》之面向对象(内部类到底在哪里?)

/* 内部类概述: 把类定义在其他类的内部,这个类就被称为内部类. 举例:在类A中定义了一个类B,类B就是内部类. 内部的访问特点: A:内部类可以直接访问外部类的成员,包括私有. B:外部类要访问内部类的成员,必须创建对象. 内部类位置         成员位置:在成员位置定义的类,被称为成员内部类.             局部位置:在局部位置定义的类,被称为局部内部类.  */ 1.成员内部类: /* 成员内部类: 如何直接访问内部类的成员. 外部类名.内部类名 对象名 = 外部类对象.内

《java入门第一季》之面向对象静态内部类和非静态内部类的区别

很感谢在内部类章节,"开心阳"先生给与的建议.使用静态内部类.这里就简单说一下静态内部类的使用. package com.devin; public class MyMain{ private static String name = "woobo"; private String num = "X001"; // 静态内部类可以用public,protected,private修饰 static class Person { // 静态内部类中

《java入门第一季》之面向对象(匿名内部类)

1.认识匿名内部类 /* 匿名内部类 就是内部类的简化写法. 前提:存在一个类或者接口 这里的类可以是具体类也可以是抽象类. 匿名内部类的格式: new 类名或者接口名(){ 重写方法; }:这代表的是一个子类对象 本质是什么呢? 是一个继承了该类或者实现了该接口的子类匿名对象. */ interface Inter { public abstract void show(); public abstract void show2(); } class Outer { public void m