第八天

面向对象

一、谈谈什么是面向对象的思维

 

二、Java中的面向对象(类和对象)

掌握面向对象的基本语法:Java最基本的单位是类

Java中有两个重要的概念,类和对象。

身高,年龄,性别,星座,血型,省份

现有数据类型不能够表示这么多信息?

解决方案:创建一个类型来表示这些信息

案例1:创建一个老师类

Public class 类名{

   数据类型 变量名;

   访问修饰符 返回值类型 方法名(参数列表){

       方法体;

   }

}

案例2:创建一个老师对象

类已经有了,但是类是抽象的概念,真正可以干活的是具体的对象,怎么具体化?

对象

创建对象的语法是什么?

类名 对象名 = new 类名();//这跟创建数组类似

对象名.属性

对象名.方法

 

三、封装及this

封装有两层含义,对功能的封装,比如就是我们的方法,方法就代表一个功能的实现;

另一层含义,是对数据的封装,比如手机的价格等等

问题:

上述案例都有共同的问题,老师的年龄或手机的价格都可以给其负数,但应该是不合理的,怎么解决这样的问题?

Java为我们提供了一种解决方案(面向对象的三大特征之一:封装

步骤:

1.属性私有化

2.对属性提供getset方法

新问题:

   名字相同的问题

   解决方案引入this关键字

案例演示:

编写标准的封装特性代码,分别解决上述的学生和手机类存在的问题

 

this访问本类的构造方法:

小结:

l this访问本类的成员属性

l this访问本类的成员方法

this访问本类的构造方法(讲到构造方法的时候,我们再来补充)

四、构造方法

什么是构造方法,当我们要创建一个对象的时候就会使用到构造方法,可以实现对象的创建及对象信息的初始化工作

构造方法的使用及细节

1.构造方法的语法格式

访问修饰符 类名(参数列表){

    方法体;

}

2.默认构造方法

3.带参的构造方法

4.默认特性,系统默认会给我们提供一个无参的构造方法

练习:采用带参的构造方法来实现对象的创建,并验证系统提供无参构造方法的机制。

 

 

五、考点:成员变量和局部变量的区别

成员变量和局部变量的区别?笔试考点

成员变量:

定义在类中,跟成员方法同级别

局部变量:

方法的参数,或者定义在方法内的变量

1),位置不同,导致作用域不同

2),生命周期不同

3),内存的位置不同(后面讲对象内存图时再讲)

4),初始值不同,局部变量默认不给初始化,需要你自己去初始化,才能使用

5),奇葩考点,成员变量和局部变量同名的情况,考优先级问题

六、作业

1.课堂案例

2.举生活案例说明面向对象和面向过程的思想区别

面向过程:面向过程的思想是把一个项目、一件事情按照一定的顺序,从头到尾一步一步地做下去,先做什么,后做什么,一直到结束。这种思想比较好理解,其实这也是一个人做事的方法。  

面向对象:面向对象的思想是把一个项目、一件事情分成更小的项目,或者说分成一个个更小的部分,每一部分负责什么方面的功能,最后再由这些部分组合而成为一个整体。这种思想比较适合多人的分工合作,就像一个大的机关,分成各个部门,每个部门分别负责某样职能,各个部门可以充分发挥自己的特色,只要符合一定前提就行了。

比如:在一个玩具工厂。

从面向过程来看,是三天生产飞机,三天生产火车,三天生产船,再过一天运去码头销往海外。

从面向对象来看,是分:生产部,监督部,销售部,采购部,包装部。

 

3.编写一个学生类,我们关注姓名,年龄,学历等信息,要求年龄必须在19-40岁之间,默认为19,学历必须是大专,本科,研究生这几个值的范围内,默认为大专。创建对象,测试其相关方法

代码如下:

public class Student1 {
		String name;
		private int age;
		private String degree;
	public void setAge(int age){
		if(age>=19||age<=40){
			this.age = age;
		}else{
			this.age = 0;
			System.out.println("默认为19");
		}
	}
	public void setDegree(String degree){
		if(!degree.equals("大专")&&!degree.equals("本科")&&!degree.equals("研究生")){
			this.degree = degree;
		}else{
			this.degree = "大专";
			System.out.println("默认为大专");
		}
	}
	public int getAge(){
		return age;
	}
	public String getDegree(){
		return degree;
	}
}



public class Student1Test {
	public static void main(String[] args){
		Student1 student = new Student1();
		student.setAge(20);
		student.name = "易建联";
		student.setDegree("本科");
		System.out.println("名字:"+student.name);
		System.out.println("学历:"+student.getDegree());
		System.out.println("年龄:"+student.getAge());
	}
}



4.封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩,封装方法,求总分,平均分,最高分,最低分,以及打印学生的信息。创建对象,测试其相关方法 

代码如下:

public class Student2 {
		private String name;
		private int age;
		private String sex;
		private int English;
		private int Chinese;
		private int Math;
	public void setAge(int age){
		this.age = age;
	}
	public void setName(String name){
		this.name = name;
}
	public void setSex(String sex){
		this.sex = sex;
}
	public void setEnglish(int English){
		this.English = English;
}
	public void setChinese(int Chinese){
		this.Chinese = Chinese;
}
	public void setMath(int Math){
		this.Math = Math;
}
	public int getAverage(){
		return (Math+English+Chinese)/3;
	}
	public int getTotal(){
		return Math+English+Chinese;
	}
	public int getMaxGrade(){
		int a = Math>English?Math:English;
		int b = Chinese>a?Chinese:a;
		return b;
	}
	public int getMinGrade(){
		int a = Math<English?Math:English;
		int b = Chinese<a?Chinese:a;
		return b;
	}
	public void showInfo(){
		System.out.println("名字:"+name);
		System.out.println("年龄:"+age);
		System.out.println("性别:"+sex);
	}
}

public class Student2Test {
	public static void main(String[] args){
		Student2 student = new Student2();
		student.setAge(20);
		student.setName("易建联");
		student.setSex("男");
		student.setEnglish(118);
		student.setChinese(103);
		student.setMath(118);
		student.showInfo();
		System.out.println("总分:"+student.getTotal());
		System.out.println("平均分:"+student.getAverage());
		System.out.println("最高分:"+student.getMaxGrade());
		System.out.println("最低分:"+student.getMinGrade());
	}
}


5.难度:编写一个随机点名系统,两个功能,一个是抽取学员回答问题,一个是记录学员被命中的次数 

本次抽中学员为:保罗

是否继续抽取学员回答问题?(y/n)

y

本次抽中学员为:韦德

是否继续抽取学员回答问题?(y/n)

y

本次抽中学员为:安东尼

是否继续抽取学员回答问题?(y/n)

y

本次抽中学员为:科比

是否继续抽取学员回答问题?(y/n)

y

本次抽中学员为:安东尼

是否继续抽取学员回答问题?(y/n)

y

本次抽中学员为:保罗

是否继续抽取学员回答问题?(y/n)

y

本次抽中学员为:安东尼

是否继续抽取学员回答问题?(y/n)

n

谢谢使用!本次学员命中信息如下:

姓名 命中次数

科比 1

詹姆斯 0

安东尼 3

保罗 2

韦德 1

Student

name+count

String[]

Student[]

代码如下:

import java.util.Scanner;
public class dianMing{
	public static void main(String[] args){
		Student3[] stu = new Student3[5];
		for(int i = 0;i<=4;i++){
			Student3 stu1 = new Student3();
			stu[i]=stu1;
		}
		stu[0].setInfo("科比");
		stu[1].setInfo("詹姆斯");
		stu[2].setInfo("安东尼");
		stu[3].setInfo("保罗");
		stu[4].setInfo("韦德");
		Scanner sc = new Scanner(System.in);
		int lucky;
		String choose;
		do{
			lucky = (int)(Math.random()*5);
			System.out.println("本次命中学员为:"+stu[lucky].name);
			stu[lucky].count++;
			System.out.println("是否继续抽取学员回答问题?(y/n)");
			choose = sc.next();
		}while(choose.equals("y"));
		System.out.println("谢谢使用!本次学员命中信息如下:");
		System.out.println("姓名	命中次数");
		for(int i = 0;i<=4;i++){
			System.out.println(stu[i].name+"	"+stu[i].count);
		}
	}
}

 
public class Student3 {
		String name;
		int count = 0;
		public void setInfo(String name){
			this.name = name;
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值