1、前言
面向过程(Process-oriented Programming):面向过程的结构化开发语言适合早期的“作坊式”开发,但是随着软件规模的扩大,这种开发方式的弊端也逐渐显示出来,开发周期长、不利于维护等等,于是“软件危机”爆发了,在此大环境下产生了一种新的开发思想——面向对象。
面向对象(Object-oriented Programming,OOP):将所有预处理的问题(业务需求),以对象为基本单元,同时了解对象具有哪些属性和行为,以解决对象面临的实际问题。
面向对象和面向过程是相辅相成的。
抽象:根据业务需求,注重主要信息,忽略次要信息,进行信息的抽取。
封装:将属性私有化,提供公有的 get / set 方法,对私有的属性进行访问。
类:具有相同的特征和行为的实体的集合,是一种抽象的数据类型(八种基本数据类型和String之外的)。想表示现实生活中的一个事物的时候,与Java现有的类型不匹配,而自行开发的。
对象:是类的实例化,是现实中真是存在的实体。
类和对象的关系
2、类之间的通信
Student.java
public class Student {
//属性(静态特征)
private String sname;
private char sex;
private int age;
//普通的方法
public void study() {
System.out.println(this.sname+"爱学习");
}
//回答问题的方法
public void answer() {
System.out.println(this.sname+"回答了问题");
}
//对私有的属性提供公有的get/set方法
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Teacher.java
public class Teacher {
private String tname;
//对学生进行提问的方法:通过传递参数建立学生和老师的关系
public void question(Student s) {
System.out.println(this.tname+"提出了问题");
s.answer();
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
}
Test.java
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.setSname("陈同学");
Teacher t = new Teacher();
t.setTname("赵老师");
t.question(s);
}
}
通过以上的代码初步了解类之间通信的概念,接下来设置一种情景:用面向对象的思想描述猎人打猎的行为。
Animal.java
public class Animal {
private String aname;
public void dead() {
System.out.println(this.aname+"死了");
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
}
Gun.java
public class Gun {
public void shoot(Animal an) {
System.out.println("枪口对准了"+an.getAname());
an.dead();
}
}
Hunter.java
public class Hunter {
public void hunt(Gun g,Animal an) {
System.out.println("开始射击!");
g.shoot(an);
}
}
Test.java
public class Test {
public static void main(String[] args) {
Animal an = new Animal();
an.setAname("野猪");
Hunter h = new Hunter();
Gun g = new Gun();
h.hunt(g, an);
}
}
3、访问权限
4、构造方法
- 作用: (1)创建对象(2)对对象进行初始化
- 特点: 方法名与类名相同,没有返回值
- 如果不写构造方法的话,系统会默认添加一个无参的构造方法;但是如果写了含有参数的构造方法(没有无参的),在创建对象的时候就必须传入参数。
Rectangle.java
public class Rectangle {
private float length;
private float width;
//通过构造函数进行初始化
public Rectangle(float length,float width) {
this.length = length;
this.width = width;
}
//计算周长
public float getPer() {
return 2*(length+width);
}
//计算面积
public float getArea() {
return length*width;
}
//显示计算的结果
public void showAll() {
System.out.println("周长是:" + this.getPer());
System.out.println("面积是:" + this.getArea());
}
}
Test.java
public class Test {
public static void main(String[] args) {
Rectangle r = new Rectangle(3,5);
r.showAll();
}
}
5、构造方法的重载
构造方法的重载:方法名相同,参数列表不同
this关键字的作用:(1)区分属性和参数(2)构造方法的互调(需保留一个出口)
Emp.java
public class Emp {
private int eno;
private String ename;
private float sal;
private String job;
public Emp(int eno,String ename,float sal,String job){
this.eno = eno;
this.ename = ename;
this.sal = sal;
this.job = job;
}
//使用this进行构造方法的互调
public Emp(String ename,float sal) {
this(1001,ename,sal,"自由职业者");
}
public void showAll() {
System.out.println("编号:"+this.eno);
System.out.println("姓名:"+this.ename);
System.out.println("工资:"+this.sal);
System.out.println("工作:"+this.job);
}
}
Test.java
public class Test {
public static void main(String[] args) {
Emp e = new Emp("张三",5000);
e.showAll();
}
}