重写是多态的前提,其允许父类引用指向子类对象(引用类型为父类,指向的实际对象类型为子类)。Car mycar = new Trunk("Benz");但不允许子类引用指向父类对象。 在运行状态中对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。 反射机制运用类的相关信息保存在以下类中,通过特定方法获取其对象能够知道这个类的信息。 **************************/ // 第一种方式 返回对象的类 【已有对象,获取类无意义】 Student stu = new Student(); obj, "X-man"); // 为对象的公有属性赋值 m.invoke(obj, "X-man"); // 调用对象的公有方法 }Copy
python 面向对象2 概述 会有人懂你的奇奇怪怪,看到你的可可爱爱 继承 继承:继承用来表明一个类将从其父类那里获得大多数或所有特性。
__init__(self) Gun1.shoot(self) def shoot2(self): # 同上 Gun2. __init__(self) Gun2.shoot(self) wuzi = Wuzi() wuzi.shoot() wuzi.shoot1() wuzi.shoot2() 此时输出为bang3 print('bang2') class Wuzi(Gun1,Gun2): def shoot(self): # 注意这里要先初始化自己,这样可以避免调用父类方法后再调用自己的方法时,还是父类的方法输出 __init__(self) Gun1.shoot(self) def shoot2(self): # 同上 Gun2. () wuzi.shoot2() 像XiaoWuzi这种继承了Wuzi(又继承自两个父类)这样的形式称为多层继承,它照样可以用最高父类(Gun1、Gun2)的方法
3], (list, tuple)) True >>> isinstance((1, 2, 3), (list, tuple)) True dir()函数 如果要获得一个对象的所有属性和方法,可以使用 print(n) ... 1 1 2 3 5 ... 46368 75025 __getitem__ 通过重写__iter__()方法,可以是对象变成一个可迭代的对象,但是如果想要像列表这样通过下标来获取元素 3, 5] >>> f[:10] [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 但是没有对step参数作处理: >>> f[:10:2] [1, 1, 2, 3, 5, 8, 可以通过callable()函数,去判断一个对象是否是“可调用”对象。 metaclass是Python面向对象里最难理解,也是最难使用的魔术代码。
两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有确定位置的矩形类PlainRect,其确定位置用 startX+width)&&y<startY&&y>=(startY-height) (3)编写PlainRect类的测试程序 创建一个左上角坐标为(10,10),长为20,宽为10的矩形对象 height = 10; } public double area() { return width*height; } public double perimeter() { return 2*
java.Awt: Abstract Window ToolKit (抽象窗口 工具包),需要调用本地系统方法实现功能。属 重量级控件。 javax.Swing:在AWT的基础上,建立的一套图 形界面系统,其中提供了更多的组件,而且完全 由Java实现。增强了移植性,属轻量级控件。
集合框架2 ##set set:无序,不可以重复元素。 hashset:数据结构是哈希表,线程非同步的,保证元素唯一性的原理,判断元素的hashCode值是否相同。 保证元素唯一性的依据:compareTo return 0 往TreeSet集合中存储自定义对象学生。想按照学生的年龄进行排序。 记住:排序时,当主要条件相同时,一定判断一下次要条件。 这时需要让容器自身具备比较性,定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。 当两种排序都存在时,以比较器为主。 泛型格式:通过<>来定义要操作的引用数据类型 在使用java提供的对象时,什么时候写泛型? 通常在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用来接收类型的。 泛型方法 泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象没明确要操作的具体类型后,所有要操作的类型就已经固定了。
##2解决安全问题 3等待唤醒机制 wait notify notifyAll 都使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,以为只有同步才具有锁。 而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object类中。
.存储 StringBuffer append():将指定的数据作为参数添加到到已有数据的结尾处 StringBuffer insert(index,数据):可以将数据 插入到数据指定index位置 2. 删除 String 3.获取 4.修改 StringBuilder java升级的三个因素: 1.提高效率 2.简化书写 3.安全性 基本数据类型对象包装类 byte Byte short short int Integer long Long boolean Boolean float Float double Double char Character 基本数据类型对象包装类的最常见作用:
面向对象(3) (继承,final,抽象类,接口) 1.继承(概述) 继承: 1.提高了代码的复用性 2.继承让类与类之间有了关系,有了关系才有了多态的特性。 那么这个体系已经可以基本使用了 那么在具体调用时,要创建最子类的对象。 因为:1.可能父类不能创建对象 2.创建子类可以使用更多的功能,包括基本的也包括特有的 简单的说,就是查阅父类,创建子类 2.聚集关系 聚集:has a 聚合: 组合: 子父类出现后,类成员的特点 类成员 : 1.变量 2.函数 3.构造函数 3.1.子父类中的变量的特点 如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this super代表的是父类对象的引用 3.2.子父类中的函数的特点 覆盖: 1.子类覆盖父类,必须保证子类权限大于父类权限,否则编译失败 2.静态只能覆盖静态。 3.3.子父类中构造函数的特点–子类的实例化过程 重载:只看重名函数的参数列表。
Map子类对象的特点 Map共性方法 Map-keySet map集合的两种取出方式: keySet:将map中所有的键存入到set集合。因为set具备迭代器。
y2; Sum(double n1, double m1, double n2, double m2) { x1 = n1; x2 = n2; y1 = m1; y2 = m2; } double getAns() { double ans = 0; ans = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); ans y2; char str; Sum(int n1, int m1, int n2, int m2, char op) { x1 = n1; x2 = n2; y1 = m1; y2 (x1 + " " + y1 + " " + x2 + " " + y2 + " " + op); p = new Sum(x1, y1, x2, y2, op); p.getAns(); } int getAns() { int ans,ans1,ans2; ans1 = getAns1(); ans2 = getAns2(); ans = max(ans1,ans2
面向对象编程(二) 封装(private) 匿名对象使用的方式:只调用一次 注意,封装只是私有的一种表现形式。不私有也能封装。 构造函数 构造函数和一般函数在写法上有不同 构造函数在对象一建立就运行, 而一般方法是在对象调用的时候才运行,是给对象添加对象具备的功能。 一个对象建立,构造方法运行 构造代码块 作用:给对象初始化,对象一建立就运行,而且优先于构造函数执行。 和构造函数的区别: 构造代码块是给所有的对象初始化,构造函数是给特定的对象初始化。 构造代码块 中定义的是不同对象共性的特性. this代表它所在函数所在对象的引用 简单说:哪个对象在调用this所在的函数,this就代表哪个对象 this关键字在构造函数间的调用 this语句:用于构造函数间互相调用 this语句只能放在构造函数的第一行
object): def __init__(self): self.length = 100 def shoot(self): print('bang1') class Gun2( object): def __init__(self): self.length = 200 def shoot(self): print('bang2') class Wuzi object): def __init__(self): self.length = 100 def shoot(self): print('bang1') class Gun2( object): def __init__(self): self.length = 200 def shoot(self): print('bang2') class Wuzi (Gun1,Gun2): def shoot(self): print('bang3') wuzi = Wuzi() wuzi.shoot() 此时输出为bang3
IO流 File类 用来将文件或文件夹封装成对象。 方便对文件与文件夹的属性信息进行操作。 File对象可以作为参数传递给 File类的常见方法 1.创建 boolean createNewFile() boolean mkdir() boolean mkdirs() 2.删除 boolean 记住在判断文件对象是否是文件或者目录时,必须要先判断该文件对象封装的内容是否存在,通过exists判断。 2.要注意递归的次数,尽量避免内存溢出。 删除一个带内容的目录 删除原理: 在Windows中,删除目录从里面往外删除的。既然是从里往外删除,就需要用到递归。 file对象。File 字符串路径 字节输出流 字符打印流 PrintWrite file对象。File 字符串路径 字节输出流 合并流和切割文件
所以在创建缓冲区之前,必须要先有流对象。 为了 提高字符写入流效率,加入了缓冲技术,只要将需要提高效率的流对象作为参数传递给缓冲区的构造函数即可。 记住只要用到缓冲区,就要记得刷新。 将字符读取流对象作为参数传进缓冲对象的构造函数。 readLine方法返回的时候只返回回车符之前的数据内容,并不返回回车符。 装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。 装饰和继承的区别 装饰模式比继承要灵活,避免了继承体系臃肿。而且降低了类与类之间的关系。 2.用字节写入流对象创建一个图片文件,用于存储获取到的图片数据。 通过循环读写,完成数据的存储。 关闭资源读取转换流 写入转换流 流操作的基本规律 最痛苦的就是流对象有很多,不知道该用哪一个。 OutputStream Writer 2.操作的数据是否是纯文本。 是:字符流。 否:字节流。 3.当体系明确后,再明确要使用哪个具体的对象。
#其他对象 System 可不可以在jvm启动时,动态加载一些属性信息。 ##Runtime对象 该类并没有提供构造函数。 说明不可以new 对象,那么会直接想到该类中的方法都是静态的,发现该类中海油非静态方法。 说明该类肯定会提供了方法获取本类对象,而且该方法是静态的,并返回值类型是本类类型。
将问题进行对象的封装 异常体系:Throwable |–Eroor |–Exception |–RuntimeException 异常体系的特点:在异常体系中的所有类以及建立的对象都具备可抛性。 throw和throws的用法: throw:定义在函数内,用于抛出异常对象 throws:定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开 当函数内有throw抛出异常对象,并未进行try处理。 finally不被执行 自定义异常: 定义类继承Exception或者RuntimeException 为了让该自定义类具备可抛性 让该类具备异常操作的共性方法 ---- 自定义异常好处:按照java面向对象的思想
匿名内部类的格式:new 父类或者接口(){定义子类的内容} 其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖。 并封装成对象。其实就是java对不正常情况进行描述后的对象体现 对于问题的划分:两种:一种是严重的问题,一种是不严重的问题 对于严重的,java通过Error类进行描述。 (可以使用针对性的处理方式进行处理 ) 异常try-catch 异常的处理:java提供了特有的语句进行处理 对捕获到的异常对象进行常见的方法操作。 自定义异常 项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题可以按照java对问题封装的思想。将特有的问题。进行自定义的异常封装。 原因是: 异常体系有一个特点:因为异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中的独有特点。只有这个体系中的类和对象才可以被throw和throws操作。