16.语法对照-面向对象(python-java)
功能 |
python |
java |
示例 |
|
|
文件 |
一个模块(py文件)可有有多个类 |
一个文件只能有一个公有类(内部类也可为公有),且类名和文件名相同 |
作用域 |
公有:无 _前缀:约定私有,外部可访问; __前缀:自动转换成类名+属性名 __init__:内建属性或方法 |
私有:private,类内部可访问 保护:protected,类和子类可以访问 默认 :无,同包可以访问 公有:public |
继承 |
1.基类 object,包括内建类型 2.语法 类名(父类) 3.多重继承 允许 |
1.基类 Object,除了基本类型(int,float等) 2.语法 类名 implements 接口/类名 extends 父类 3.多重继承 只允许继承一个父类,但是允许实现多个接口 |
接口 |
无 |
1.常量(默认static final) 2.抽象方法(默认public) 3.默认方法(java8) 4.静态方法(java8) 5.私有方法(java9) 5.私有静态方法(java9) |
抽象类 |
默认不支持,使用abc模块实现 1.语法 修改抽象类的元类为ABCMeta, 抽象方法:装饰器@abstractmethod 抽象属性:装饰器@abstractproperty 2.特性:抽象方法,其它同普通类; |
1.特性 抽象方法,其它同普通类; |
子类 |
1.直接继承:继承父类属性/方法,实现父类的抽象方法 2.虚拟子类:装饰器@类名.register,不会继承父类属性/方法,也不用实现父类的抽象方法,但可以通过issubclass/isinstance检测出继承关系 |
1.直接继承:继承父类属性/方法,实现父类的抽象方法 |
实例 |
动态类型,可动态为实例添加成员变量/成员方法 |
静态类型 |
成员变量 |
内建方法__init__定义:self.v1 = "test" |
类内部定义:public String v1 = "test"; |
静态成员变量 |
无 |
类内部定义:public static String v1 = "test"; 属于类,调用方式:类名.v1/实例名.v1 |
类成员变量 |
类内部定义:v1 = "test" 属性类,调用方式:类名.v1/实例名.v1 如果调用:实例名.v1 = "test2",则实例会新建一个v1变量,该实例就具有了属于自己的v1变量 |
无 |
成员方法 |
类内部定义:def test(self) 默认第一个参数为类的实例,约定为self |
类内部定义:public void test() 方法内部有默认的关键字this, 代表类的实例 |
类成员方法 |
类内部定义: @classmethod def test(cls) 属于类,第一个参数代表类本身,约定使用cls。可以通过cls访问类成员变量 调用方式:类名.test()/实例名.test() |
无 |
静态成员方法 |
类内部定义: @staticmethod def test() 属于类,可通过类名访问类成员变量 调用方式:类名.test()/实例名.test() |
类内部定义:public static void test() 属于类,可以访问静态成员变量 调用方式:类名.test()/实例名.test() |
super |
1.简化形式(没有参数) 只能在方法内部使用,super().says(); 2.带参形式 可以在任何地方使用,super(Test, instanse).says(); |
1.super 代表父类的实例,super.says(); |
描述符 |
可自定义在引用一个对象的属性时应该完成的事情; 描述符协议 __set__(self, obj, type=None):设置属性; __get__(self. obj):获取属性; __delete__(self. obj):对属性调用del时调用; |
无 |
property |
内置的描述符类型,它将一个属性链接到一组方法上。property接受4个可选参数:fget、fset、fdel和doc |
类似:定义于成员变量,然后定义getter/setter方法 |
槽 |
使用__slots__属性为指定的类设置一个静态属性列表,并在类的每个实例中跳过__dict__字典的创建过程; 不能为定义了槽的类实例动态添加属性 |
无 |
类的创建过程 |
__new__(cls):负责创建类实例的类方法; __init__(self):创建对象之后马上调用初始化方法 ; |
public 类名():构造方法 |
类对象 |
元类:metaclass,元类都默认继承自type 场景:可自定义metaclass对象,实现指定的功能 python语言最灵活的功能之一,应用于各大框架 |
class对象 场景:java反射,动态调用对象成员变量/方法 java语言最灵活的功能之一,应用于各大框架 |
内建属性/方法 |
python每个类都有相同的内建属性/方法; 1.内建属性 __class__:获取实例所在的类; __bases__:获取类的所有父类构成元素; __dict__: 类:包含共享的变量和函数(类属性,方法等); 实例:包含实例属性; __doc__:类文档,help(类或实例)时调用; __name__:类名; __module__:模块名; __mro__:方法解析顺序; 2.内建方法 2.1生命周期 __new__(cls):负责创建类实例的类方法; __init__(self):创建对象之后马上调用初始化方法 ; __del__:析构方法,执行清理动作,不建议操作;(2) 2.2类的表示 __str__:打印时调用,如果没有实现,使用repr;(1) __repr__:使用类实例或者 print(repr(类实例))调用;(1) __format__(self):类的实例用于字符串格式化; __hash__(self):调用hash()时使用(__eq__结合);(3) __nonzero__(self):调用bool()时使用; __dir__(self):调用dir()时使用; 2.3.访问控制 __getattr__(self, name):访问不存在的属性时调用; __delattr__(self, name):删除name属性; __setattr__(self, name, value):设置name属性; __getattribute__:属性访问拦截器; 2.4.容器相关 __len__(self):返回容器的长度; __getitem__(self, key):使用self[key]时调用; __setitem__(self, key):使用self[key]赋值时的调用; __iter__(self, key):返回当前容器的一个迭代器; __reversed__(self):返回一个反转的序列; __contains__(self, item):使用in和not in时调用; __missing__(self ,key):访问字典不存在的键时调用; 2.5.类关系 __instancecheck__(self, instance):检查实例; __subclasscheck__(self, subclass):检查子类; 2.6.上下文管理器(5) __enter__:返回值绑定到指定的as语句; __exit__:退出时的清理代码; 2.7.描述符协议 __set__(self, obj, type=None):设置属性; __get__(self. obj):获取属性; __delete__(self. obj):对属性调用del时调用 2.8.比较 __cmp__(self, other):比较操作符的行为;(7) __gt__(self,other):大于; __lt__(slef,other):小于; __ge__(slef,other):大于或者等于; __le__(slef,other):小于或者等于; __eq__(slef,other):等于;(3) __ne__(self, other):不等于; 2.9.调用 __call__(self, *args):把实例对象作为函数调用; 2.10.拷贝 __copy__(self):浅拷贝;(4) __deepcopy__(self, memodict=):深拷贝;(4) 2.11.Pickling(序列化) (8) __getnewargs__(self):反序列化时传递__new__参数; __getstate__(self):在序列化存储状态; __setstate__(self):在反序列化时传递状态; __reduce__(self):序列化扩展类型(C语言API); __reduce_ex__(self):__reduce__的兼容模式; 2.12.迭代器协议(6) __next__:返回下一个元素; __iter__:返回迭代器本身; 2.13.操作符 A. 一元操作符 __pos__(self):取正; __neg__(self):取负; __abs__(self):绝对值; __invert__(self):取反; __round__(self, n):四舍五入; __floor__(self):向下取整; __ceil__(self):向上取整; __trunc__(self):取距离零最近的整数; B.算术操作符 __add__(self, other):加法; __sub__(self, other):减法; __mul__(self, other):乘法; __floordiv__(self, other)://操作符的整数除法; __div__(self, other):/操作符的除法; __truediv__(self, other):_true_除法; __mod__(self, other):取余; __divmod__(self, other):divmod; __pow__:**; __lshift__(self, other):左移位运算符<<; __rshift__(self, other):右移位运算符>> ; __and__(self, other):按位与运算符&; __or__(self, other):按位或运算符|; __xor__(self, other):按位异或运算符^; C.反射算术运算符 D.增强赋值运算符 E.类型转换操作符 |
java通过继承父类或者实现接口来获取不同的方法; 1.Object getClass():获取class对象; toString():在打印类/与字符串连接时默认调用;(1) equals():调用对象的equals方法时默认调用,通常与hahCode联合使用;(3) hashCode():生成对象的hash值;(3) clone():对象克隆;(4) finalize(): 垃圾回收时执行清理动作, 不建议操作;(2) notify():唤醒线程 notifyAll():唤醒所有线程; wait():线程等待; 2.容器相关 Collection接口,Map接口,List接口,Set接口 3.AutoCloseable接口(5) close():退出时的清理代码; 4.Itreator接口(6) hasNext():是否还有元素; next():返回下一个元素; remove():移除迭代器返回的最后一个元素; 5.Comparable接口(7) compareTo():比较方法; 6.Spliterator接口 tryAdvance(Consumer action):是否还有元素; trySplit():切分元素; estimateSize():估计还有多少元素; characteristics():特性集的编码; 7.Serializable接口 (8) 方法无:可序列化标记; |