面向对象的思想
结构化开发(面向过程)
面向功能分软件结构;;
自顶而下;
最小的子系统是方法。
面向对象开发
把软件系统开成各种对象的集合;
系统结构相对稳定;
子系统相对独立;
面向对象的思想就是不断创建对象、使用对象、指挥对象做事情。
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。
面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定 可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
类和对象的概述
成员变量 :事物的属性(事物描述的信息)
成员方法 : 事物的行为 (行为:事物能做什么)
类:一组相关属性和行为的集合
对象:类的一种具体体现
定义类就是定义类的成员(成员变量和成员方法)
对象的创建
类名 对象名 = new 类名();
类名 对象名 :这个的解释是创建名称为“对象名”的“类名”类引用变量
new : 这个的解释是实例化对象
类名() :这个的解释是无参数构造方法;
new 类名() :就是说以无参数构造方法实例化对象;
类名 对象名=new 类名() :用指针的解释就是:以无参数构造方法实例化对象并将这个对象的内存引用赋给“类名”类的“对象名”引用变量
引用类属性 : 对象名.属性
引用类方法 : 对象名.方法名()
package com.anq.core;
public class StudenTest {
public static void main(String[] args) {
Student stu = new Student(); //创建对象
//使用对象
stu.name = "张三";
stu.stuStudy();
stu.stuEat();
}
}
class Student{
//定义属性
String name;
int age;
//定义方法
public void stuStudy() {
System.out.println(name + "正在学习");
}
public void stuEat(){
System.out.println(name + "正在吃饭");
}
}
方法的定义
没有返回值情况。
public void 方法名(){
//方法体
}
如果方法没有返回值,返回值的类型为void,
有返回值情况。
public 返回类型 方法名(){
//方法体
}
如果方法有返回值,方法中必须有return关键字,返回值类型为该值的类型。
package com.anq.core;
public class CalcTest {
public static void main(String[] args) {
CalcTest ct = new CalcTest();
ct.add();
System.out.println(ct.add1());
}
//无返回值
public void add(){
int num1 = 100;
int num2 = 200;
System.out.println(num1+num2);
save(); //类间的方法可以相互调用,不需要定义
}
//有返回值
public int add1(){
int num1 = 100;
int num2 = 200;
return num1 + num2;
}
public void save(){
System.out.println("调用save方法");
}
}
有参构造
基本数据类型传参
当参数是基本类型时,传递参数的值,比如传递i = 10,真实传参时,把10赋值给了形参。
package com.anq.core;
/**
* 增加学生信息,保存在数组中
* 指定查找区间,来查找学生姓名
*/
public class SearchUser {
String[] names = new String[5];
//添加学生姓名
public void add(){
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
names[3] = "燕六";
names[4] = "谢七";
}
/**
* 查询指定区间
* @param start 起始区间
* @param end 结束区间
*/
public void search(int start, int end){
for (int i =start-1 ; i < end ; i++){
String name = names[i];
System.out.println(name);
}
}
}
package com.anq.core;
public class SeachTest {
public static void main(String[] args) {
SearchUser user = new SearchUser();
user.add();
System.out.println(user.names.length);
//查询2~4位学生的信息
user.search(2,4);
}
}
引用数据类型传参数
当参数是对象时,传递的是对象的值,也就是对象的首地址。就是把对象的地址赋值给了形参。
package com.anq.core;
public class StudenTest {
public static void main(String[] args) {
Student stu = new Student(); //地址值
stu.name = "李三";
System.out.println("stu:" +stu);
Student stu1 = new Student(); //地址值
System.out.println("stu1:"+ stu1);
stu1.name = "张四";
stu1.stuSleep(stu);
stu1.stuSleep(stu1);
}
}
class Student{
//定义属性
String name;
public void stuSleep(Student s){ //对象的地址赋值给了形参,对象的值
System.out.println(s + "正在睡觉");
System.out.println(s.name + "正在睡觉");
s.name = "黄五";
System.out.println(s + "正在睡觉");
System.out.println(s.name + "正在睡觉");
}
}
匿名对象的概述及应用
匿名对象只合适对方法的一次调用,调用多次就会产生多个对象,
匿名函数可以调用属性,调用后会变成垃圾回收,没有意义。
package com.anq.core;
public class CarTest {
public static void main(String[] args) {
//正常情况下
Car c1 = new Car();
c1.run();
//匿名
new Car().run();
new Car().run();
new Car().run();
}
}
class Car{
public void run(){
System.out.println(a + "车正在运行");
}
}
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
