java基础知识之面向对象(一)
1.面向对象的概述:面向对象是基于面向过程,是程序设计的一种思想,它是将功能行为
封装进对象,强调的是具有功能行为的对象。
2.面向对象的好处:
1>易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以
维护起来是非常方便和较低成本的。
2>效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生
活和自然的思考方式,势必提高软件开发的效率和质量。
3>质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
4>易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
3.面向对象的设计原则:
1> SRP 单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。
2> OCP 开放————封闭原则
软件实体(类、模块、函数等)应该是可以开展的,但是不可修改。
3> LSP Liskov 替换原则
子类型必须能够替换掉它们的父类型。
4> DIP 依赖倒置原则
抽象不应该依赖于细节。细节应该依赖于抽象。
5> ISP 接口隔离原则
不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。
6> REP 重用发布等价原则
重用的粒度就是发布的粒度
7>CCP 共同封闭原则
包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有
产生影响,而对于其他的包不造成任何影响。
8> CRP 共同重用原则
一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
9> ADP 无环依赖原则
在包的依赖关系图中不允许存在环。
10>SDP 稳定依赖原则
朝着稳定的方向进行依赖
11>SAP 稳定抽象原则
包的抽象程度应该和其稳定程度一致。
4.面向对象和面向过程的区别
1>
面向对象的思想:以对象为中心,先开发类,得到对象,通过对象之间相互通信实现功能。
面向过程的思想:由过程,步骤,函数组成,以过程为核心。
2> 面向对象是先有数据结构,后有算法。
面向过程是先有算法,后有数据结构。
3> 在使用面向对象开发过程中,可以复用的对象就进行复用,无法复用的情况就开发新的对象。
使用面向过程开发是用多个简单对象的多个简单的方法来实现其复杂的功能。
5.类与对象的关系
类是具有共同属性和功能行为的一组对象的集合,它为该类的所有对象提供了统一的抽象描述。
对象是系统中用于描述客观事物的一个实体,一个对象由一组属性和相对应的功能行为所组成,类
的实例化结果就是对象,而对一类对象的抽象描述就是类。
例如:
//定义一个学生的类
class Student{
String name;//学生姓名
int age;//学生年龄
/*
* 定义输出学生信息的功能
*/
void show(){
System.out.println("学生姓名:"+name+"年龄:"+age);
}
public static void main(String args[]){
//实例化一个学生对象
Student stu=new Student();
stu.name="张三";
stu.age=18;
stu.show();
}
}
//输出的结果为 学生姓名:张三 年龄:18
6.成员变量和局部变量
1>成员变量
概念:成员变量又称全局变量,定义在类中,和类的方法处于同一个层次。
定义语法: 变量修饰符 类型 变量名;
public class Clothes
{
String id; //实例变量
private String colorType; //实例变量
private int size; //实例变量
private static String depart; //类变量
final String design="yangzi"; //常量
}
代码中的实例变量、类变量、常量都属于成员变量.区别在于变量的修饰符不一样,成员变量的修饰符有如下几种
public:
成员变量可以被项目中的任何方法访问,建议尽量少用
static:
类变量,其值为该类的所有对象共享,不会因类的对象不同而不同
transient:
当对象被持久化时(例如写入数据库),该成员变量的值不需要保存
volatile:
同步多线程访问的成员变量的值,以便使不同的线程总是得到
该成员变量的同一个值。
2>局部变量:
概念:指在程序中,只在特定过程或函数中可以访问的变量,是相对与全局变量而言的。
根据定义的形式不同可分为三种:
形参(作用域是整个方法体) ;
方法局部变量;
代码块局部变量;
注: 局部变量不允许范围内定义同名的变量,局部变量与成员变量允许命名冲突。
3>成员变量与局部变量的区别:
作用域不同:成员变量的作用于整个类中,局部变量作用于函数中或语句中
在内存中的位置不同:成员变量在堆内存中,因为对象的存在而存在,而局部变量是在栈内存中
赋值形式不同:与成员变量不同的是
局部变量除了形参以外,都必须显示初始化值,否则将会访问不到,形参不
需要显示初始化,它在被调用的时候由系统完成。
注:成员变量与局部变量一般使用this关键字来加以区别。
7.匿名对象的使用
1>匿名对象概念:即在一个对象在被创建之后,调用对象的方法时可以不定义对象的引用变量,而直接调用这个
对象的方法。例如: Cylinder volu=new Cylinder();
volu.SetCylinder(2.5,5,3.14);
等价于 Cylinder().SetCylinder(2.5,5,3.14);
2> 匿名对象通常使用在以下两种情况:
(1)、如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。如:
package fruit;
class Fruit
{
String name;
String color;
String exterior;
int year,month,day;
public void DATE(int y,int m,int d){
this.year=y;
this.month=m;
this.day=d;
System.out.println("生产日期:"+y+"年"+m+"月"+d+"日");
}
public Fruit(){
}
public Fruit(String name){
this.name=name;
System.out.println(name);
}
}
class Apple extends Fruit{
private String producingArea="中国陕西";
public Apple(){
System.out.println("产地:"+this.producingArea);
}
public void show(){
color="红色";
exterior="椭圆型";
System.out.println("颜色:"+color+" "+"外型:"+exterior);
}
}
class Banana extends Fruit{
private String season="一年四季";
public Banana(){
System.out.println("产出季节:"+this.season);
}
public void show(){
color="黄色";
exterior="长条型";
System.out.println("颜色:"+color+" "+"外型:"+exterior);
}
}
public class Main {
public static void main(String[] args) {
Fruit F1=new Fruit("苹果");
Apple a=new Apple();
a.show();
new Fruit().DATE(2010, 5, 6);
Fruit F2=new Fruit("香蕉");
Banana b=new Banana();
b.show();
new Fruit().DATE(2010, 9, 10);
}
}
(2)、将匿名对象作为实参传递给一个方法调用。如:一个程序中有一个getSomeOne方法要接收一个Myclass类对象作为参数,方法如下:
public static void main(String args[ ])
{......}
可以用下面的语句调用这个方法。
getSomeOne(new MyClass());