面向对象

来源:互联网 发布:linux c 调用so动态库 编辑:程序博客网 时间:2024/05/01 17:54

面向过程/面向对象

我要开车去新疆


对象是类的实例。

静态属性→成员变量(属性)

动态属性→方法


类和类(设计模式基础)

关联关系        一个类的方法里的参数是另一个类的对象

继承关系        A是一种B(C++多重继承 同名成员变量处理起来相当麻烦,java单继承)

聚合关系        一个整体和一个部分的关系,A是B的一部分(聚集关系:松;组合关系:紧)

实现关系        (讲接口之后再说)谁是谁的实现类                


面向对象的思维

1.这个问题能抽象出哪些类

2.类和对象应该有什么属性和方法

3.类和类应该有什么关系


对象内存分析

成员变量不赋值可用默认值,局部变量不赋值会报错。


引用

基础类型占用一块内存;引用类型占用两块内存,一个存地址值一个存对象(new出来的东西 在heap(堆)  里)

方法只有一份,不调用不占用内存,只有调用的时候才分配内存,调用完之后所有的局部变量的内存空间消失。

调用时,基本类型传递的是值本身,引用类型传递的是对对象的引用,不是对象本身


构造函数

名字和类名一致,不能有返回值。和new一起用。

当没写构造方法编译器为你默认一个空的,当写了编译器就不在为你默认了。


方法重载

同一个类中方法对方法的重载。

同名方法,参数列表必须不同。

PS char short byte 类型一样可以和int重载。


this 当前对象的引用;调用哪个对象的方法就指向这个对象;在方法调用之前指向的是谁并不知道;可以用来处理成员变量和参数同名的情况。

当无法确定是哪个声明处的参数时采用就近原则。.

分析内存


static 

被static声明的成员变量为静态成员变量 是这个类的公用变量 第一次使用时被初始化,每个类只有一份。在data区里。

任何对象都可以访问这个静态成员变量;即便没有对象也可以用类名.它来访问。

非静态的方法必须有对象才能调用,静态方法可以供所有这个类的对象使用。

静态方法  不用创建对象就可以调用的方法,不能使用非静态成员。

分析内存


package import  

为了解决类名冲突的问题

1.class要在正确的包路径下

2.要写全包名+类名  import之后只写类名。

3.class最上层包的父目录必须在classpath下

4.非裸体类在执行的时候也需要写全包名。

略  jar -cvf xx.jar *.*


类的继承

子类自动拥有父类的所有成员(成员变量、方法)

在内存中子类实例相当于包含一个父类实例。

testPerson.java分析内存  


权限修饰符    类内部       同一个包     子类    任何地方

private      

default

protected

public

对于类 只能用public 和 default 修饰

父类中private的子类只有所有权没有使用权。


重写

子类对父类同名方法的改写,

方法名 列表 返回值类型必须相同

不能有比父类更严格的权限。


super  是父类的引用。子类父类同名成员变量的时候,需要用super.去访问父类的属性。


继承中的构造方法   

构造子类对象 首先构造父类对象

可以用super+参数列表调用父类构造方法(必须写在第一行) 也可用this+参数列表调用自己的构造方法。

如果子类没有显示的父类构造方法,系统自动调用父类无参的构造方法。(这时候假如父类没有无参构造方法 就会报错)


Object

toString() String对象和其他类型对象连接时自动调用该对象的toString方法。默认情况@前是类名,@后是16进制哈希编码。练习:重写一个toString方法。

hashcode 独一无二的代表一个对象,并且可以通过哈希码找到对象本身。

equals()  默认与“==”一致。String已经重写了 equals方法。练习:重写一个equals方法。


对象转型

父类的引用类型变量可以指向子类的对象。要求传一个动物,可以传一只狗。

父类的引用不可以访问子类对象新增加的属性和方法。这只狗不能当狗,只能当动物。只能看到父类的那一部分。

如果一定要访问子类成员,需要强制转换成子类。

用 instanceof 检查对象是不是属于该类或者其子类。cat instanceof Animal

子类当做父类引用叫向上转型;否则叫向下转型。



多态(动态绑定)

在执行期间判断引用对象的实际类型,并调用相应方法。

1.要有继承。2.要有重写。3.父类引用指向子类对象。

练习:修改上面的程序增加Lady类


对象转型还需要手动判断类型,然后强转之后才能使用子类自己的成员,但是多态因为有了重写,对于方法他可以动态的判断传入的类型调入改类型重写过的方法


抽象类

单继承

用abstract来修饰一个类时这个类叫抽象类,不能被实例化,但是可以有构造函数

用abstract修饰一个方法时这个方法叫抽象方法,不能有方法体。

抽象类可以没有抽象方法,也可以和正常方法共存。

含有抽象方法的类必须是抽象类,如果被继承;抽象方法必须被重写。

抽象类也可以有抽象的子类,该子类可以实现父类的抽象方法也可也不实现。

练习:修改上面的程序


final

final值不能被改变,方法不能被重写,类不能被继承。


接口

多重实现。

接口不能被实例化。

接口中所有方法都不能有方法体。可以没有任何方法。

实现接口的类必须实现接口的所有方法。

所有的方法都是public的抽象方法,属性都是public static final的。(因为static是属于类的不属于任何一个对象,所以不会出现C++多继承的混乱。)

接口可以继承其他接口,并添加新的属性和抽象方法。

接口和实现类存在多态性。每一个接口暴露对象实现当前接口的那一部分方法。

 ------------------------------------- 

练习1:Point类提供计算点对点距离平方的方法,修改坐标的方法。(内存解析)xyz

练习2:short  int 重载。

练习3:Person(name location)类 Teacher(level) Student(school), 重写Person的 Info方法。要求俩构造函数

练习4:Animal(name) Dog(furcolor) Cat(eyescolor)  f()之间的对象转型。1,验证不能访问子类成员,2验证可以强转成子类

练习5:多态:Animal Dog Cat ;Lady的宠物叫了。

练习6:animal修改成抽象类,再执行

练习7:Singer(sing sleep) Painter(paint eat) Student(study) Teacher(teach) 并内存分析。

------------------------------------

protected 

abstract 

instanceof 

increament

painter 

Circle

radius 

capital

professor

location

enjoy

原创粉丝点击