前言
面向对象的编程,我们可以认为是面向类的编程。编写类的过程,相当于我们定义了一种新的数据类型。
一、自定义类
一个标准的类包括:成员变量,成员方法,构造函数,每一个成员变量都用private修饰,再为每一个私有化的成员变量编写get…set…方法,且该类需要包含无参构造及有参构造
1、成员变量和局部变量的区别
成员变量即为对象的属性
private String name;//成员变量---属性
public void eat() {
int time = 123;//局部变量
}
- 成员变量定义在类中,整个类中都能访问,和具体的定义位置无关
- 局部变量定义在方法、语句、局部代码块中,只在所属的区域中有效,而且必须是先定义后使用,必须是先赋初值后使用
- 成员变量存在于堆内存的对象中,堆内存中的对象大小可以任意,并允许在运行时进行调整。所以访问查找的效率比较低
- 局部变量存在与栈内存的方法中,可以快速定位,但是大小是限定的
- 成员变量随着对象的创建而存在,随着对象的表示而消失。局部变量随着所属区域的执行而存在,随着所属区域的结束而释放
- 成员变量都有默认初始化值;局部变量没有默认初始化值
2、构造函数
构造函数是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
- 一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载
- 不算成员方法
public class B1 {
//方法名称和类名称一致,包括大小写
//方法没有返回值类型的声明
public B1() {}
public B1(int k) {}
//在一个类中允许方法同名【方法重载】,要求参数不同:类型、个数、顺序【参数类型不同】
public int B1(){}//从语法的角度上说是正确的,同时可以直接调用,不是构造器
}
//构造器方法不能直接调用,只能通过new运算符间接调用,例如new B1()调用无参构造器。。
public class A1 {
public A1() {//构造器中可以有return语句,但是不能return任何值
System.out.println("no argument constructor..");
}
public void A1() { //因为有返回值类型声明,所以不是构造器,是普通的成员方法
System.out.println("no argument method...");
}
}
//调用
A1 aa=new A1();//调用无参构造
aa.A1();//调用A1方法
构造函数特点
- 函数名与类名相同,包括大小写
- 不用定义返回值类型,没有具体的返回值,但不用写void
- 一个类可以有多个不同的构造器,但是参数一定不能相同
- 构造器不能直接调用,总是和new运算符一起被调用
在构造函数前面加上返回值就只是一般函数了,不是构造器
构造函数作用
给对象进行初始化
public class Student{
private String name;
private int age;
//出现了2个同名的name变量,一个成员变量,一个局部变量。可以使用this进行区分,this.name标识成
员变量,直接使用name表示局部变量。
public Student(String name,int age){
this.name=name;
this.age=age;
System.out.println(name);//按照就近原则,这个name用于指代局部变量
}
}
//调用
Student s1=new Student("xiaozeng",18); //如果类中定义了多个构造器,具体执行哪个构造器,是按照
参数类型进行最佳匹配
----
public class A1 {
public A1() {
System.out.println("no argument");
}
public A1(String a1) {
System.out.println("String");
}
public A1(String a1,short b1) {
System.out.println("string short");
}
public A1(String a1,int b1) {
System.out.println("string int");
}
public static void main(String[] args) {
A1 aa=new A1("123",(short)12);
}
}
使用下列语法可创建对象: new 构造函数();
- 当使用new运算符时自动进行调用,但是构造方法不能直接调用
- 关键字 new 通常称为创建运算符,用于分配对象内存,并将该内存初始化为缺省值
- 成员变量有默认值,局部变量如果不赋值则没有默认值
- 简单类型中的数值类型默认为0,char类型默认’\0’,boolean类型默认false
- 引用类型默认null
- 一旦 new 完成分配和初始化内存,它就将调用构造函数来执行对象初始化
当定义Java类时没有定义构造器,则Java自动为类自动提供无参构造器, 将成员变量的值初始化为缺省值
一旦创建了自己的构造函数,缺省的构造函数将不复存在
一般函数和构造函数什么区别
构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化
一般函数:对象创建后,需要函数功能时才调用
构造函数:对象创建时,会调用并且只调用一次
一般函数:对象创建后,可以被调用多次
二、封装
封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装的好处
- 良好的封装能够减少耦合
- 类内部的结构可以自由修改
- 可以对成员进行更精确的控制
- 隐藏信息,实现细节
类定义规则:要求类内高内聚,类间弱耦合
封装可以使容易地修改类的内部实现,而无需修改使用了该类的客户
抽象
良好的抽象策略可以控制问题的复杂程度,增强系统的通用性和可扩展性抽象主要包括过程抽象和数据抽象
- 过程抽象是将问题域中具有明确功能定义的操作抽取出来,并将其作为一个实体看待
- 数据抽象是较过程抽象更高级别的抽象方式,将描述客体的属性和行为绑定在一起,实现统一的抽象,从而达到对现实世界客体的真正模拟
范围限定词
private 私有的
protected 受保护的
默认(就是没有限定词、package限制不能写成default)
public 公共的
外部的独立类上可以使用的范围限定词有public和默认两种;内部类可以使用4大范围限定词中的任意一个。
- 在一个.java文件中可以定义无数个class,但是只能定义一个public class,而且要求文件名称和public class类名称必须一致,包括大小都必须一致
- public类可以在任意包中进行引用,没有范围限定词的class则只能在同包中访问如果类位于默认包中,则只能同包访问,其它位置不能访问【不管是public class或者默认 class】
属性上的范围限定词
- public 表示到处可见
- protected表示同包或者子类中可见
- 默认表示同包可见
- private当前类内可见
方法上的范围限定词同属性上的范围限定词一致
如下图:
封装特点
隔离变量。一般建议对于属性采用:私有属性,共有的get/set方法的形式进行定义
public class B1 {
//私有属性
private String name;
private int age;
//共有的get/set方法,get方法称为读取器,set方法称为设置器
public int getAge() {//如果手写方法请注意命名规则
return age;
}
public void setAge(int age) {//可以添加验证逻辑
if(age>0 && age<18)
this.age = age;
else this.age=0;
}
public void setName(String name) {
this.name = name;
}
}
- 不是所有的属性都有get/set方法,取决于是否允许读写;允许读则只有get,没有set;如果只允许写,则只有set,没有get
- 针对boolean类型,不是Boolean类型的特殊命名规则
public class B1 {
//私有属性
private boolean sex;
//共有的get/set方法,get方法称为读取器,set方法称为设置器
public boolean isSex() { //注意get方法的命名,如果需要生成get方法可以使用Boolean来声
明
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
}
package和import
在Java中为了方便开发,会将多个功能相似的类放在一个组内,而这个组就是包,包就像一个目录结构
package将一些类组合在一起,起到名空间的作用,在一定程度上可以避免出现类名冲突的问题.
- 包和文件夹路径没有关系,但是实际上可以看到一些对应的效果
包名称一般采用域名反转的方式进行定义lanou.com为com.lanou,包名称采用全小写
在Java中调用其它包中的公共类时,必须告知具体类的位置。使用类名称有两种写法:全名和简名
- 全名写法: java.util.Date now=new java.util.Date();
- 简名写法
import java.util.Date;
public class B1 {
public Date now=new Date();
}
同包的类不要import语句
- 默认包中的类只能在默认包中进行调用,其它包中不能访问默认包中的类。默认包中的类可以访问命名包中的类
- Java虚拟机在运行时,系统会自动导入java.lang包,只要程序用到这个包的类时,不需要导入,要使用其它包时,
都必须手工导入。例输出使用的System.out.println的System类实际上全名为java.lang.System - 类路径CLASSPATH就是让系统找到需要导入的类
三、UML
统一建模语言(UniedModeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML使用面向对象设计的的建模工具,但独立于任何具体程序设计语言
例如:
+表示public -表示private #表示protected ~表示默认也就是包权限 _下划线表示static- 斜体表示抽象