java面向对象编程设计原则_java

面向对象概述

对象
是一个抽象概念,英文“Object”。通常将对象划分为“静态部分”和“动态部分”。静态部分称为对象的“属性”;动态部分称为对象的“行为”,即对象执行的动作。


是封装对象的属性和行为的载体,也就是具有相同属性和行为的一类实体被称为类。类包括对象的属性和方法。类中对象的属性是以成员变量的形式定义的,对象的行为是以方法的形式定义的。

面向对象程序设计的特点

面向对象程序设计具有以下特点:

封装性、继承性 多态性

1、 封装

封装是面向对象编程的核心思想。通过类为载体,将对象的属性和行为封装起来,类通常会对客户隐藏实现细节。采用封装思想保证了类内部数据结构的完整性,使用该类的用户不能轻易的操作此数据结构,只能操作公开部分。这样就避免了外部操作对数据产生影响,提高程序的可维护性。

java面向对象编程设计原则_java_02


2、 继承

继承实现重复利用的重要手段,子类通过继承,复用父类属性和行为的同时有添加了子类特有的属性行为。但需要注意的是:子类的实例都是父类的实例,但不能说父类的实例是子类的实例。

java面向对象编程设计原则_System_03


3、 多态多态指将父类的对象应用于子类的特征。即一个父类衍生出不同的子类,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这便是多态的结构

java面向对象编程设计原则_java_04

类与对象

类的定义,通过关键字class

语法:

class 类名{

//类的成员变量

//类的成员方法

}

成员变量

Java中对象的属性。

语法:数据类型 变量名称 [= 值];

[= 值]表示可选内容,定义变量是可以为其赋值,也可以为其不赋值

Java常见类型的默认值

java面向对象编程设计原则_面向对象编程基础_05


例:

public class Bird { 
    String type;//种类   
    int num;//数量    
    String wing; //翅膀    
    String claw;//爪子    
    String beak;//喙    
    String feather;//羽毛    
}

成员方法

Java语言中,成员方法对应于类对象的行为,主要用于定义类可执行操作。

1、 成员方法的定义

语法格式:

[权限修饰符][返回值类型] 方法名 ([参数类型 参数名]) [throws 异常类型]
{
 …//方法体
 return 返回值;}

说明:权限修饰符可以是private、public、protected中的任意一个,也可以不写,主要用于控制方法的访问权限;返回值类型用于指定方法返回数据的类型。若不许要返回值,则使用void关键字。一个成员方法既可以有参数,也可以没有参数,参数既可以是对象,也可以是基本数据类型变量

注意:方法的定义必须在某个类中,定义方法如果没有指定权限修饰符,方法的默认访问权限是缺省(即只能在本类及同一个包中的类进行访问)

public void setter(String w)
    {    
        this.wing=w;    
    }                
    public String getter() 
    {
       return wing;
 }

2、 成员方法参数

调用方法时可以给方法传递一个或多个值,传给方法的值叫作实参,在方法内部,接收实参的变量叫作形参,形参声明的语法和变量声明的语法一样。形参只在方法的内部有效。Java中方法的参数只要有三种,分别为值参数引用参数不定长参数

值参数

值参数表明实参与形参之间按值传递,当使用值参数的方法被调用时,编译器为形参分配存储单元,然后将相应的实参的值复制到形参中,由于是值类型的传递方式,所以,在方法中对值类型的形参的修改并不会收到影响。

package Object_practice;
public class Orange {
float weight; // 橘子的重量
/* 定义一个计算价钱的方法 */
public float prise(float a) {
    float charge;
    charge = (float) (a * 1000 / 500 * 2.98);
    return charge;
}
public static void main(String[] args) {
    Orange orange = new Orange();
    orange.weight = 15;
    System.out.println("顾客需要支付:" + orange.prise(orange.weight));
}}

引用参数:

如果在给方法传递参数时,参数是数组或者其他引用类型,那么,在方法中对参数的修改会反映到原有的数组或者其他引用类型上,也就是引用参数

package Object_practice;
public class ExchangeRate {
    public void change(double[] i) {
        for (int j = 0; j < i.length; j++)
            i[j] = i[j] * 6.903;// 将数组中的元素乘以当前汇率
    }
    public static void main(String[] args) {
        ExchangeRate rate = new ExchangeRate();
        double[] mony_$ = { 1, 10, 50, 100 };
	System.out.println("美元");
        for (int i = 0; i < mony_$.length; i++)
            System.out.println(mony_$[i] + "美元");
        rate.change(mony_$);
    System.out.println("人民币");
    for (int i = 0; i < mony_$.length; i++)
        System.out.println(mony_$[i] + "人民币");
}}

不定长参数

声明方法时,如果有若干个相同类型的参数,可以定义为不定长参数。
语法:权限修饰符 返回值类型 方法名(参数类型… 参数名)

int add(int...is x)
{
int result=0;
for(int i=0;i<x.length;i++)
    result += x[i];
return result;
}

构造方法

构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当实例化一个对象时,类会自动调用构造方法。

构造方法特点如下:

  • 构造方法没有返回类型,也不能定义为void
  • 构造方法的名称要与本类的名称相同
  • 构造方法的主要作用是完成对象的初始化工作

语法:

public class Book {
 public Book() {//构造方法
   }

public class Book {
  public Book(int args) { //有参数的构造方法
        //对成员变量进行初始化
 }

注意:若类中定义的构造方法都是有参构造方法,则编译器不会为类自动生成一个默认的无参构造方法。当试图调用无参构造方法实例一个对象时,编译会报错。所有只有在类中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法。

package Object_practice;
public class Book {
    public Book() {// 无参构造方法
        System.out.println("*************");
}
    public Book(String name) { // 有参数的构造方法
        System.out.println("请前往柜台登记领取" + name + ".");       
        }
public static void main(String[] args) {
    Book book = new Book();
    Book book1 = new Book("格列佛游记");
}}

局部变量

若在成员方法内定义一个变量,那么这个变量被称为局部变量。

局部变量在方法执行时被创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误

java面向对象编程设计原则_面向对象编程基础_06

this关键字
this关键字引用的是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,就需要添加this关键字明确引用的是类成员还是局部变量或方法参数。

Static
若把共享变量或方法用static修饰就是静态变量。

类的主方法

主方法是类的入口,它指定程序从何处开始,提供对程序流向控制。

Public static void main(String[] args){

}

总结:

局部变量和全局变量

其实所有的变量都是局部变量,只是根据变量的有效范围不同而产生不同的叫法。非静态全局变量的有效范围是整个类体,当类销毁后,这些全局变量会同时销毁。静态变量的作用范围则是整个程序的生命周期,只有当程序结束之后,静态变量才会销毁。

练习:假设你是一个班的班主任,期末考试结束了,你班里总共有 5 名学生。这一学期学生们总共学习了三门课程,分别是《软件技术基础》、《程序逻辑语言 Java》和《数据库基础》。他们的期末考试成绩分别是:

java面向对象编程设计原则_java_07

请你将这些人的成绩输入电脑,并完成以下内容:
1、 计算全班的单科平均分
2、 此程序使用控制台应用程序来完成
3、 使用面向对象的方法解决问题

代码实现:
Subject类代码:

package homework5;
public class Subject {
    // 课程名称
    String name = "";
    // 对应课程成绩
    double score;
}

Student类:

package homework5;
public class Student {
    // 学号
    String ID = "";
    // 姓名
    String name = "";
    // 软件技术课程信息
    Subject softwareBasic = new Subject();
    // 程序逻辑语言Java课程信息
    Subject Java = new Subject();
    // 数据库基础课程信息
    Subject DB = new Subject();
    public Student() {
        softwareBasic.name = "软件技术基础";
        Java.name = "程序逻辑语言设计Java";
        DB.name = "数据库基础";
    }
}

Program(主函数类)

package homework5;
import  java.util.Scanner;
public class Program {
    public static void main(String[] args) {
        Student[] students = new Student[5];
        Scanner input = new Scanner(System.in);
        //循环输入学生的成绩
        for(int i=0;i<5;i++)
        {
            students[i] = new Student();
            System.out.println("请输入第"+(i+1)+"位学生的信息");
            System.out.println("学生的学号:");
            students[i].ID=input.next();
            System.out.println("学生的姓名:");
            students[i].name=input.next();
            System.out.println("软件技术基础成绩:");
            students[i].softwareBasic.score=input.nextDouble();
            System.out.println("程序逻辑语言Java成绩:");
            students[i].Java.score=input.nextDouble();
            System.out.println("数据库基础成绩:");
            students[i].DB.score=input.nextDouble();     
   	    input.nextLine(); 
            System.out.println("-------------------");
    }       
        //计算总成绩
        double sumScore1=1,sumScore2=0,sumScore3=0;
        for(int i=0;i<5;i++)
        {
            sumScore1+=students[i].softwareBasic.score;
            sumScore2+=students[i].Java.score;
            sumScore3+=students[i].DB.score;                
        }
        double avg1=sumScore1/5;
        System.out.println("【软件技术基础】平均分"+avg1);
        double avg2=sumScore2/5;
        System.out.println("【程序逻辑语言Java】平均分"+avg2);
        double avg3=sumScore3/5;
        System.out.println("【数据库基础】平均分"+avg3);
    } 
  }