为什么使用面向对象?
1.1现实世界就是“面向对象的”。任何存在的事物都可以看作“对象”。
面向对象技术利用“面向对象的思想”去描述“面向对象的世界”,使客户客户和软件设计开发人员之间、软件设计开发人员内部交流更滑顺畅,
同时有代码重用性高、可靠性高等优点,大大提高了软件设计和开发效率
面向对象设计的过程就是抽象的过程,分以下三步来完成:
第一步:发现类
第二步:发现类的属性
第三步:发现类的方法
1.2 常量:用来存储不变的数据,常量在程序运行过程中不会发生变化,只能被引用,不能被重新赋值,也就是只能在定义时修改其值。
常量名一般都大写。
如:public static final String SEX_MALE="雌性";
1.3 类名、属性名、方法及常量名的命名规范如下:
类名由一个或几个单词组成,每个单词的第一个字母大写,如Mouse
属性名和方法名由一个或几个单词组成,第一个单词首字母小写,其他单词首字母大写,如helth、stuName、println()、getMessage()
常量名由一个或几个单词组成,所有字母大写,如PI、SEX MALE
1.4构造方法(Constructor)
构造函数是面向对象编程思想所需求的,它的主要作用有以下两个:
1) 创建对象。任何一个对象创建时,都需要初始化才能使用,所以任何类想要创建实例对象就必须具有构造函数。
2) 对象初始化。构造函数可以对对象进行初始化,并且是给与之格式(参数列表)相符合的对象初始化,是具有一定针对性的初始化函数。
在这里要说明一点,如果在类中我们不声明构造函数,JVM会帮我们默认生成一个空参数的构造函数;如果在类中我们声明了带参数列表的构造函数,JVM就不会帮我们默认生成一个空参数的构造函数,我们想要使用空参数的构造函数就必须自己去显式的声明一个空参的构造函数。
有参和无参的区别
public class student{
private String name;
private String sex;
private int age;
public Student(){}
public Student(String name,String sex,int age){
this.name= name;
this.sex= sex;
this.age= age;
}
}
当你要实例一个student对象
Student s=new Student();
s.setName("小明");
s.setSex("男");
s.setAge(20);
Student s=new Student("小明",男",20);
有参的因为你必须以他的参数列表传值,所以你在实例化有参构造函数的时候必须就已经给他赋值,而无参的就不需要
就相当于有参的可以省略set那一步(针对参数列表中相同的参数,参数列表中没有的还是要set)
1.5 方法重载
public static void main(String[] arg){
//无参的构造方法
Mouse mouse=new Mouse();
mouse.print();
//两个参数构造方法
mouse=new Mouse("舒克",10);
mouse.print();
//四个参数的构造方法
mouse=new Mouse(贝塔",10,20,"雌鼠");
mouse.print();
}
在示例中3个构造方法,方法名相同、参数列表不同,这称为构造方法的重载。
可以通过构造方法的重载来实现多种化行为,在创建对象时可以根据需要选择合适的构造方法。
如果将示例中的无参构造方法注释掉,在mouse=new Mouse();这行会报错,错误信息为“The constructor Mouse() is undefined()”意思是构造方法Mouse未定义。
为什么会出现这个错误呢?
因为java同C#一样,在没有给类提供任何构造方法时,系统会提供一个无参的构造方法体为空的默认构造方法。一旦提供了自定义构造方法,系统将不再提供这个默认构造方法,如果要使用,则需要程序员手动添加。
如果同一个类中包含两个或两个以上的方法,方法名相同,方法参数个数或参数类型不同,则称该方法被重载,这个过程就是方法重载。成员方法和构造方法都可以进行重载。
(1)方法重载的判断依据如下:
必须在同一个类里。
方法名相同。
参数列表(方法参数的个数或参数类型)不同。
与方法返回值和方法修饰符没有任何关系。
(2)在使用this调用自身的其他构造方法时,只能作为第一条语句。
static修饰符
static可以用来修饰属性、方法和代码块。
static修饰的变量属于这个类所有,即由这个类创建的所有对象共用同一个static变量。通常把static修饰的属性和方法称为类属性(类变量)、类方法。
不使用static修饰的属性和方法属于单个对象,通常称为实例属性(实例变量)、实例方法。
(1)在加载类的过程中,完成静态变量的内存分配,再执行静态块,两者是在创建对象之前执行的。
(2)雷属性、类方法可以通过类名和对象名访问,实例属性、实例方法只能通过对象名访问。
(3)类方法只能访问类属性和其他类方法。
静态方法中不能使用this和super关键字。
为了方便调用,可以用static来修饰,并且建议采用此种方式。
例如:static final String SEX_MAIX="雄鼠";
在使用时可以直接通过类名.SEX_MAIE方式使用。这时称这个常量为静态常量。
在方法里不可以定义static变量,也就是说,类变量不能是局部变量。
构造方法没有返回值类型。如果有,则不是构造方法,而是和构造方法同名的成员方法。
封装是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的具体步骤:
修改属性的可见性来限制对属性的访问,为每个属性创建一对赋值(setter)方法及值(getter)方法,用于对这些属性的存取,在赋值方法中,加入对属性的存取控制语句。
封装的好处:隐藏类的实现细节;让使用者只能通过程序规定的方法来访问数据,可以方便其他人存取控制语句,限制不合理操作。
封装时会用到多个权限控制符,来修饰成员变量和方法,区别如下:
private :成员变量和方法只能在其定义的类中被访问,具有类可见性。
默认:成员变量和方法只能被同一个包里的类访问,具有可见性。
protected:可以被同一个包中的类访问,被同一个项目中不同包中的子类访问。
public:可以被同一个项目中所有类访问,具有项目可见性,这是最大的访问权限。
this关键字:this关键字是对一个对象的默认引用。在每个实例方法内部,都有一个this引用变量,指向调用这个方法的对象。
this在对象内部指代自身的引用,所以this只能调用实例变量、实例方法和构造方法。
this不能调用类变量和类方法,也不能调用局部变量。