什么是面向对象?
面向对象就是使用对象进行程序设计,简写
成OOP(Object Oriented Programming)。
面向对象的三大原则
- 封装、继承、多态
封装
- 对象同时具有属性和方法两项特性
- 对象的属性和方法通常被封装在一起,共同体现事物的特性, 二者相辅相承,不能分割
从对象抽象出“类”
把相同的或相似的对象归为一类的这个过程就是抽象,所以,抽象就是分析问题的方法;
抽象的基本原则:
- 只关心主要问题,而不关心次要问题;
- 只关心主要矛盾,而不关心次要矛盾;
- 只关心相同的东西,而不关心不同的东西;
- 只关心问题是什么,能够完成什么,而不关心怎样去完成。
- 抽象的过程其实就是面向对象编程的核心思想。
面向对象(OO)的优点
便于程序模拟现实世界中的实体
- 用“类”表示实体的特征和行为
隐藏细节
- 对象的行为和属性被封装在类中,外界通过调用类的方法来获得,不需关注内部细节如何实现
可重用
- 可以通过类的模板,创建多个类的对象
Java 方法定义
利用访问权限,加强对Java的安全性
为了避免从类外部直接访问类成员而造成的数据损坏,Java对类成员的访问制定了约束;
- 关键字public和private是访问修饰符,用来说明某个成员是否可以从类外部进行访问;
- public修饰的成员可以在任何地方进行访问,不受任何约束;
- private修饰的成员只能够被本类中的其它成员访问,而不能从类的外部进行访问。
修饰符 + 返回值类型 + 方法名 (参数类型1 参数1……)
public:访问控制符,控制该方法的访问范围
返回值类型:当前方法如果有返回值得话,需要添加对应的返回值类型
- void 系统默认无参,所以是没有返回值的,没有return语句
方法名:自己定义的(顾名思义)名字
参数列表:从外部接收用户输入()中的参数
加上访问修饰符有时候可能会给操作数据带来不便,但可以在很大程度上保证数据的安全
- 一般地,我们会将成员属性声明为private,而将成员方法声明为public,但这样做并不是绝对的
- 有时候,类外部可能要操作到某些私有数据成员,那么就可以增加一个公有的方法,再由这个方法来操作私有数据,避免因类外部的误操作而造成的数据损坏
因为main方法要由类外部的虚拟机来调用,所以main方法必须声明成public
class Student { //定义学生类 private String name; //姓名,私有 private int age; //年龄,私有 private float weight; //体重,私有 public void setName(String n) { //为姓名赋值的方法,公有 name = n; } public void setAge(int a) { //为年龄赋值的方法,公有 age = a; } public void setWeight(float w) { //为体重赋值的方法,公有 weight = w; } public void display() { //将所有信息打印出来的方法,公有 System.out.println("姓名:" + name + ",年龄:" + age + ",体重:" + weight); } public void dining() {……} //吃饭的方法,公有,代码略 public void walk() {……} //走路的方法,公有,代码略 } public class Test { public static void main(String[] args) { Student std = new Student(); //实例化学生类对象 std.setName("张三"); //为姓名赋值 std.setAge(18); //为年龄赋值 std.setWeight(55); //为体重赋值 std.dining(); //调用吃饭的方法 std.display(); //将信息打印出来 } }
this关键字
既然所有的对象都共用相同的成员方法,那么在不同的对象都调用同一方法时,它是怎么确定要使用哪个对象的数据成员呢?
- 每个成员方法都有一个隐含的this引用,它总是指向调用它的对象;
- 关键字this给出用于调用成员方法的对象的地址;
- 每当调用成员方法时,编译器会向this分配调用该方法的对象的地址;
- 可以像使用任何引用那样使用this。
构造方法
在上例中,只能逐个地为数据成员赋值,如果想在对象实例化的同时就初始化成员属性,就使用到了构造方法;
- 构造方法是特殊的成员方法,它与类同名,在对象实例化时由虚拟机自动调用;
- 请注意:构造方法没有返回值类型,也不能有返回值。
正是由于在实例化对象的同时会自动调用构造方法,所以构造方法一般用来给数据成员分配资源或初始化数据成员;
构造方法的一般形式:访问控制符 类名(形参列表) { 方法体 }
因为是由虚拟机来调用构造方法,所以构造方法一般应定义成public。
示例:
package com.hz.test;
import java.util.Arrays;
/**
* @author ztw
*
*/
public class Student {
private String name;
private int age;
private String[] courses;
private String interest;
public Student() {
super();
}
public Student(String name,int age,String[] courses,String interest) {
this.name = name;
this.age = age;
this.courses = courses;
this.interest = interest;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
if(age<0){
System.out.println("年龄不能为负值");
}else{
this.age = age;
}
}
public int getAge(){
return age;
}
public void setCourses(String[] courses){
this.courses = courses;
}
public String getCourses(){
return Arrays.toString(courses);
}
public void setInterest(String interest){
this.interest = interest;
}
public String getInterest(){
return interest;
}
public String toString() {
return "姓名=" + getName() + ", 年龄=" + getAge() + ", 课程=" + getCourses()
+ ", 兴趣=" + getInterest();
}
}
public static void main(String[] args) {
String arr[] = {"阿斯达","是的","大概","太诱惑"};
Student stu = new Student("张三",21,arr,"打球");
Teacher tea = new Teacher("王五","阿斯达","阿斯达",99);
System.out.println(stu);
System.out.println(tea);
}
}
- 每个对象在生成时都必须执行构造方法,而且只能执行一次;
- 如果构造方法调用失败,那么对象也无法创建;
- 不可以显式地直接调用构造方法;
- 在没有定义构造方法的情况下,类会自动产生一个无参数的默认构造方法,这个- - 默认的构造方法什么都不做;
- 一旦显式地定义了构造方法,默认构造方法自动消失。
总结
- 对象由状态(属性)和行为(方法)组成;
- 类是具有相同属性和方法的对象的集合;
- 封装可以隐藏对象实现的具体细节;
- 必须先实例化类的对象,才可以访问到其中的成员;
- 成员运算符用于访问对象的成员;
- 成员可以定义为公有,也可以定义为私有;
- 构造方法一般用来初始化对象中的数据成员;
- 如果不定义构造方法,将有默认的构造方法,一旦定义,默认的构造方法自动消失。