首页 文章 精选 留言 我的

精选列表

搜索[c 17],共10016篇文章
优秀的个人博客,低调大师

17个Python小窍门

python中相对不常见却很实用的小窍门。 空谈不如来码代码吧: 交换变量值 给列表元素创建新的分隔符 找列表中出现次数最多的元素 核对两个字符是否为回文 反向输出字符串 反向输出列表 转置2维数组 链式比较 我刚整理了一套2018最新的0基础入门和进阶教程,无私分享,加Python学习q u n:227-435-450即可获取,内附:开发工具和安装包,以及系统学习路线图 函数的链式写法 复制列表 字典的添加 对字典的值排序 for else结构 将列表转换为逗号分隔 字典的合并 找列表中最大、最小值下标 从列表中删除重复项 如果你觉得我有需改进的地方或者有其他建议请评论,我会继续更新这个博客的。 博客中的大多数的窍门都是我从PyTricks和一些其他博客找到的。 谢谢你的阅读,如果喜欢此文请点个赞吧

优秀的个人博客,低调大师

17.Swift学习之类

类介绍 Swift虽然推荐面向协议编程,但其也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象(类的实例) Swift中用class关键字定义类 定义语法 class 类名 { // 定义属性和方法 } 举例 class Person { var name = "Zhangsan" var age = 10 var sex = "man" func say(){ print("人会说话") } } 解读 定义了一个名叫 Person的类 这个类有三个变量存储属性和一个方法 类的实例 结构体一样,最简单的是在名称后面加一个(),但默认没有成员构造函数 var p1 = Person() 访问属性和方法 可以用.来访问一个实例的属性和方法 访问时如果使用了赋值语句就是设置属性 //普通构造函数 var p1 = Person() //访问 p1.age //设置 p1.age = 30 p1.name p1.sex p1.say() 类是引用类型 不同于值类型,引用类型被赋值到一个常量,变量或者本身被传递到一个函数的时候它是不会被拷贝的,而使用的是同一个对某个实例的引用。 var p2 = p1 p2.name = "Lisi" p2.age = 20 p2.sex = "woman" //对p2的修改会影响原来的p1 p1.age p1.name p1.sex 特征运算符 因为类是引用类型,可能有很多常量和变量都是引用到了同一个类的实例。有时候需要找出两个常量或者变量是否引用自同一个实例,Swift提供了两个特征运算符来检查两个常量或者变量是否引用相同的实例。 相同于 ( ===) 不同于( !==) //特征运算符 let p3 = Person() p1 === p2 //true p1 === p3 //false p1 !== p3 //true 继承 一个类可以从另一个类继承方法、属性和其他的特性 当一个类从另一个类继承的时,继承的类就是子类,被继承的就是父类 继承的目的是为了代码复用 Do Not Repeat Yourself 案例 // 定义一个父类 class Vehicle { var currentSpeed = 0.0 func makeNoise() { print("Ba Ba") } } // 定义一个子类 class Bicycle: Vehicle { var hasBasket = false } // 定义一个子类 class Car: Vehicle { var banner = "皖B12345" } var vehicle = Vehicle() vehicle.makeNoise() let bicycle = Bicycle() bicycle.makeNoise() var car = Car() car.makeNoise() 重写(覆写) 所谓重写就是子类可以对继承自父类实例方法、类型方法、实例属性,类型属性进行覆盖 重写需要在前面加上 override 关键字 override 关键字执行时Swift 编译器会检查重写的类的父类(或者父类的父类)是否有与之匹配的声明来提供重写 class Car: Vehicle { var banner = "皖B12345" override func makeNoise() { print("Di Di") } } var car = Car() car.makeNoise() 防止被重写 可以通过final标记阻止这种行为:final var , final func , final class func class Vehicle { var currentSpeed = 0.0 func makeNoise() { print("Ba Ba") } //不能被子类重写 final func run() { print("Run Run") } } 类与结构体的对比 相同点 定义属性 定义方法 定义构造函数(init函数) 可以被扩展 遵循协议 类有而结构体没有的额外功能 继承 类型转换(子类 as 父类) 析构函数 引用计数 开发中类与结构体的使用场景 类和结构体都可以用来定义自定义的数据类型,结构体实例总是通过值来传递,而类实例总是通过引用来传递。 按照通用准则,当符合以下一条或多条情形时应考虑结构体,其他情况下,使用类。大部分的自定义的数据结构应该是类,而不是结构体。 要描述的数据类型中只有少量的简单数据类型的属性 要描述的数据类型在数据传递时要以复制的方式进行 要描述的数据类型中所有的属性在进行传递时需要以复制的方式进行 不需要继承另一个数据类型 比如: 定义几何形状的大小,封装了一个 width属性和 height属性,两者为 Double类型; 定义一定范围的路径,封装了一个 start属性和 length属性,两者为 Int类型; 定义三维坐标系的一个点,封装了 x , y 和 z属性,它们是 Double类型。

优秀的个人博客,低调大师

17、python面向对象进阶

面向对象进阶 isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo) 反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) def hasattr(*args, **kwargs): # real signature unknown """ Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError. """ pass 以下实例展示了 hasattr 的使用方法: #!/usr/bin/python# -*- coding: UTF-8 -*- class Coordinate: x = 10 y = -5 z = 0 point1 = Coordinate() print(hasattr(point1, 'x'))print(hasattr(point1, 'y'))print(hasattr(point1, 'z'))print(hasattr(point1, 'no')) # 没有该属性 def getattr(object, name, default=None): # known special case of getattr """ getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case. """ pass 以下实例展示了 getattr 的使用方法: >>>class A(object): ... bar = 1... >>> a = A()>>> getattr(a, 'bar') # 获取属性 bar 值1>>> getattr(a, 'bar2') # 属性 bar2 不存在,触发异常Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'A' object has no attribute 'bar2'>>> getattr(a, 'bar2', 3) # 属性 bar2 不存在,但设置了默认值3 def setattr(x, y, v): # real signature unknown; restored from __doc__ """ Sets the named attribute on the given object to the specified value. setattr(x, 'y', v) is equivalent to ``x.y = v'' """ pass 以下实例展示了 setattr() 函数的使用方法: 实例一 >>>class A(object): ... bar = 1... >>> a = A()>>> getattr(a, 'bar') # 获取属性 bar 值1>>> setattr(a, 'bar', 5) # 设置属性 bar 值>>> a.bar5 实例二 def delattr(x, y): # real signature unknown; restored from __doc__ """ Deletes the named attribute from the given object. delattr(x, 'y') is equivalent to ``del x.y'' """ pass 以下实例展示了 delattr 的使用方法:实例一class Coordinate: x = 10 y = -5 z = 0 point1 = Coordinate() print('x = ',point1.x)print('y = ',point1.y)print('z = ',point1.z) delattr(Coordinate, 'z') print('--删除 z 属性后--')print('x = ',point1.x)print('y = ',point1.y) # 触发错误print('z = ',point1.z) 实例二 class Foo: f = '类的静态变量' def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print('hi,%s'%self.name) obj=Foo('egon',73)#检测是否含有某属性print(hasattr(obj,'name'))print(hasattr(obj,'say_hi'))#获取属性n=getattr(obj,'name')print(n) func=getattr(obj,'say_hi') func()print(getattr(obj,'aaaaaaaa','不存在啊')) #报错#设置属性setattr(obj,'sb',True) setattr(obj,'show_name',lambda self:self.name+'sb')print(obj.__dict__)print(obj.show_name(obj))#删除属性delattr(obj,'age') delattr(obj,'show_name') delattr(obj,'show_name111')#不存在,则报错print(obj.__dict__) 实例三 class Foo(object): staticField = "old boy" def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' @staticmethod def bar(): return 'bar' print getattr(Foo, 'staticField') #获取到属性值print getattr(Foo, 'func') #获取到func的地址print getattr(Foo, 'bar') 实例四 import sys def s1(): print 's1'def s2(): print 's2'this_module = sys.modules[__name__] hasattr(this_module, 's1') getattr(this_module, 's2') 导入其他模块,利用反射查找该模块是否存在某个方法 def test(): print('from the test') """ 程序目录: module_test.py index.py 当前文件: index.py """import module_test as obj#obj.test()print(hasattr(obj,'test')) getattr(obj,'test')() __str__和__repr__ 改变对象的字符串显示__str__,__repr__ 自定制格式化字符串__format__ #_*_coding:utf-8_*_format_dict={ 'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型 'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址 'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名}class School: def __init__(self,name,addr,type): self.name=name self.addr=addr self.type=type def __repr__(self): return 'School(%s,%s)' %(self.name,self.addr) def __str__(self): return '(%s,%s)' %(self.name,self.addr) def __format__(self, format_spec): # if format_spec if not format_spec or format_spec not in format_dict: format_spec='nat' fmt=format_dict[format_spec] return fmt.format(obj=self) s1=School('oldboy1','北京','私立')print('from repr: ',repr(s1))print('from str: ',str(s1))print(s1)''' str函数或者print函数--->obj.__str__() repr或者交互式解释器--->obj.__repr__() 如果__str__没有被定义,那么就会使用__repr__来代替输出 注意:这俩方法的返回值必须是字符串,否则抛出异常 '''print(format(s1,'nat'))print(format(s1,'tna'))print(format(s1,'tan'))print(format(s1,'asfdasdffd')) class B: def __str__(self): return 'str : class B' def __repr__(self): return 'repr : class B'b=B()print('%s'%b)print('%r'%b) __del__ 析构方法,当对象在内存中被释放时,自动触发执行。 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。 class Foo: def __del__(self): print('执行我啦') f1=Foo()del f1print('------->')#输出结果执行我啦 -------> item系列 __getitem__\__setitem__\__delitem__ class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): print(self.__dict__[item]) def __setitem__(self, key, value): self.__dict__[key]=value print("f1['age']=18时,我执行") def __delitem__(self, key): print('del obj[key]时,我执行') self.__dict__.pop(key) def __delattr__(self, item): print('del obj.key时,我执行') self.__dict__.pop(item) f1=Foo('sb') # __dict__[item] 内部是以字典的形式保存数据 # __setitem__设置 key, value f1['age']=18 f1['age1']=19 # __getitem__ 输出设置的值 print(f1.age) # __delattr__ 根据Key删除设置的属性 del f1.age1 # __delitem__ 根据value删除设置的属性 del f1['age'] f1['name']='alex' print(f1.__dict__) __new__ View Code class A: def __init__(self): self.x = 1 print('in init function') def __new__(cls, *args, **kwargs): print('in new function') return object.__new__(A, *args, **kwargs) a = A() print(a.x) 单例模式 class Singleton: def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): cls._instance = object.__new__(cls, *args, **kw) return cls._instance one = Singleton() two = Singleton() two.a = 3print(one.a)# 3 # one和two完全相同,可以用id(), ==, is检测print(id(one))# 29097904print(id(two))# 29097904print(one == two)# Trueprint(one is two) __call__ 对象后面加括号,触发执行。 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # 执行 __init__obj() # 执行 __call__ __len__ class A: def __init__(self): self.a = 1 self.b = 2 def __len__(self): return len(self.__dict__) a = A()print(len(a)) __hash__ class A: def __init__(self): self.a = 1 self.b = 2 def __hash__(self): return hash(str(self.a)+str(self.b)) a = A()print(hash(a)) __eq__ class A: def __init__(self): self.a = 1 self.b = 2 def __eq__(self,obj): if self.a == obj.a and self.b == obj.b: return True a = A() b = A()print(a == b) 纸牌游戏 from collections import namedtuple Card = namedtuple('Card',['rank','suit']) class FranchDeck: ranks = [str(n) for n in range(2,11)] + list('JQKA') suits = ['红心','方板','梅花','黑桃'] def __init__(self): self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits] def __len__(self): return len(self._cards) def __getitem__(self, item): return self._cards[item] deck = FranchDeck()print(deck[0])from random import choiceprint(choice(deck))print(choice(deck)) 纸牌游戏2 from collections import namedtuple Card = namedtuple('Card',['rank','suit']) class FranchDeck: ranks = [str(n) for n in range(2,11)] + list('JQKA') suits = ['红心','方板','梅花','黑桃'] def __init__(self): self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits] def __len__(self): return len(self._cards) def __getitem__(self, item): return self._cards[item] def __setitem__(self, key, value): self._cards[key] = value deck = FranchDeck() print(deck[0]) from random import choice print(choice(deck)) print(choice(deck)) from random import shuffle shuffle(deck) print(deck[:5]) 一道面试题 class Person: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def __hash__(self): return hash(self.name+self.sex) def __eq__(self, other): if self.name == other.name and self.sex == other.sex:return True p_lst = []for i in range(84): p_lst.append(Person('egon',i,'male'))print(p_lst)print(set(p_lst))

优秀的个人博客,低调大师

Android 中文 API (17) —— TextSwitcher

正文 一、结构 public classTextSwitcherextendsViewSwitcher java.lang.Object android.view.View android.view.ViewGroup android.widget.FrameLayout android.widget.ViewAnimator android.widget.ViewSwitcher android.widget.TextSwitcher 二、类概述 ViewSwitcher仅仅包含子类型TextView。TextSwitcher被用来使屏幕上的label产生动画效果。每当setText(CharSequence)被调用时,TextSwitcher使用动画方式将当前的文字内容消失并显示新的文字内容。(译者注:改变文字时增加一些动画效果) 三、构造函数 public TextSwitcher (Context context) 创建一个新的空TextSwitcher 参数 context应用程序上下文 public TextSwitcher (Context context, AttributeSet attrs) 使用提供的context和attributes来创建一个空的TextSwitcher 参数 context应用程序环境 attrs属性集合 四、公共方法 public void addView (View child, int index, ViewGroup.LayoutParams params) 根据指定的布局参数新增一个子视图 参数 child新增的子视图 index新增子视图的位置 params新增子视图的布局参数 抛出异常 IllegalArgumentException当子视图不是一个TextView实例时 public void setCurrentText (CharSequence text) 设置当前显示的文本视图的文字内容。非动画方式显示。 参数 text需要显示的新文本内容 public void setText (CharSequence text) 设置下一视图的文本内容并切换到下一视图。可以动画的退出当前文本内容,显示下一文本内容。 参数 text需要显示的新文本内容 五、代码示例 5.1 摘自APIDemos->View->TextSwitcher 5.1.1 Java public class TextSwitcher1 extends Activity implements ViewSwitcher.ViewFactory, View.OnClickListener{ private TextSwitchermSwitcher; private int mCounter = 0 ; @Override protected void onCreate(BundlesavedInstanceState){ super .onCreate(savedInstanceState); setContentView(R.layout.text_switcher_1); mSwitcher = (TextSwitcher)findViewById(R.id.switcher); mSwitcher.setFactory( this ); Animationin = AnimationUtils.loadAnimation( this , android.R.anim.fade_in); Animationout = AnimationUtils.loadAnimation( this , android.R.anim.fade_out); mSwitcher.setInAnimation(in); mSwitcher.setOutAnimation(out); ButtonnextButton = (Button)findViewById(R.id.next); nextButton.setOnClickListener( this ); updateCounter(); } public void onClick(Viewv){ mCounter ++ ; updateCounter(); } private void updateCounter(){ mSwitcher.setText(String.valueOf(mCounter)); } public ViewmakeView(){ TextViewt = new TextView( this ); t.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL); t.setTextSize( 36 ); return t; } } 5.1.2 XML <? xmlversion="1.0"encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:layout_width ="match_parent" android:layout_height ="match_parent" android:orientation ="vertical" > < Button android:id ="@+id/next" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:text ="@string/text_switcher_1_next_text" /> < TextSwitcher android:id ="@+id/switcher" android:layout_width ="match_parent" android:layout_height ="wrap_content" /> </ LinearLayout > 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582684,如需转载请自行联系原作者

优秀的个人博客,低调大师

Java入门系列-17-多态

这篇文章贯穿游戏中的一些功能带你掌握多态的使用 为什么要使用多态 在一款对战类游戏中(如有雷同纯属巧合),有两个不同的法师英雄:小乔、妲己。两个法师英雄的都有攻击的方法,小乔的攻击伤害为10,消耗魔法20。妲己的攻击伤害为15,消耗魔法30。玩家可以操作两个英雄进行攻击,下面看看实现的代码。 父类-英雄:whyusepolymorphic.Hero.java package whyusepolymorphic; public class Hero { private int magicPoint;//魔法值 private int hurt;//伤害 private String name;//姓名 public Hero(int magicPoint, int hurt, String name) { super(); this.magicPoint = magicPoint; this.hurt = hurt; this.name = name; } public int getMagicPoint() { return magicPoint; } public void setMagicPoint(int magicPoint) { this.magicPoint = magicPoint; } //省略属性的 getter 和 setter 方法 } 子类-小乔:whyusepolymorphic.LittleJoe.java package whyusepolymorphic; public class LittleJoe extends Hero { public LittleJoe(int magicPoint, int hurt, String name) { super(magicPoint, hurt, name); } //攻击的方法 public void attack() { System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt() +"。消耗 20的魔法值"); this.setMagicPoint(getMagicPoint()-20);//魔法值-20 } } 子类-妲己:whyusepolymorphic.Daji.java package whyusepolymorphic; public class Daji extends Hero{ public Daji(int magicPoint, int hurt, String name) { super(magicPoint, hurt, name); } public void attack() { System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt() +"。消耗 30的魔法值"); this.setMagicPoint(getMagicPoint()-30);//魔法值-30 } } 玩家:whyusepolymorphic.Player.java package whyusepolymorphic; public class Player { public void play(LittleJoe littleJoe) { littleJoe.attack(); } public void play(Daji daji) { daji.attack(); } } 上面代码完整的实现了要求中的功能,那我们知道英雄不可能就这几个,后期如果添加新的魔法英雄,伤害不一样,怎么办? 我们可以添加新的类,实现攻击的方法,修改玩家类添加操作英雄的方法。这个方式可以完成 Hero 扩展的需求,但是后面有更多的 Hero 添加进来,我们维护起来就不是那么方便了。 研究上面的代码我们发现,Player 类中的 play 方法的参数都是 Hero 类的子类,能否使用一个 play(Hero hero) 方法操作所有的英雄?使用多态就能够实现这种优化设计。 什么是多态 简明扼要,多态就是多种形态。在自然界中碳的多态就有石墨、钻石等,剪这个动作就有剪纸、剪头发等。同一个操作,由于条件的不同,产生的结果也不同。 那么在程序中的多态,就是指同一个引用类型,使用不同的实例而执行不同的操作(父类引用指定子类对象 Hero h=new Daji();)。 如何实现多态 实现多态的步骤: 1.编写具有继承关系的父类和子类 2.子类重写父类方法 3.使用父类的引用指向子类的对象 父类作为方法形参实现多态 使用多态优化上面代码 修改 Hero.java 添加攻击的方法 package whyusepolymorphic; public class Hero { //省略属性和构造方法 //攻击的方法 public void attack() { System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt() +"。消耗 20的魔法值"); this.setMagicPoint(getMagicPoint()-20);//魔法值-20 } //省略 getter 和 setter 方法 } 两个子类不用修改 修改玩家类 Player.java 将 play方法的参数设为父类 package whyusepolymorphic; public class Player { public void play(Hero hero) { hero.attack(); } } 修改测试类 package whyusepolymorphic; public class TestPlay { public static void main(String[] args) { Player p=new Player(); Hero daji=new Daji(100,15,"妲己"); p.play(daji); System.out.println(daji.getName()+" 剩余魔法:"+daji.getMagicPoint()); Hero littleJoe=new LittleJoe(100,10,"小乔"); p.play(littleJoe); System.out.println(littleJoe.getName()+" 剩余魔法:"+littleJoe.getMagicPoint()); } } 父类作为返回值实现多态 玩家购买英雄使用多态实现,购买的方法有返回值,返回购买后的英雄,父类作为返回值实现这个功能。 修改玩家类 Player.java 添加获取英雄的方法 package whyusepolymorphic; public class Player { public void play(Hero hero) { hero.attack(); } public Hero getHero(int id) { if(1==id) { return new Daji(100,15,"妲己"); }else if(2==id){ return new LittleJoe(100,10,"小乔"); }else { System.out.println("没有这个英雄"); return null; } } } 测试类 package whyusepolymorphic; import java.util.Scanner; public class TestPlay { public static void main(String[] args) { Player p=new Player(); System.out.println("欢迎来到英雄商店,请选择要购买的英雄:1.妲己2.小乔"); Scanner input=new Scanner(System.in); int id=input.nextInt(); Hero h=p.getHero(id); if(null!=h) { h.attack(); } } } 父类到子类的转换 如果子类中有一些子类特有的方法,父类引用不能调用子类的特有的方法。 向 Daji.java 中添加一个方法 queenWorship package whyusepolymorphic; public class Daji extends Hero{ //省略构造方法及之前其他方法 public void queenWorship() { System.out.println("释放大招:女王崇拜"); } } 向 LittleJoe.java 中添加一个方法 dazzlingStar package whyusepolymorphic; public class LittleJoe extends Hero { //省略构造方法及之前其他方法 public void dazzlingStar() { System.out.println("释放大招:星华缭乱"); } } 在 Player.java 中添加 bigMove 方法 package whyusepolymorphic; public class Player { //省略构造方法及之前其他方法 public void bigMove(Hero hero) { hero.dazzlingStar(); } } 发现代码 hero.dazzlingStar(); 报错 那么这个时候就需要将父类转换为子类(强制类型转换) Hero joe=new LittleJoe(100,10,"小乔"); Daji daji=(Daji) joe; 但是直接这样写也会报错,用 instanceof 运算符可以保证不会转换错误 语法:对象 instanceof 类或接口 instanceof通常和强制类型转换结合使用 修改 Player.java 中的 bigMove 方法 public void bigMove(Hero hero) { if (hero instanceof Daji) { ((Daji)hero).queenWorship(); }else if(hero instanceof LittleJoe) { ((LittleJoe)hero).dazzlingStar(); } } 在 main 方法中编写测试代码 Player p=new Player(); p.bigMove(new LittleJoe(100,10,"小乔")); p.bigMove(new Daji(100,15,"妲己")); 本人能力和水平有限,欢迎在文章下方给建议 搜索关注公众号「享智同行」,第一时间获取技术干货

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册