面向对象01
软件设计
原则:
可重用性,可拓展性,可维护性
面向对象的最小单位是类。
面向对象四大特征:封装,继承,多态,抽象
类和对象
特征:封装,继承,多态,抽象
关系:类是多个对象抽象出来的共性
对象是类的实例,类是对象的模板
类的定义
在面先过程中,专门为描述对象定义一个类,不需要main。
另外再创建测试类
内存分析
不同类型的成员变量的初始值就是各个类型的默认值。
对象的创建实质上类似于栈中有个指针,指向了堆空间中创建的一组数据。
对象打印和比较-生命周期-匿名对象
打印对象:对象名@hashcode.(哈希表中的值)
比较:对象直接 == 比较的是地址值
生命周期:new关键字在heap中开辟新空间创建,当堆中对象未被任何变量引用,且被GC回收时结束。
匿名对象:没有名称的对象,new Object();匿名对象在堆中开辟一块没有名称的对象,只能使用一次。
构造器
编译器在编译源文件时会默认创建一个缺省构造器,即默认的一个构造器。所以类中一定会有构造器
作用:1)构建对象,但是必须和new一起使用。2)完成对象初始化
特点:构造器名称和当前类的名称相同;禁止使用返回类型,返回类型默认当前类的类型;不需要return;构造器返回值是当前类的地址
new xxx();其实是调用类中的构造器创建对象。
编译器创建的默认构造器特点:
1)符合构造器特点。
2)无参
3)无方法体
4)类A使用了public修饰,则构造器有public,无则构造器也无。
如果我们自定义了构造器,则编译器不创建缺省构造器**。**
某一个类至少在编译后有一个构造器
构造器是特殊方法,也可重载
static修饰符和特点
类中有些属性不是属于某一个具体对象的,而是属于整个事物的特征,比如说全世界人的总数
状态和行为有对象和类型之分
某些状态和行为属于对象,不同的对象,其状态行为不同
某些属于类型,不属于对象
表示属于类本身的类型要用static
static修饰符表示静态的,可修饰字段,方法,内部类,其修饰的成员属于类。static修饰的只属于类级别的
static修饰符特点:
- static修饰的成员,随着所在类加载而加载;即当JVM把字节码加载的时候,static修饰成员以及在内存中存在
- 优先于对象的存在。对象是通过new关键字创建的
- static修饰的成员被该类型所有对象共享;根据该类创建出来的任何对象都可访问static成员
- 表面上通过对象访问static成员,本质上依然是使用类名访问。和对象无关
- static修饰的成员直接属于类,可以使用类名访问static成员
static在JVM中的存储
类中static修饰的存储在方法区
类中static成员,通过反编译本质上是类名访问。所以在访问static的时候一定要类名访问
类成员和实例成员的访问
类中的成员:字段,方法,内部类
类成员:直接属于类,使用static修饰的成员
实例成员:只属于对象,没有使用static修饰的成员
在static方法中只能调用static成员
static使用情况:
如果这些行为或者状态属于这个类,就用static,被所以实例化后的对象所共享。
在开发中,往往把工具方法使用static修饰(只需要一份)
如果不使用static就必须创建对象才能调用
变量的分类
成员变量:可以使用后定义
局部变量:必须先定义后使用(其实本质还是先定义在使用)
在类实例化,创建类等情况下,成员变量已经创建
开发中尽量缩小变量的作用范围,性能高
不要动不动就是用成员变量,因为存在着线程的不安全问题,能使用局部变量尽量使用局部变量
包
为了将java文件放到特殊文件夹分类。关键字package,专门用来给java文件设置包名
语法格式:package 包名.子包.子子包 (第一行代码)
此时的编译命令:javac -d . 文件名
如果在java文件中使用了package,则表示在当前目录中生成包名,再在包中生成字节码.
运行命令:java 包名.类名
包名定义:自定义包名,不能以java.开头
包名必须遵循标识符规范/全部小写
企业开发中,包名使用公司域名倒写 (520it.com—> com._520it)
但是在Android中包名使用 _ 则不能部署倒模拟器上,所以用字母代替
格式:package 域名倒写.模块名.组件名;
类的名称:
类的简单名称:定义类的名称. PackageDemo
类的全限定名称:包名.类名; com._520it.hello.PackageDemo.
在开发中,都是现有package而后在package中再定义类
java(JDK)中的包
包的引用import
如果A类和B类不在同一包中,A需要B,则需要在A中引入B类。
未使用import之前,操作不在同一包中的类,需要使用全限定名操作。
格式:import 需要导入类的全限定名;
java默认会自动找java.lang的包(System,String)
使用通配符的语法格式(包中所有类都导入)
格式:import 包名.子包名.*; 表示会引入该包下所有在当前文件使用到的类( * 表示类名)
静态导入(static import) 不推荐
将别的包中的类中的成员直接导入进来
语法:import static 类的全限定名.该类中的static成员名
静态导入就是语法糖,在实际开发中不实用静态导入,会分不清某一个方法或字段来源于哪个类