面向过程/面向对象
我要开车去新疆
对象是类的实例。
静态属性→成员变量(属性)
动态属性→方法
类和类(设计模式基础)
关联关系 一个类的方法里的参数是另一个类的对象
继承关系 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