Java和Python覆盖/重写函数的比较

简介: Java和Python覆盖/重写函数的比较

Override是面向对象语言的一个特性,在基类定义一个函数/方法,在子类中,重写这个函数/方法,将其表现为另一个形式,从而在继承后,完成多态。而类属性实际上也可以重写。在子类中定义同样名称的类属性,比如a,调用a时,就看不到基类的a了。


下面我们分别用Java和Python做一个说明,设计一个基类和一个子类,并重写一个属性和一个方法。


Java 文件名:SubClass.java


class BaseClass{
    int a = 1;
    public void accessOwner(){System.out.println("base.a="+a);}
}
public class SubClass extends BaseClass{
    int a = 2;
    @Override
    public void accessOwner(){
        System.out.println("sub.a="+a);
        super.accessOwner();
    }
    public void accessSuper(){System.out.println("super.a="+super.a);}
    public static void main(String args[]){
        SubClass sc1 = new SubClass();
        sc1.accessOwner();  //a=2 换行 base.a=1
        System.out.println();
        sc1.accessSuper();  //super.a=1
    }
}


输出为:

1. sub.a=2
2. base.a=1
3. 
4. super.a=1


Python

class BaseClass():
    a = 1
    @classmethod
    def test(cls):
        print("base.a=%d"%cls.a)
class SubClass(BaseClass):
    a = 2
    @classmethod
    def test(cls):
        print("sub.a=%d 注意这里的a已经是子类的a" % cls.a)
        super(SubClass, cls).test() #now in base:1  in Python 2 or 3
        super().test()  #同样输出now in base:1   only in Python 3
        print("调用基类的a %d" % super().a)
    def check(self):
        print("check a=%d  %d"% (self.a, id(self.a)))
    @classmethod
    def __test__(self):
        print("hello class method")
    @staticmethod
    def staticfunc():
        print("static函数不调用类变量和实例变量,定义时不用self")
BaseClass.test()
print()
SubClass.test()
c = SubClass()
print("Sub.__test__")
SubClass.__test__()
#调用静态方法示例
SubClass.staticfunc() #可以用类名调用静态方法
c.staticfunc()  #可以用实例调用静态方法
#调用实例
print("修改实例的a并且加一个属性b:")
c.check()
c.a = 99
c.b = 66
print(c.a,c.b)
c.check()
print("SubClass的a仍然是:%d %d"% (SubClass.a,id(SubClass.a)))


输出:

base.a=1
sub.a=2 注意这里的a已经是子类的a
base.a=2
base.a=2
调用基类的a 1
Sub.__test__
hello class method
static函数不调用类变量和实例变量,定义时不用self
static函数不调用类变量和实例变量,定义时不用self
修改实例的a并且加一个属性b:
check a=2  140727241862944
99 66
check a=99  140727241866048
SubClass的a仍然是:2 140727241862944


Python的类属性在类方法中的调用和Java有点不同,如果使用子类的类方法test调用类属性a,需要传一个参数cls给方法,这时,cls.a就是子类的值了。如果只写a或者硬是写一个self.a,都会被认为没有定义。实际上,cls也可以换为self,在这个方法定义中效果是一样的,如果把subClass中的cls全部换成self,会看到一样的输出。


Python的类属性a在实例中被重新定义后,就会生成一个新的id,用一个新指针去指向它,这跟新加一个属性没太大区别了。


上述例子中,原来的类属性a id是140727241862944,重新定义后,再次调用SubClass.a可以看到仍然是这个值。但是,实例去调用a,id已经变了。



目录
相关文章
|
1月前
|
数据采集 缓存 Java
Python vs Java:爬虫任务中的效率比较
Python vs Java:爬虫任务中的效率比较
|
1月前
|
Python
【python从入门到精通】-- 第五战:函数大总结
【python从入门到精通】-- 第五战:函数大总结
63 0
|
28天前
|
Python
Python之函数详解
【10月更文挑战第12天】
Python之函数详解
|
29天前
|
存储 数据安全/隐私保护 索引
|
18天前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。
|
20天前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
|
23天前
|
Python
python的时间操作time-函数介绍
【10月更文挑战第19天】 python模块time的函数使用介绍和使用。
27 4
|
24天前
|
存储 Python
[oeasy]python038_ range函数_大小写字母的起止范围_start_stop
本文介绍了Python中`range`函数的使用方法及其在生成大小写字母序号范围时的应用。通过示例展示了如何利用`range`和`for`循环输出指定范围内的数字,重点讲解了小写和大写字母对应的ASCII码值范围,并解释了`range`函数的参数(start, stop)以及为何不包括stop值的原因。最后,文章留下了关于为何`range`不包含stop值的问题,留待下一次讨论。
18 1
|
30天前
|
索引 Python
Python中的其他内置函数有哪些
【10月更文挑战第12天】Python中的其他内置函数有哪些
15 1
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
25 1