面向对象概述
对象
是一个抽象概念,英文“Object”。通常将对象划分为“静态部分”和“动态部分”。静态部分称为对象的“属性
”;动态部分称为对象的“行为
”,即对象执行的动作。
类
是封装对象的属性和行为的载体,也就是具有相同属性和行为的一类实体被称为类
。类包括对象的属性和方法。类中对象的属性是以成员变量的形式定义的,对象的行为是以方法的形式定义的。
面向对象程序设计的特点
面向对象程序设计具有以下特点:
封装性、继承性 多态性
1、 封装
封装是面向对象编程的核心思想。通过类为载体,将对象的属性和行为封装起来,类通常会对客户隐藏实现细节。采用封装思想保证了类内部数据结构的完整性
,使用该类的用户不能轻易的操作此数据结构,只能操作公开部分。这样就避免了外部操作对数据产生影响,提高程序的可维护性。
2、 继承
继承实现重复利用的重要手段,子类通过继承,复用父类属性和行为的同时有添加了子类特有的属性行为。但需要注意的是:子类的实例都是父类的实例,但不能说父类的实例是子类的实例。
3、 多态多态指将父类的对象应用于子类的特征。即一个父类衍生出不同的子类,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这便是多态的结构
类与对象
类的定义,通过关键字class
。
语法:
class 类名{
//类的成员变量
//类的成员方法
}
成员变量
Java中对象的属性。
语法:数据类型 变量名称 [= 值];
[= 值]表示可选内容,定义变量是可以为其赋值,也可以为其不赋值
Java常见类型的默认值
例:
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("格列佛游记");
}}
局部变量
若在成员方法内定义一个变量,那么这个变量被称为局部变量。
局部变量在方法执行时被创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误
this关键字
this关键字引用的是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,就需要添加this关键字明确引用的是类成员还是局部变量或方法参数。
Static
若把共享变量或方法用static修饰就是静态变量。
类的主方法
主方法是类的入口,它指定程序从何处开始,提供对程序流向控制。
Public static void main(String[] args){
}
总结:
局部变量和全局变量
其实所有的变量都是局部变量,只是根据变量的有效范围不同而产生不同的叫法。非静态全局变量的有效范围是整个类体,当类销毁后,这些全局变量会同时销毁。静态变量的作用范围则是整个程序的生命周期,只有当程序结束之后,静态变量才会销毁。
练习:假设你是一个班的班主任,期末考试结束了,你班里总共有 5 名学生。这一学期学生们总共学习了三门课程,分别是《软件技术基础》、《程序逻辑语言 Java》和《数据库基础》。他们的期末考试成绩分别是:
请你将这些人的成绩输入电脑,并完成以下内容:
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);
}
}