四 面向对象(重)
4.1面向对象概念
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。个人理解:对现实事物的模拟,先抽象出事物的共有特点,属性行为等,再抽象出的特点,具体地模拟出一个事物,即生成对象。这种思想,很符合人的思维方式,更简单地用程序对事物进行模拟。
4.2类与对象
Class A{类(class):对某一类事物的模拟,包括事物的静态属性和动态可执行操作的结合。
对象 :类的一个个体,某个类中实实在在存在的个体,如狗是一个类,那么我家的狗就是狗这个类中的具体一个对象,也叫实体。
类的定义: 一个类中通常有 成员变量 ,方法,构造方法(构造器)等,即属性和行为;
//oop例子
public class Dog {
public String color;//狗的颜色
public int weight;//狗的体重
public int high;//狗的身高
//狗奔跑
public void run(){
int j ;
System.out.println("狗在跑!");
}
public void eat(){
System.out.println("狗在吃!");
}
public static void main(String[] args) {
//类实例化生成对象,mydog指向生成的对象,是一个引用变量,可以理解为对象的“遥控器”。
Dog mydog = new Dog();
mydog.color = "yellow";//我家的狗是黄毛。通过遥控器设置
mydog.run();//通过遥控器调用
}
}
上面定义了一个名为Dog的类 ,类中color、weight、high为成员变量,
成员变量:定义在类中,类中都可以访问 并有默认初始化值.存于堆内存对象中,随着对象的创建而被创建,对象的消失而消失。
局部变量:定义在函数、语句、局部代码块中 ,只在区域生效如j,存于栈内存方法中,只要在所属区域被执行时才会被创建,随着区域的执行结束而释放。无初始化值,即需要初始化。 注:局部变量只要不是在同一“局部”中,名称可以相同。
注:匿名对象 new Dog(); 调用方法时new Dog().run();其实就是定义对象时 的简写格式,没有了”遥控器”。使用场景:当对象对方法仅调用一次的时候,可以简化为匿名对象,也可以在做类类型参数时使用如xxx(new Dog())。
一个对象实例化过程:
Person p = new Person();
1,JVM会读取指定的路径下的Person.class文件,并加载进内存,
并会先加载Person的父类(如果有直接的父类的情况下).
2,在堆内存中的开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化。
4,调用对应的构造函数进行初始化。
5,在构造函数中,第一行会先到调用父类中构造函数进行初始化。
6,父类初始化完毕后,在对子类的属性进行显示初始化。
7,在进行子类构造函数的特定初始化。
8,初始化完毕后,将地址值赋值给引用变量.
4.3 封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。优点:
将变化量隔离;提高安全性,提高重用性,便于使用。是面向对象语言的特征之一。
封装原则:将不需要对外提供的内容都隐藏起来;把属性都隐藏(private),提供公共方法对其访问(如javabean规范)。
类的访问:在一个类的内部所有成员可以互相访问,访问控制符是透明的,访问控制符知识针对外部访问而言的。而外部访问有两种方式,1 通过类名访问类内部成员,2 通过对象名访问成员。
修饰符:public、private 、默认、protected.
public: 可以通过外部访问方式访问了类内部public成员。
private :不可以通过外部访问的方式访问类内部的private成员。
没有写修饰符就是默认权限。
访问权限 类 包 子类 其他包
public ∨ ∨ ∨ ∨
protect ∨ ∨ ∨ ×
default ∨ ∨ × ×
private ∨ × × ×
包package:
包的作用:写在程序的第一行,对类进行分类管理,给类提供了多层命名空间,并且包也是一种封装方式。
格式:package 包名; 则类的全称是 包名.类名。
在同一包下的类可以互相访问,如果想访问不在同一个包下的类,那么需要对该类使用import + 类的全称 进行引入;但是包中的类必须是public;类中的方法是public才能访问。当然也可以使用通配符*;导入包中所有类(import 包名.*;)。
cmd中输入jar;查看如何打包解包;
4.4 构造函数
构造方法:以类名为名的,不需要定义类型,无具体返回值的方法,也可以叫做构造器、构造函数。 每个类中都有默认的不含参数的构造方法 ,也可以自己定义含参数的构造方法,重载的方式 。一个类中可以有多个构造方法,他们以重载的方式存在。构造方法用来给对象初始化---------A xxx = new A(int x); 创建对象同时调用构造方法。一般情况下,构造方法创建对象时让对象一存在就具备的内容,也就是给对象初始化。
格式: 若类名为A 则构造函数 A(){xxx}
注:如果一个类中指定了构造函数,那么类中的默认构造函数就消失了。如果想让其不消失可以在类中写出默认构造函数。另外构造函数不能被类中的一般函数调用。
4.5 this关键字
this: 代表其所在函数所属对象的引用,即this是类对象的引用,特殊的“遥控器”。使用场景:当函数内需要调用到该函数的对象的时候,就用this.
应用:1成员变量名和局部变量名重名的时候,可以用this区分。
2 this 在构造函数中调用其他构造函数。this(name);但只能定义在构造函数的第一行。
在本类中引用本类对象通常用this。
4.6 static关键字
Static:
1,static是一个修饰符,用于修饰成员。
2,static修饰的成员被所有的对象所共享。
3,static优先于对象存在,因为static的成员随着类的加载就已经存在了。
4,static修饰的成员多了一种调用方式,就可以直接被类名所调用 。 类名.静态成员 。
5,static修饰的数据是共享数据,对象中的存储的是特有数据。
成员变量和静态变量的区别:
1,两个变量的生命周期不同。
成员变量随着对象的创建而存在,随着对象的被回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。
2,调用方式不同。
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
3,别名不同。
成员变量也称为实例变量。静态变量称为类变量。
4,数据存储位置不同。
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据.
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据.
静态使用的注意事项:
1,静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
2,静态方法中不可以使用this或者super关键字。
3,主函数是静态的。
静态什么时候用?
1,静态变量。
当分析对象中所具备的成员变量的值都是相同的 。这时这个成员就可以被静态修饰。只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。
2,静态函数。
函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据。
简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。
如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,
但是非静态需要被对象调用,而仅创建对象调用非静态的
没有访问特有数据的方法,该对象的创建是没有意义。