类 与 对象

面向对象概述

  • 面向对象的程序设计(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( )要求垃圾回收时,垃圾回收线程与系统同步运行。

  • 类的声明:
  1. 使用类声明可以创建新的类。声明一个类就是创建一个新的数据类型,而类在java中属于引用数据类型。java使用关键字class来声明类。类的属性称为数据成员,对数据成员进行的操作称为成员方法。类的组成成分是数据成员和成员方法。数据成员用来描述对象的属性,它可以是任何变量类型,包括对象类型;成员方法用来刻画对象的行为或动作,每一个成员方法确定一个功能或操作。类的声明的简明形式如下:
[类修饰符]   class  类名[extends 基类][implements 接口列表]{
类体}
  1. 各部分意义:
     (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.方法,是指当前对象的引用,指的是当前对象的内存。

猜你喜欢

转载自blog.csdn.net/nn1__2970/article/details/83512984