static修饰的方法不能被重写可以被继承以及抽象类中不能有静态的抽象方法

这篇文章介绍了什么是抽象类
今天我们谈谈为什么抽象类中不能有静态的抽象方法以及static修饰的方法不能被重写可以被继承

1 static修饰的方法不能被重写可以被继承

我们知道static修饰的方法为静态方法,可以直接使用类名.方法名进行调用,即该方法不属于某个对象属于该类。

  • 我们根据下面的例子在看看static修饰的方法是否可以被重写:
public class StaticLearnig {
    public static void main(String[] args) {
        SuperClass superClass=new SubClass();
        superClass.a();
        superClass.b();
    }
}
/*
结果:
SuperClass a
SubClass b
*/

class SuperClass{
//静态方法
public static void a(){
System.out.println(“SuperClass a”);
}
//非静态方法
public void b(){
System.out.println(“SuperClass b”);
}

}

class SubClass extends SuperClass{
//静态方法
public static void a(){
System.out.println(“SubClass a”);
}

//非静态方法
public void b(){
    System.out.println("SubClass b");
}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

上面的例子我们可以清晰的看出static修饰的方法根本就没有重写。static方法引用的时候应该用类名来引用,而不是对象。同时static方法不参与继承,所以在继承体系里面也不存在重写的说法。

  • static修饰的方法可以被继承
class A{
 public static void a(){
  System.out.println("a");
 }
}
class B extends A{}

public class Test {
public static void main(String[] args) {
B.a();
}
}
//结果:a
//证明静态方法可以被继承

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

**静态的方法可以被继承,但是不能重写。**如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;

对于static修饰的方法有了一定的了解,这里大家有没有想过一个问题为什么abstract修饰的方法是不可同时是static修饰的呢?

2 抽象类中不能有静态的抽象方法

  • 角度一:static关键字
    从上面的分析我们可以看出static修饰的方法可以被继承但是不能被重写,但是我们知道抽象方法是要被子类去实现的,即需要在子类重写的,那这是不是矛盾了呢?
  • 角度二:对象内存分配
    抽象类是不能实例化的,对象会在实例化时随着对象一起分配在内存,即这时还没有被分配内存;而static修饰的方法在类实例化之前就已经别分配了内存(在准备阶段),这样一来矛盾就出现了。
        </div>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象程序设计与实践 第五章 Java抽象类和接口 面向对象程序设计与实践课程组 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第1页。 教学目标 教学方式 重点知识 学习目标 1.熟悉抽象类的基本含义以及Java的语法规则 2.熟悉接口基本含义以及实现规则 3.掌握抽象类定义方法,并能根据需要进行抽象类设计 4.掌握接口定义以及实现方法 1.抽象类的语法规则 2.接口类的定义及实现规则 3.使用接口实现多态 本章以理论讲解、案例演示、代码分析为主。学习本章内容之前,建议同学们先了解"案例描述",带着设计要求学习案例涉及的知识点,然后动手进行编码实现,需要注意的是: 1.案例5-1的重点在于抽象类抽象方法的设计 2.案例5-2的重点在于接口的定义及设计 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第2页。 目录 CONTENTS 01 5-1 简易公司人事管理 02 5-2 家电产品类设计 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第3页。 01 简易公司人事管理 案例描述 案例分析 关联知识 案例实现 案例小结 案例拓展 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第4页。 5-1案例描述 现有一软件公司,公司有开发人员若干、项目经理若干、地区经理若干。已知开发人员有姓名、工号和薪水的属性,并为公司进行工作。项目经理除了有姓名、工号和薪水还有奖金,并为公司进行工作。地区经理除了有姓名、工号和薪水还有奖金和公司的股票分红,也为公司进行工作。现要求根据给出的需求进行公司人员管理。 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第5页。 抽象方法 5-1关联知识 抽象方法只有声明没有方法体,不需要具体实现 abstract 返回值数据类型 抽象方法名(); 抽象方法必须用abstract关键字进行修饰,且不能同时使用final或static进行修饰。如果一个类含有抽象方法,则这个类也必须定义为抽象类抽象类必须在类前用abstract关键字修饰。 例如,将Pet类的两个方法定义为抽象方法 public abstract void enjoy(); //将enjoy定义为抽象方法 public abstract void move(); //将move定义为抽象方法 抽象方法目的就是为了实现一个接口多种方法的原理,即所有的子类对外都呈现一个相同名字的方法抽象方法必须被重写,且构造方法、类方法不能声明为抽象方法。 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第6页。 抽象类 5-1关联知识 抽象类在类层次结构代表一般性概念,规定必须实现方法的统一接口,子类将基于此概念来定义方法,定义方法如下: abstract class 类名{ 数据成员; //定义抽象方法,没有方法体实现 abstract 返回值数据类型 抽象方法名(); 访问权限 返回值数据类型 成员方法名(形式参数列表){ …方法实现 } } 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第7页。 抽象类的特点 5-1关联知识 (1)抽象类可以有抽象方法,也可以有非抽象方法 (2)抽象类必须被继承 (3)抽象类本身不能实例化,即不能使用new运算创建对象。只有它的非抽象子类可以创建对象,而抽象类定义的对象可以用于指向子类对象。例如, Pet p = new Pet("小白","白色",2,12,2000);//错误,抽象类不能实例化 Pet p = new Cat("咪咪","灰色",1,8,3000,"波斯猫");//正确,可以指向子类对象 (4)由抽象类派生的子类必须实现所有父类的抽象方法,否则,该子类仍然是抽象类。 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第8页。 抽象类 5-1关联知识 PupilStu p = new PupilStu(); p.pay(); MiddleStu m = new MiddleStu(); m.pay(); HighStu h = new HighStu();h.pay(); ColgStu c = new ColgStu();c.pay(); 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第9页。 5-1案例分析 交流与讨论 结合案例分析,思考一下几个问题: 开发人员——静态属性为姓名、工号、薪水,动态行为为工作 项目经理——静态属性为姓名、工号、薪水,奖金;行为为工作 地区经理——静态属性为姓名、工号、薪水,奖金、股票分红;行为为工作 父类——共性内

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值