#🔭学习内容
了解面向对象的三大特征
掌握类与对象的关系、定义及使用
掌握对象的创建格式,可以创建多个对象
掌握对象的内存分配过程
掌握封装性的概念及使用
✈️目录
🔭1、基本概念
🪶(1)面向过程
🪶(2)面向对象
🔭2、类与对象
🪶(1)关系
🪶(2)类的定义
🪶(3)对象的创建和使用
🔭3、封装性
🔭1、基本概念
🪶(1)面向过程
用户提出哪些要求,就针对用户的要求进行制作,直接制作出一个完整的整体
🪶(2)面向对象
针对用户提出的要求进行分析,并将分析的结果设计成一张完整的图纸,与需求的用户确认,然后将一切的准备工作全部处理完之后再分块制作,最后将各个小的部分组装在一起
面向对象比面向过程更能适应用户的变化
面向对象有三个主要特性:
✒️封装性
一是指把对象的属性和行为看成一个密不可分的整体,将这两者“封装"在一个不可分割的独立单位(即对象)中;
另一层含义指“信息隐蔽",把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知道,或只允许使用对象的功能,而尽可能隐蔽对象的功能实现细节。
封装机制一个特点是,为封装在一个整体内的变量及方法规定不同级别的“可见性”或访问权限。
✒️继承性
首先拥有反映事物一般特性的类,然后在其基础上派生出反映特殊事物的类。如己有汽车的类,该类中描述了汽车的普遍属性和行为,进一步再产生轿车的类,轿车的类是继承于汽车类,轿车类不但拥有汽车类的全部属性和行为,还增加轿车特有的属性和行为。
在Java程序设计中,己有的类可以是Java开发环境所提供的一批最基本的程序——类库,用户开发的程序类是继承这些己有的类。这样,现在类所描述过的属性及行为,即己定义的变量和方法,在继承产生的类中完全可以使用。被继承的类称为父类或超类,而经继承产生的类称为子类或派生类。
面向对象程序设计中的继承机制大大增强了程序代码的可复用性,提高了软件的开发效率,降低了程序产生错误的可能性,也为程序的修改扩充提供了便利。
若一个子类只允许继承一个父类,则称为单继承;若允许继承多个父类,则称为多继承。目前许多面向对象程序设计语言不支持多继承。而Java语言通过接口(interface)的方式来弥补由于Java不支持多继承而带来的子类不能享用多个父类的成员的缺点。
✒️多态性
多态是允许程序中出现重名现象。Java 语言中含有方法重载与对象多态两种形式的多态。
方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
对象多态:子类对象可以与父类对象进行相互转换,而且根据其使用的子类的不同,完成的功能也不同。
多态的特性使程序的抽象程度和简捷程度更高,有助于程序设计人员对程序的分组协同开发。
🔭2、类与对象
🪶(1)关系
✒️类:指的是一类事务,是一个抽象的概念。
✒️对象:指的是属于某个类的具体实现。
关系:类是对象的抽象,对象是类的实例
一个类可以有很多对象,而一个对象必然属于某个类。
🪶(2)类的定义
类的定义语法如下:
class 类名称{ 数据类型 属性; //声明成员变量(属性) … public 返回值的数据类型 方法名称(参数1,参数2…){ 程序语句; //定义方法的内容 [return表达式;] } } 定义一个Person类 class Person{ String name; //声明姓名属性 int age; //声明年龄属性 public void tell(){ //取得信息的方法 System.out.println("姓名:" + name +",年龄:"+ age); } }
🪶(3)对象的创建和使用
类名 对象名称=null // 声明对象 对象名称=new 类名() //实例化对象
用以上格式产生对象分为声明对象和实例化对象两步。
当然也可以直接通过以下方式一步完成:
类名 对象名称=new 类名()
以上格式与数组定义的格式相似,因为类和数组都属于引用数据类型,只要是引用数据类型的使用格式都可以使用如上的定义样式。
创建对象的具体范例
class Person{ String name; //声明姓名属性 int age; //声明年龄属性 public void tell(){ //取得信息的方法 System.out.println("姓名:" + name +",年龄:"+ age); } } public class Demo{ public static void main(String[] args){ Person p=new Person(); //创建并实例化对象 } }
所有的对象名称都在栈内存中保存,而对象的具体内容则保存在对应的堆内存之中,必须使用new关键字才能开辟堆内存空间。
访问对象中的属性或方法
访问属性:对象名称.属性名 访问方法:对象名称.方法名()
范例(可以创建多个对象)
class Person{ String name; //声明姓名属性 int age; //声明年龄属性 public void tell(){ //取得信息的方法 System.out.println("姓名:" + name +",年龄:"+ age); } } public class Demo{ public static void main(String[] args){ Person p1=null; Person p2=null; p1.name="张三"; //为name赋初值 p2.name="李四"; p1.age=30; //为age赋初值 p2.age=32; p1.tell(); //调用tell方法 p2.tell(); } }
对象引用传递
class Person{ String name; //声明姓名属性 int age; //声明年龄属性 public void tell(){ //取得信息的方法 System.out.println("姓名:" + name +",年龄:"+ age); } } public class Demo{ public static void main(String[] args){ Person p1=null; Person p2=null; p1=new person(); //只实例化pl一个对象 p2=p1; //把pl的堆内存空间使用权给p2 p1.name="张三"; p1.age=30; p2.age=33; //设置p2对象的内容,实际上就是设置pl对象的内容 System.out.print("p1的内容:"); p1.tell(); System.out.print("p2的内容:"); p2.tell(); } }
运行结果:
p1的内容:姓名:张三,年龄:33 p2的内容:姓名:张三,年龄:33
从程序运行结果可以发现,两个对象的输出内容是一样的,实际上所谓的引用传递,就是将一个堆内存空间的使用权给多个栈内存空间,每个栈内存空间都可以修改堆内存的内容
一个栈内存空间只能指向一个堆内存空间,如果要想再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向。
🔭3、封装性
用对象直接访问类中的属性在面向对象法则中是不允许的。所以为了避免程序中这种错误的发生,在一般的开发中往往要将类中的属性封装(private),封装的格式如下:
属性封装:private 属性类型 属性名称; 方法封装:private 方法返回值 方法名称(参数列表){ }
只要是被封装的属性,则必须通过setter和getter方法设置和取得,范例如下:
class Person{ private String name; //声明姓名属性 private int age; //声明年龄属性 public void tell(){ //取得信息的方法 System.out.println("姓名:" + this.getName() +",年龄:"+ this.getAge()); // this 强调该方法是本类中的方法,可不写 } public String getName(){ return name; } public void setName(String n){ name=n; } public int getAge{ return age; } public void setAge(int a){ if(a>0 && a<150){ age=a; } } } public class Demo{ public static void main(String[] args){ Person p=new Person(); //创建并实例化对象 p.setName("张三"); p.setAge(30); p.tell(); } }
类图的表示
Person - name: String - age : int + tell () :void + getName () :String + setName (String n) :void + getAge() :int + setAge (int a) :void
-表示private
+表示public