前言介绍
- 为方便今后的学习和撰写,从今日起,本人开始先以JAVA作为首要学习探讨路线来写作,希望大家能够相互指正。
- 本篇主要从面向对象开始讲解,前面的编译环境、程序调试、基本语法基础请参考前文。
- 要想对现实世界的对象进行建模操作,我们就要弄清楚事物的属性与行为,所以,接下来我们便开始面向对象的学习。
面向对象的概述
像我们学习的C语言,就是一种面向过程的语言,而类似C++、JAVA的就是面向对象的语言。面向过程和面向对象都是对软件分析、设计和开发的一种思想,指导人们去分析、设计和开发软件。
面向过程的思想注重按照步骤实现,并对应成方法,一步一步最终完成。
面向过程适合比较简单的任务和不需要协作的任务,但当我们思考比较复杂的任务的时候就不够用了,所以我们就需要引入面向对象的思想。
对象与类
对象是事物存在的实体,通常将其分为静态部分和动态部分。而类实质上就是封装对象属性和行为的载体,对象是人类抽象出来的,反过来说具有相同属性和行为的一类实体被称为类。
设计特点
面向对象程序设计的三大特征:
- 封装性;
- 继承性;
- 多态性;
类的定义
类的定义方式
- 简例:
public class Car{
//每一个源文件有且仅有一个public class,并且类名与文件名保持一致
}
class Tyre{
//一个Java文件可以同时定义多个class
}
class Engine{
}
class Seat{
}
class Window{
}
上述的类定义好了之后是没有任何其他信息的,一般来说类有三种常见的成员:属性field、方法method、构造器constructer,这些成员皆可以定义0个或多个。
- 简单学生类编写:
public class Student{
//属性(成员变量)
int id;
String name;
int age;
//方法
void study(){
System.out.println("好好学习专业知识!");
}
//构造方法
Student(){
}
}
以上是一个思想,可以根据类的模板去创建相应的对象。
成员变量(属性field)
属性是用来定义该类对象包含的数据或者说是静态变量,作用范围覆盖整个类体。
- 属性定义格式:
【修饰符】属性类型 属性名 =【默认值】;
权限修饰符
JAVA中的权限修饰符主要包括private、public和protected,控制着对类和类的成员变量以及成员方法的访问。
其修饰符的修饰权限见下表:
方法(method)
方法用于定义该类或类实例行为特征和功能的实现。类似于面向过程中的函数,整个程序由一个个函数调用组成的,方法从属于类和对象。
- 方法定义格式:
【权限修饰符】 方法返回值类型 方法名(参数类型 参数名){
...... //方法体
return 返回值;
}
- 学生(电脑学习)类程序完善:
public class WTCLABstudent{
//属性(fields)
int id;
String name;
int age;
Computer comp;//调用计算机
//方法
void study(){ //定义study方法
System.out.println("白天在实验室学习!使用电脑:"+comp.brand);
}
void rest(){ //定义无参数的rest方法
System.out.println("我每天早睡早起!");
}
//构造方法。用于创建类的对象,无参的构造方法可以由系统自动创建。
WTCLABstudent(){
}
//程序执行的入口,必须要有
public static void main(String[] args){
WTCLABstudent stu =new WTCLABstudent();//创建一个WTCLABstudent对象
stu.id=630; //给对象的公有字段直接赋值
stu.name="王昭"; //给对象的公有字段直接赋值
stu.age=22; //给对象的公有字段直接赋值
Computer c1 = new Computer(); //调用类的无参构造函数
c1.brand ="联想"; //定义有参study方法的参数
stu.comp=c1;
stu.rest(); //调用对象的无参方法
stu.study(); //调用对象的无参方法
}
}
class Computer{
String brand; //电脑品牌
}
- 结果:
在成员方法中定义一个变量,这个变量被称为局部变量。如上面的int id
。局部变量使用时必须进行赋值操作或者被初始化,它的有效范围从该变量的声明到该变量的结束为止。
工程训练
任务要求:
- 完成一个java application 应用程序,描述一个人类。要求如下:
- 要求此人类必须包含有人的姓名、性别、出生日期等基本属性(变量)。
- 要求此人类描述吃饭的方法(函数)和描述睡觉的方法(函数)。例如睡觉方法的执行体为一个 System.out.println() 函数,此函数输出一段例如“ xx(姓名)往床上躺倒,不久就睡着了……”之类的描述睡觉的文本。
- 要求此人类的构造函数要具有无参数的构造函数,以及带有姓名、性别、出生日期等参数的构造函数,并在构造函数中输出一段描述xx(姓名)出生的文本。
- 实例化出张三和李四两个人类对象(变量),并为之赋初值。
- 调用张三、李四等人类对象的各种属性(类成员变量)和方法(函数)。
- 在上述人类的基础上派生一个继承自人类的新的学生类,加入学号等学生特有的属性,加入上课、考试等方法,并实例化一个或几个学生类对象,完成这些学生类对象的各种属性和方法的调用。
- 以上定义中,各种类的属性、方法等鼓励标新立异,尽量达到可以描述真实的人类和学生等。
实现代码:
class Humanity //创建Humanity对象
{
public String name; //声明公有字段name,此时name为类的属性,下面通过公有方法进行访问
public String sex; //声明性别变量sex
public int age; //声明公共字段age
public int id; //声明人物学号变量
public String birth; //声明人物生日变量
public String getName() //返回对象的信息描述
{
return name;
}
public void setName(String name) { //设置名称
this.name = name;
}
public void eat() //定义无参数的eat方法
{
System.out.println("他是个纯南方人,特别爱吃米饭");
}
public void eat(String s) //定义带参数的eat方法,实现方法重载
{
System.out.println("他是一个地道的北方人,非常喜欢吃"+s);
}
public void sleep() { //定义无参数的sleep方法
System.out.println("张三偶尔熬夜,晚上思考能力很发达,所以睡眠时间不太好。");
}
public void sleep(String t) { //定义带参数的sleep方法,实现方法重载
System.out.println("李四有良好的休息习惯,只要往"+t+"躺倒,不久就会睡着了……");
}
public void study() //定义无参数的study方法
{
System.out.println("他要求学生每天好好学习,按时上课");
}
public void study(String r) //定义带参数的study方法,实现方法重载
{
System.out.println("还建议学生在空闲时间多看"+r);
}
public void exam() //定义无参数的exam方法
{
System.out.println("无论任何考试,都要做一个诚信的人!");
}
public void exam(String q) //定义带参数的exam方法,实现方法重载
{
System.out.println("考试检测方面,不允许使用"+q+"作弊");
}
public Humanity() //定义无参构造函数,注意无返回值定义,方法与类同名
{
}
public Humanity(int age,int id,String sex,String name,String birth)
{ //重写一个带参数构造函数,注意无返回值定义,方法与类同名
this.age = age; //前一个age为对象的字段,由this指定,后一个age为函数形参
this.id = id; //前一个id为对象的字段,由this指定,后一个age为函数形参
this.sex = sex; //前一个sex为对象的字段,由this指定,后一个age为函数形参
this.name = name; //前一个name为对象的属性,由this指定,因为在本类中可直接访问,后一个name为函数形参
this.birth = birth; //前一个birth为对象的字段,由this指定,后一个birth为函数形参
}
//public Humanity(int age,int id,String sex,String name) //定义无参构造函数,注意无返回值定义,方法与类同名
//{
//this.age = age; //前一个age为对象的字段,由this指定,后一个age为函数形参
//this.id = id;
//this.sex = sex;
//this.name = name;
//}
}
public class Example1
{
public static void main(String[] args) //主方法调用
{
Humanity Humanity1 = new Humanity(); //调用类的无参构造函数
Humanity1.age = 22; //给对象的公有字段直接赋值
Humanity1.id =201801234; //给对象的公有字段直接赋值
Humanity1.setName("张三"); //给对象的公有字段直接赋值
Humanity1.sex = "男" ; //给对象的公有字段直接赋值
Humanity1.birth = "1996年5月8日" ; //必须使用公共方法才能给对象的属性赋值
System.out.println("从前有个"+Humanity1.sex+"生叫"+Humanity1.getName()+",他出生于"+ Humanity1.birth+",今年"+Humanity1.age+ "岁,学号是"+Humanity1.id);
Humanity1.eat(); //调用对象的无参方法
Humanity1.sleep(); //调用对象的无参方法
System.out.println("\n"); //空行
Humanity Humanity2 = new Humanity(23,201804321,"男","李四","1995年6月9日");//调用类的有参构造函数
System.out.println("他有个"+Humanity2.sex+"同学叫" + Humanity2.getName() + ",学号为"+Humanity2.id + ",今年" + Humanity2.age+ "岁了,生日是"+Humanity2.birth);
Humanity2.eat("馒头"); //调用对象的有参方法
Humanity2.sleep("床上"); //调用对象的有参方法
System.out.println("\n"); //空行
Humanity Humanity3 = new Humanity();//(35,200906789,"男","杜");
Humanity3.age = 35; //给对象的公有字段直接赋值
Humanity3.id =200906789; //给对象的公有字段直接赋值
Humanity3.setName("杜"); //给对象的公有字段直接赋值
Humanity3.sex = "男" ; //给对象的公有字段直接赋值
System.out.println("他俩有一位"+Humanity3.sex+"导师,叫"+Humanity3.getName()+"老师,学工号:"+ Humanity3.id);
//System.out.println(Humanity3.getName());
Humanity3.study(); //调用对象的无参方法
Humanity3.study("科技类文章"); //调用对象的有参方法
Humanity3.exam("通讯设备"); //调用对象的有参方法
Humanity3.exam(); //调用对象的无参方法
//System.out.println();
}
}
效果:
在这里我也说说自己的想法吧,有时候写博客或者说学习,我本人是个学习时会专注,打断后就会短片的那种人。但是我觉得每个人的兴趣非常重要,它有时候会改变你,会成就你。
有的时候写东西,我会慢慢想着发展一下,真的好有意思,很开心,写一篇博客没写完就不舍得发。也希望大家多多讨论思考,大家一起学习一起“玩”。
后续将会继续更新有关java的学习博客,希望大家共同学习共同指正,兴趣是最好的老师!