java-抽象类
来源:互联网 发布:java maven log4j2 编辑:程序博客网 时间:2024/06/06 10:43
抽象类
怎样理解抽象类:
打个形象的比喻:
我们以前定义一个动物类,动物有吃的行为,但是我们没有指定这是哪个动物(不是一个具体的事物),而且动物吃的行为也不知道是哪种具体吃的行为。所以这里我们所指的动物类就可以看做是一个抽象类。这个动物拥有动物的属性和方法。
特点:
1-抽象类和抽象方法必须用abstract关键字修饰。
2-抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
3-抽象类不能直接实例化(可通过多态实现),因为它不是具体的类。(但是有构造方法)
4-抽象类是有构造方法的,只是不能实例化,用于子类访问父类数据的初始化。
抽象类的子类:
1- 不重写抽象方法,抽象类的子类是一个抽象子类
2-重写父类所有父类方法,子类不是抽象类(可通过该子类可实例化抽象父类)
例如:动物类
abstract class Animal{
public abstract void eat();
}
注意:抽象类中可以没有抽象方法。
抽象方法不能有方法体。
注意:空方法体和没有方法体的区别。
抽象类的成员特点:
成员变量:
既可以是变量也可以是常量。
构造方法:
有构造方法,用于子类访问父类数据的初始化。
成员方法:
抽象类中方法既可以是抽象的,也可以是非抽象方法。
在父类中:
非抽象方法:子类继承的事情,提高代码的复用性
抽象方法:强制要求子类做的事情。
抽象类中注意的问题:
一个类如果没有抽象方法,可以是抽象类,即抽象类中可以完全没有抽象方法。
这样类的主要目的就是不让创建该类对象。
abstract关键字不可以个那些关键字使用。
private 冲突;private修饰的成员不能被继承,从而不可以被子类重写,而abstract修饰的是要求被重写的。
final 冲突;final修饰的成员是最终成员,不能被重写,所以冲突,
static 无意义;static修饰成员用类名可以直接访问,但是abstract修饰成员没有方法体,所以访问没有方法体的成员无意义。
案例:定义一个动物类:
package day09;public abstract class AnimalDe1 {private String name;private int age;public AnimalDe1(){};public AnimalDe1(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();}定义一个狗类:
package day09;public class DogDe1 extends AnimalDe1 { public DogDe1(){}public DogDe1(String name,int age){super(name,age);}public void eat() {System.out.println("狗吃肉!!!");}}定义一个猫类:
package day09;public class CatDe1 extends AnimalDe1 {public CatDe1(){}public CatDe1(String name,int age){super(name,age);}public void eat() {System.out.println("猫吃鱼!!!");}}
测试类:
package day09;public class MainDe1 {/** * @param args */public static void main(String[] args) {DogDe1 dd = new DogDe1();//调用无参构造实现dd.setName("狗狗1");dd.setAge(2);System.out.println(dd.getName()+"年龄:"+dd.getAge());dd.eat();System.out.println("------------------");DogDe1 dd1 = new DogDe1("狗狗2",3);//通过调用有参构造方法实现System.out.println(dd1.getName()+"年龄:"+dd1.getAge());dd1.eat();System.out.println("------------------");AnimalDe1 dd2 = new DogDe1();//多态实现dd2.setName("狗狗3");dd2.setAge(4);System.out.println(dd2.getName()+"年龄:"+dd2.getAge());dd2.eat();}//猫类同理!!}输出:
狗狗1年龄:2
狗吃肉!!!
------------------
狗狗2年龄:3
狗吃肉!!!
------------------
狗狗3年龄:4
狗吃肉!!!
案例e2:
定义一个老师类:
package day09;public abstract class Teacher {private String name;private int age;public Teacher(){}public Teacher(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 teach();}定义一个基础老师类:
package day09;public class BasicTeacher extends Teacher {public BasicTeacher(){}public BasicTeacher(String name,int age){super(name,age);}public void teach() { System.out.println("基础班"+super.getName()+"老师交基础课程!!");}}定义一个高级老师类:
package day09;public class BasicTeacher extends Teacher {public BasicTeacher(){}public BasicTeacher(String name,int age){super(name,age);}public void teach() { System.out.println("基础班"+super.getName()+"老师交基础课程!!");}}测试类:
package day09;public class MainTeacher {/** * @param args */public static void main(String[] args) {Teacher bt = new BasicTeacher();//实现多态bt.setName("李春男");bt.setAge(24);System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());bt.teach();System.out.println("--------------");//bt = new BasicTeacher("杨莉",24);//有参构造方法实现System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());bt.teach();System.out.println("--------------");//bt = new HighTeacher();//多态拓展,高级老师bt.setName("李春男");bt.setAge(24);bt.teach();System.out.println("--------------");//bt = new HighTeacher("杨莉",24);//有参构造方法实现System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());bt.teach();}}
输出:
姓名:李春男,年龄:24
基础班李春男老师交基础课程!!
--------------
姓名:杨莉,年龄:24
基础班杨莉老师交基础课程!!
--------------
高级班老师李春男交基础课程!!
--------------
姓名:杨莉,年龄:24
高级班老师杨莉交基础课程!!
案例三:员工类:
package day09;public abstract class Employee {private String name; private int id; private int salary; public Employee(){} public Employee(String name,int 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 int getId() {return id;}public void setId(int id) {this.id = id;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;} public abstract void work();}程序员类:
package day09;public class Programer extends Employee {public Programer(){}public Programer(String name,int id,int salary){super(name,id,salary);}public void work() {System.out.println("根据需求写代码!");}}经理类:
package day09;public class Manager extends Employee { private int bounds;//奖金 public Manager(){}//无参构造 public Manager(String name,int id,int salary,int bounds){//有参构造 super(name,id,salary);//传参 this.bounds=bounds;//传参 }public void work() {System.out.println("和客户谈需求!!!");}public int getBounds() {return bounds;}public void setBounds(int bounds) {this.bounds = bounds;} }测试类:
package day09;public class EmployeeMain {/** * @param args */public static void main(String[] args) {//多态实现Employee emp = new Programer(); emp.setName("李春男"); emp.setId(10001); emp.setSalary(8000); System.out.println("姓名:"+emp.getName()+"编号:"+emp.getId()+"薪金"+emp.getSalary()); emp.work(); System.out.println("********************************"); Employee emp1 = new Programer("李春男",10001,8000); emp.setSalary(8000); System.out.println("姓名:"+emp.getName()+"编号:"+emp.getId()+"薪金"+emp.getSalary()); emp.work(); //经理类 /* emp = new Manager(); emp.setName("杨莉"); emp.setId(2001); emp.setSalary(6000); //emp.setBounds(1100);//编译看左边,emp是父类对象引用,而bounds是子类中特有的成变量,所以不能访问,报错!! */ //当遇到有子类特殊变量或者方法时,以上方式不可取,而是直接用具体的类创建对象 Manager man = new Manager(); man.setName("杨莉"); man.setId(2001); man.setSalary(5000); man.setBounds(1200); System.out.println("姓名:"+man.getName()+"编号:"+man.getId()+"薪金"+man.getSalary()); man.work(); System.out.println("*********************************"); Manager man1 = new Manager("杨莉",2001,5000,1200); System.out.println("姓名:"+man1.getName()+"编号:"+man1.getId()+"薪金"+man1.getSalary()); man1.work();}}输出:
姓名:李春男编号:10001薪金8000
根据需求写代码!
********************************
姓名:李春男编号:10001薪金8000
根据需求写代码!
姓名:杨莉编号:2001薪金5000
和客户谈需求!!!
*********************************
姓名:杨莉编号:2001薪金5000
和客户谈需求!!!
- java 抽象类,抽象方法
- java 抽象类,抽象方法
- java抽象函数,抽象类
- Java抽象类抽象方法
- java--抽象类、抽象方法
- java抽象和抽象类
- java抽象类、抽象方法
- java抽象类抽象方法
- java--抽象类/抽象方法
- java中的抽象类
- Java中的抽象类
- Java抽象类
- java抽象类
- java 抽象类 Shape
- java抽象类
- Java抽象类
- java抽象类
- java 抽象类
- BZOJ 2084 Poi2010 Antisymmetry Manacher
- 如何从技术牛人转型为管理高手
- 动态代理模式实现原理
- pwnable之 fix
- VIM 设置C++文本环境以及编译
- java-抽象类
- 怎样使用Apache JMeterce对Web服务器进行压力测试
- Node中的__dirname与process.cwd()
- 暑假学习css学习笔记
- eclipse+maven环境的搭建以及项目的创建
- django开发网站 让局域网中的电脑访问你的主机
- struts2--文件名固定下载
- MySQL分组查询
- XMLHttpRequest对象的属性和