面向对象概述
- 面向对象的程序设计(OOP)是建立在把对象作为基本实体看待的面向对象(object oriented)的模型上的,这种模型可以使对象之间交互操作。
- 面向对象的程序设计具有3个基本特征:封装、继承、多态,可以大大增强程序的可靠性、代码的重用性和程序的可维护性,从而提高程序的开发效率。
- (1)封装(encapsulation):就是把客观事物抽象并封装成对象,即将数据成员、属性、方法和事件集合在一个整体内。通过访问控制,还可以将隐藏内部成员,只允许可信的对象访问或操作自己的数据或方法。 封装保证了对象的独立性,可以防止外部程序破坏对象的内部数据,同时便于程序的维护和修改。
- (2)继承(inheritance):是面向对象的程序设计中代码重用的主要方法。继承允许使用现有类的功能,并在无须重新修改原来类的情况下,对这些功能进行扩展。继承可以避免代码复制和相关的代码维护等问题。 继承的过程,就是从一般到特殊的过程。被继承的类称为“基类(base class)”、“父类”或“超类(super class)”,通过继承创建的新类称为“子类(subclass)”或“派生类(derived class)”。
一个子类只能有一个基类(单一继承),但允许多个接口。 - (3)多态(polymorphism):是指同样的消息被不同类型的对象接收导致完全不同的行为。多态性允许每个对象以自己的方式去响应共同的消息,从而允许用户以更明确的方式建立通用软件,提高软件开发的可维护性。
类与对象概述
类
类(class)是java语言的核心,java的一切类型都是类,所有的语句都必须位于类内。java类库中包含大量解决问题通用的类,一般可以通过创建自定义类和使用Java类库来解决实际问题。
类是一个数据结构,类定义数据类型的数据(字段)和行为(方法)。对象(object)是基于类的基本实例(instance)。
对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。
当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。
- 类的声明:
- 使用类声明可以创建新的类。声明一个类就是创建一个新的数据类型,而类在java中属于引用数据类型。java使用关键字class来声明类。类的属性称为数据成员,对数据成员进行的操作称为成员方法。类的组成成分是数据成员和成员方法。数据成员用来描述对象的属性,它可以是任何变量类型,包括对象类型;成员方法用来刻画对象的行为或动作,每一个成员方法确定一个功能或操作。类的声明的简明形式如下:
[类修饰符] class 类名[extends 基类][implements 接口列表]{
类体}
- 各部分意义:
(1)类修饰符(可选):用于定义类的可访问性等信息(public、abstract、final、private、protected)。
(2)class:关键字,注意首字母小写。
(3)类名:所要定义的类的标识符,必须符合标识符的命名规则,一般采用PascalCase命名规范,例如MyClass。
(4)extends 基类(可选):用于声明要继承的类。
(5)implements 接口列表(可选):用于声明要实现的一个或多个接口。
(6)类体:用于定义该类的成员包括在一对花括号之间,类体可以为空。
类的构造方法:
将成员变量初始化封装起来的方法称为构造方法(constructor)。
(1)构造方法名必须与类名相同。
(2)构造方法总是和new运算符一起被调用。
(3)构造方法不返回任何值,也没有返回类型(包括void类型)。
(4)每一个类可以有零个或多个构造方法,即构造方法可以重载。
(5)构造方法在创建对象时自动执行,一般不能显式地直接调用。
(6)如果用户在一个自定义类中未定义该类的构造方法,系统将自动为这个类定义一个缺省的空构造方法。
class Person{
public int age;//数据成员 或称 成员属性
public String name;
public String sex;
public Person(){ //不带参数的构造方法
}
public Person(int age1,String name1,String sex1){//带三个参数的构造方法
age = age1;
name = name1;
sex = sex1;
}
public int getAge() { //成员方法 get set
return age;
}
public void setAge(int age) {
this.age = age; //this 指明赋值号左边为引用当前对象的成员变量
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void sleep(){//行为 成员方法 函数
System.out.println("Person.sleep()");
}
public void eat(){
System.out.println("Person.eat()");
}
}
public class ClassObject {
public static void main(String[] args) {
//创建Person 类的两个对象person1,person2
Person person1 = new Person(20, "lili", "woman");
Person person2 = new Person(21, "Tom", "man");
//对象的数据成员的使用
person1.age = 20;
person1.name="lili";
person1.sex="woman";
person2.age = 21;
person2.name="Tom";
person2.sex="man";
//对象的成员方法的调用
System.out.println("Age of person1:"+person1.getAge());
System.out.println("Name of person1:"+person1.getName());
System.out.println("Sex of person1:"+person1.getSex());
System.out.println("Age of person2:"+person2.getAge());
System.out.println("Name of person2:"+person2.getName());
System.out.println("Sex of person2:"+person2.getSex());
}
}
- 对象的初始化有两种方式:
(1)get set方法的调用;
(2)通过合适的构造函数进行初始化: - 对象的创建分为两步:
(1)首先为对象分配内存;
(2)调用合适的构造函数;
this的引用:
在java中,系统默认每个类都缺省地具有null、this和super三个对象引用变量,所以在任意类中不加说明直接使用这三个对象。其中,null代表空对象,一般用null来代表未创建的对象;this是指当前对象的引用,指的是当前对象的内存;super是指对父类对象的引用。
当需要引用当前对象的数据成员或成员方法时,便可以利用this来实现这个目的,this表示的就是当前对象本身,即当前对象的一个引用。可以通过“this.类中的方法名(成员名)” 来实现对类的方法或成员的访问。
class Person{
private int age;//private 只能被这个类本身访问,构造方法为private则其它类不能声称该类的一个实例
public String name;//public 可以被所有类访问
public String sex;
protected void setAge(int age){ //protected 可以被这个类本身、它的子类和同一个包中的所有其他的类访问
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
Person(int age,String name,String sex){
this.setAge(age);
this.setSex(sex);
this.setName(name);
}
public void print(){
System.out.println("name="+name+"age="+age+"sex="+sex);
}
静态块初始化 实例块初始化
- static 修饰的的变量属于类,不属于对象 ,存放在 方法区,
static 所修饰的方法或者数据成员不依赖于对象。 - 静态块初始化:
static{
}
静态方法 静态成员 不属于对象,不能使用对象名调用,静态数据:静态块 同等级, 初始化顺序与顺序相关。 - 静态代码块只初始化一次
- 实例块初始化
{
this.name=“lili”;
this.sex=“woman”;
this.age=20;
}
class Person1 {
private int age;//数据
private String name;
private String sex;
private static int count;
{
this.name = "lili";
this.sex = "woman";
this.age = 20;
System.out.println("instance {} init");//实例块初始化
}
public Person1() {
System.out.println("Person().constrcutor");//构造函数初始化
}
static { //static所修饰的方法或者数据成员不依赖于对象
count = 1;
System.out.println("static {} init");//静态块初始化
}
@Override//覆盖(重写)
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
public class ClassObject {
public static void main(String[] args) {
Person1 person1 = new Person1();
System.out.println(person1);
}
}
输出:
static {} init
instance {} init
Person().constrcutor
Person{age=20, name='lili', sex='woman'}
- 对象的初始化顺序:
静态块初始化====》》实例代码块初始化======》》构造函数初始化
Over…注意对象初始化时get()、set()方法的使用,this.方法,是指当前对象的引用,指的是当前对象的内存。