什么是抽象?
复杂来讲:“抽取关键相关特性(属性和方法)构成对象,用程序的方法逻辑和数据结构 属性模拟现实的世界对象”
简单地说:“抽象只从正确的角度,透露对象的某些相关细节。”
Java中的抽象类
概述:
在面向对象编程的过程中,所有的对象都可以通过类来创建,但是,并不是所有的类都可以创建对象,如果一个类中没有足够完整的信息来描述具体对象的话,那么这个类叫抽象类
abstract关键字
作用:
abstract修饰的类叫抽象类
abstract修饰的方法叫抽象方法
abstract只能修饰类和方法
语法格式:
[public] abstarct class 类名{
//普通方法:
public void 方法名(){
方法体;
}
//抽象方法
public abstarct void 方法名(); // 注意:没有方法体
}// 如果一个类中存在抽象方法,那么该类就必须声明为抽象类 ***
注意事项:
1.用abstract来修饰的类叫抽象类
2.可以有普通成员方法和抽象成员方法
3.抽象方法没有方法体,是不完整的方法
4.抽象类不能被实例化 抽象类不能被实例化 抽象类不能被实例化 所以 5
5.使用普通类去继承抽象类,然后重写抽象方法或成员方法
6.在子类中一定去实现(重写)抽象类中所有的抽象方法
7.非抽象方法可以重写也可以不重写
8.抽象类可以继承抽象类
9.抽象类可以继承非抽象类(普通类)
示例1:
abstract class Animal{
public abstract void play();
public abstract void eat();
public void sleep() {
System.out.println("动物会睡觉");
}
}
class Panda extends Animal{
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("大熊猫会和同类打闹");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("大熊猫吃竹子");
}
@Override
public void sleep() {
System.out.println("大熊猫喜欢睡懒觉");
}
}
class Cat extends Animal {
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("猫玩毛球");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("猫吃鱼");
}
@Override
public void sleep() {
System.out.println("小猫喜欢在白天睡觉");
}
}
public class Test01 {
public static void main(String[] args) {
Panda panda = new Panda();
Cat cat = new Cat();
panda.eat();
panda.play();
panda.sleep();
cat.eat();
cat.play();
cat.sleep();
}
}
//输出结果:
大熊猫吃竹子
大熊猫会和同类打闹
大熊猫喜欢睡懒觉
猫吃鱼
猫玩毛球
小猫喜欢在白天睡觉
示例2
//抽象角色类
abstract class Role { // 角色
private String name;
private int age;
private char sex;
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
//抽象play方法
public abstract void play();
//构造方法
public Role() {
this("王二狗", 18, '男');//this关键字调用本类有参构造方法
}
public Role(String name, int age, char sex) {
//super();
//this(); 如果去掉无参中的this则可在有参中使用
this.name = name;
this.age = age;
this.sex = sex;
}
//抽象信息展示方法
public abstract void InformationDisplay();
}
//雇员类
class Employee extends Role{
private double salary;
public void setSalary(double salary) {
this.salary = salary;
}
public double getSalary() {
return salary;
}
public Employee(double salary) {
super();
this.salary = salary;
}
public Employee() {
super(); //super关键字调用父类无参构造方法
// TODO Auto-generated constructor stub
}
public Employee(String name, int age, char sex) {
super(name, age, sex); // super关键字调用父类有参构造方法
// TODO Auto-generated constructor stub
}
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("雇员正在聚会");
}
public final void sing() {
this.play();
System.out.println("并且唱起了歌");
}
@Override
public void InformationDisplay() {
// TODO Auto-generated method stub
System.out.println("姓名:" + super.getName() + " 年龄:" + super.getAge() + " 性别:" + super.getSex() + " 月薪资:" + this.getSalary());
}
}
//经理类
class Manager extends Employee{ // 经理继承于雇员
final String vehicle = "私家车";
public Manager() {
super();
// TODO Auto-generated constructor stub
}
public Manager(double salary) {
super(salary);
// TODO Auto-generated constructor stub
}
public Manager(String name, int age, char sex) {
super(name, age, sex);
// TODO Auto-generated constructor stub
}
@Override
public void play() {
// TODO Auto-generated method stub
//super.play();
System.out.println("经理正在喝酒");
}
@Override
public void InformationDisplay() {
// TODO Auto-generated method stub
//super.InformationDisplay();
System.out.println("姓名:" + super.getName() + " 年龄:" + super.getAge() + " 性别:" + super.getSex() + " 月薪资:" + this.getSalary()+" 交通方法:"+this.vehicle);
}
}
//测试类
public class Test {
public static void main(String[] args) {
//
Employee employee = new Employee();
// employee.setName("王荆川");
// employee.setAge(26);
// employee.setSex('男');
employee.setSalary(18327.6);
employee.InformationDisplay();
employee.play();
employee.sing();
//
Employee employee2 = new Employee("刘非明",24,'男');
employee2.setSalary(28327.6);
employee2.InformationDisplay();
employee2.sing();
//
Manager manager = new Manager("李经理",39,'男');
manager.setSalary(50000.00);
manager.InformationDisplay();
manager.play();
}
}
//输出结果:
姓名:王二狗 年龄:18 性别:男 月薪资:18327.6
雇员正在聚会
雇员正在聚会
并且唱起了歌
姓名:刘非 年龄:24 性别:男 月薪资:28327.6
雇员正在聚会
并且唱起了歌
姓名:李经理 年龄:39 性别:男 月薪资:50000.0 交通方法:私家车
经理正在喝酒
final关键字
用法:
1.final可以修饰成员变量
使用final修饰的成员变量一定要赋值(初始化),且不能修改
2.final可以修饰局部变量
修饰局部变量时,可先对变量不赋值,使用之前进行赋值,一旦赋值无法更改
3.final可以修饰成员方法
final修饰的成员方法不能被重写 ,在继承关系中
4.final可以修饰一个类
final修饰的类不能被继承
5.final可以修饰一个对象的引用
修饰对象引用 一旦被赋值 就无法改变(内存地址锁定)