Java 面向对象语言

※ OOP中的基本概念

Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计实现为一个可运行的系统。Java的编程单位是类,对象最后要通过类进行实例化(即“创建”)。

面向对象编程有三个特性:
(先简单的了解一下这三个特点,具体有另外详讲)
. 封装 Encapsulation:以前我们讲过java是以类为基础的,所有的属性和方法都是封装在类中的,不像C++在类外还可以定义函数。
. 继承 Inheritance:不容置疑,从父亲那里继承什么家产、金钱或者产业什么的,运用到我们java中又是怎么回事呢?它又继承哪些东东呢?
. 多态 Polymorphism:表面看是多种状态的意思。(这里先不过多讨论,下面会详细讨论)

※ 理解对象

面向对象的开发方法把软件系统看成各种对象的集合,对象就是最小的子系统,一组相关的对象能够组合成更复杂的子系统。面向对象的开发方法将软件系统看成各种对象的集合,接近人的自然思维方式。

※ 对象是对问题领域中事件的抽象。对象具有以下特性:
1)万物皆为对象。问题领域中的实体和概念都可以抽象为对象。例如学生,成绩单、教师、课和教室。
2)每个对象都是惟一的。正如世界上不存在一模一样的叶子。
3)对象具有属性和行为。
例如小张,性别女,年龄22,身高1.6m, 体重40kg, 能够学习,唱歌。小张的属性包括姓名、性别、年龄、身高和
体重,行为包括学习、唱歌。
例如一部手机,牌子是诺基亚、价格是2000元,银白色,能够拍照、打电话和收发短信等。这部手机的属性包括品
牌类型type、价格price和颜色color,行为包括拍照takePhoto(),打电话call(),收发短信receiveMessage()和发短
信sendMessage().
4)对象具有状态。状态是指某个瞬间对象的各个属性的取值。对象的某些行为会改变对象自身的状态,即属性的取值。
例如小张本来体重为40kg,经为减肥后,体重减到35kg.

 肥胖状态: 40kg
        |
        | 减肥行为
        |                            
 肥胖状态: 35kg 

5)每个对象都是某个类的实例。(内存中开辟区储存特定的数据:是类的具体体现)小张和小王都属于学生类、中国和美国都属于国家类、中文和英文都属于语言类。

. 类是具有相同属性和行为的对象的集合。
. 同一个类的所有实例都有相同属性,但属性取值不一事实上相同,但是它们的状态不一定相同。例如小张和小王都属于学生类,都有姓名、性别、年龄、身高和体重这些属性,但是他们的属性取值不同。
. 同一个类的所有实例都有相同行为,意味着它们具有一些相同的功能。

※ 创建类

对象构建:
类——》JVM类构建对象(属性的构建初始化,方法的构建)——》对象——》测试(方法和特征的调用)
exc:
Student
学号 姓名 性别 年龄 班级 身高 体重 地址
行为:学习 吃饭 睡觉

教务系统

Student
学号 姓名 性别 年龄 班级

体检中心
Student
学号 姓名 性别 年龄 班级 身高 体重

//特征(属性)的声明
修饰符 类型 属性名[=属性值];
class Student{
public long id;
public String name;
public boolean gender;
public int age;
}
//构建行为
修饰符 返回类型 方法的名字(参数args…){}
行为 方法的构建2种
public void 方法名(参数…){}

public Object 方法名(参数…){
return object;
}

exc:
public double studyCoreJava(){
return 99D;
}
public void(void 修饰表示没有返回值)sleep(){
System.out.println(“睡觉”);
}
//通过类构建对象
Student s=new Student();

类是一组具有相同属性和行为对象的模板。面向对象编程的主要任务就是定义对象模型中的各个类。

  package sample;

  public class Teacher {

      /**attributes of a teacher*/
      private String name;
      private int age;
      private double salary;

       /** Creates a new instance of Teacher */
      public Teacher(String name, int age, double salary) {
          this.salary = salary;
          this.age = age;
          this.name = name;
      }
      /**operations on properties */
      /** get the name of this teacher */
      public String getName() { return name; }
      /**get the salary of this teacher */
      public double getSalary() { return salary; }
      /**get the age of teacher teacher */
      public int getAge() { return age; } 
      ……
  }

代码解析:

1)package sample;
包声明语句,将Java类放到特定的包中,便于类的组织、权限访问和区分名字相同的类。
2)public class Teacher {…}
类的声明语句,类名为Teacher, public修饰符意味着这个类可以被公开访问;

 声明类的格式:

 class 类名 {
     类内容
 }

3)private String name;
类的属性(也称为成员变量)的声明语句;Teacher类有一个name属性,字符串类型,private修饰符意味着这个属性
不能被公开访问。
4)get/set方法(获取私有属性,方法)
get方法取值,set方法设置值
public String getName() { return name; /return this.name;}

public void setName(String name){this.name=name;}(第一个name是当前的name,第二个name是调用设置的name)

※ 方法的声明语句和方法体
方法名为getName,不带参数,String表明返回类型为String。public表明这个方法可以被公开访问。getName后紧跟
的大括号为方法体,代表getName的具体实现。

※ 声明方法的格式:

返回值类型 方法名 (参数列表) {
方法体
}

返回值类型是方法的返回数据的类型, 如果返回值类型为void, 表示没有返回值。
方法名是任意合法的标识符;
参数列表可包含零个或多个参数,参数之间以逗号”,”分开。
方法体每个语句用”;”结束;
方法体中使用return语句返回数据或结束本方法的执行;

注:不介绍构造方法。在面向对象章节会提到。

※ 创建实例

public static void main(String[] args) {
          Teacher gzhu = new Teacher("George Zhu", 30, 10000);
          System.out.println("Teacher: " + gzhu.getName());
          System.out.println("\tAge: " + gzhu.getAge());
          System.out.println("\tSalary: " + gzhu.getSalary());
  }

main()方法是Java应用程序的入口点,每个Java应用程序都是从main()方法开始运行的。作为程序入口的main()方法必
须同时符合以下几个条件:
. 用public static修饰;
. 返回类型为void;
. 方法名为main;
. 参数类型为String[];
包含main方法的类又叫主程序类。

类创建好之后,通过new关键字创建具体对象。它有以下作用:
. 为对象分配内存空间,将对象的实例变量自动初始化为其变量类型的默认值;
. 如实例变量显示初始化,将初始化值赋给实例变量;
. 调用构造方法;
. 返回对象的引用;

※ 类中方法的定义

接下来我们来看一下类中定义的方法的格式。
修饰符 返回类型 方法名(参数列表)异常抛出类型{…}

1) 必须有返回值,如果方法没有返回值,必须用void申明返回类型。
2) 构造器没有返回类型,构造器加上了返回类型就变成了一个普通方法的声明了。
3) 方法的修饰符可以同时有多个(多个修饰符之间没有先后顺序)

注意:return_type:如果方法定义了返回类型,那么在方法体里面就必须出现return语句,而且返回的数据类型要和声明一致,如果没有返回类型的话(void void中return是方法的结束),那么方法体里面可以写return,也可以不写return。当代码执行了return语句,那么代码就不往下执行了,直接退出这个方法并返回。

※ return返回值,指的的方法调用结束时返回对应类型的值,当返回值是类类型的时候,直接可以返回生成的类对象。

方法中定义的参数我们通常叫做形参,调用有参数的方法时,我们通常会
传递一些实参给方法,那么在java中方法的参数是如何的传递呢?
(先思考形参和实参的区别)

//temp是形参

public void add(int temp){
  .....
}

main{
    //1是实参
    add(1);
    // temp = 1;


    int a = 10;
    //a是实参
    add(a);
    // temp = a;

}

※ 参数传递

参数传递分为两种:
1)值传递:对于基本数据类型,参数通过值传递。(把实参的值复制一份再传给形参)
2)引用传递:对于引用类型,参数通过引用(对象的引用)传递。(把实参引用中地址值复制一份再传给形参)

※ 构造方法

(构造器/构造函数/构造方法)
1)定义:
. 构造方法的名字和类的名字相同
. 没有返回类型,有返回类型的构造器就变成了普通方法。

2)调用时刻:

在创建对象的时候调用;
注意:是先创建对象,然后初始化对象中的属性值,最后在调用构造器

3)作用:
可以让我们在创建对象的时候做一些对象中数据的初始化工作.(因为在new的后面就是写的构造器)构造器用的时候内存中已经有对象及属性,属性在类中没有赋值的情况是默认值
new Student();
new Student(“tom”,age);

4)构造方法的调用:

构造方法只能通过以下方式被调用:
. 当前类的其他构造方法通过this语句调用它this();必须放在代码第一行,根据this后括号中参数类型及顺序匹配其他的构造器
. 当前类的子类的构造方法通过super语句调用它super();
. 在程序中通过new语句调用它;
八.默认的构造方法

构造方法可分为两种:
(1)隐含的默认构造方法(无参构造器);
(2)程序显示定义的构造方法;

在Java语言中,每个类至少有一个构造方法。为了保证这一点,如果用户定义类中没有提供任何构造方法,那么在运行的时候JVM将自动提供一个隐含的默认构造方法。该构造方法没有参数,用public修饰,而且方法体为空,格式如下:

public ClassName(){} //隐含的默认构造方法

在程序中也可以显示地定义默认构造方法。

如果类中显式定义了一个或多个构造方法,那么Java语言便不再分配隐含的默认构造方法。举例:

    public class Sample{
    public Sample(int a) {
        System.out.println("My Constructor");
    }
    }

    创建Sample类对象的语句:

    Sample s1 = new Sample();        //编译出错
    Sample s2 = new Sample(1);       //合法的

※ 创建和初始化对象

按照前面讲述的定义类的形式、定义方法的形式,构建好类了之后,程序要真实的运行,还是得通过对象的交互来完成。
创建好了类,只是创建了构建对象的模板。接下来,我们可以通过new操作符,快速地构建出对象。使用new有以下作用有以下几步:

1.为对象分配内存空间,将对象的实例变量自动初始化默认值;
2.如实例变量显示初始化,将初始化值赋给实例变量(把默认值覆盖掉);
3.调用构造方法;
4.返回对象的地址值;
(注意:之后我们会把这个步骤再细分)

※ 构造方法重载(同一个类中)

原理:更改构造器参数的顺序,个数,类型,建立不一样的构造器)

当通过new语句创建一个对象时,在不同的条件下,对象可能会有不同的初始化行为。
例如对于公司新来的一个雇员,在一开始的时侯,有可能他的姓名和年龄是未知的,也有可能仅仅他的姓名是已知的,也
有可能姓名和年龄都是已知的。如果姓名是未知的,就暂且把姓名设为“无名氏”,如果年龄是未知的,就暂且把年龄设为-1.

可通过重载构造方法来表达对象的多种初始化行为。在一个类的多个构造方法中,可能会出现一些重复操作。
为了 提高代码的可重用性,Java语言允许在一个构造方法中,用this语句来调用另一个构造方法。

使用this语句来调用其他构造方法时,必须遵守以下语法规则:

1.假如在一个构造方法中使用了this语句,那么它必须作为构造方法的第一条要执行的语句(不考虑注释语句)。

      public Employee() {
          String name="无名氏";
          this(name);      //编译错误,this语句必须作为第一条语句
      }
      public Employee(String name) {
          String name=name;
      }

2.只能在一个构造方法中用this语句来调用类的其他构造方法,
而不能在实例方法中用this语句来调用类的其他构造方法;

3.只能用this语句来调用其他构造方法,而不能通过方法名来直接调用构造方法。

      public Employee() {
          Employee(name);      //编译错误,要使用this关键字来调用
          String name="无名氏";
      }
      public Employee(String name) {
          String name=name;
      }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值