6.oop-类和对象

时间:2021-06-21 16:12:23

一.如何抽象对象
1.创建一个类
2.给该描述属性
属性就是java中所有的数据类型
3.给该类定义行为方法
方法的签名是:public void 方法名(){方法体}
公共的 无返回类型

二.如何使用类和对象
1.创建类的对象实例
Student stu = new Student();
2.访问对象的属性和方法:通过对象名.属性名或者方法名
例如:stu.name = "张三";
stu.study();

三.构造方法
1.定义:构建一个类的对象的方法
2.特点:和类名一致,没有返回类型
3.调用:通过new关键字来调用

四.带参数和返回类型的方法
1.方法的签名:访问修饰符 返回类型 方法名(形参数列表){方法体}
例如:public double calculate(double num1,double num2){}
2.返回类型:是方法执行完后返回的数据类型,在方法体中必须出现return关键字
3.return关键字除了返回数据之外还可以结束当前方法
4.在void的方法中也可以使用return关键字,但不能返回数据,只是结束方法
5.在调用带参数的方法时注意实参要和形参的个数,顺序,类型完全一致
6.调用带返回类型的方法,一般都用变量来接收返回值

五.例子

1.抽象出一个老师类,描述其属性和方法
测试类中,创建老师类对象,给其属性赋值,然后调用其方法

2.完成一个景区售票机的案例,游客如果年龄在8岁以下是全免,8-15岁是半票,15以上是成人票。
要求写一个程序完成买票过程。要求是用类和对象来实现
a.分析该案例中有哪些对象
b.完成对象的抽象(描述属性和方法)
c.编写测试类,测试数据

业务修改:除了年龄,根据性别有了新的业务需求:
1.性别为女,15岁以下 全免,60岁以上也是全免 15--60都是成人票
2。性别为男买票规则不变

3.编写一个计算器的程序,完成各项运算。完成一次运算
要求:面向对象的编程思想

4.编写一个榨汁器:根据用户输入的不同水果,榨出不同的饮料。
要求,用带返回值和参数的方法完成

package com.demo1102;
/**
* 类和对象的案例
* @author allen
*
*/
public class Demo1 {
public static void main(String[] args) {
Student stu = new Student();//创建了一个学员实例对象
//新构建出来的对象中的属性全部为默认初始值
//访问属性和方法
stu.name = "张三";
stu.age = 18;
stu.sex = "女";
stu.phone = "110"; //访问方法
stu.study();
stu.intrduce();
}
}
//一个类中可以由多个类,但是public修饰的类必须和文件名相同
class Student{
String name;
String sex;
int age;
String phone;
double height; public Student() {
//此方法为构造方法,含义是创建该类的对象时被调用
} public void study(){
System.out.println("我好好学员,天天向上");
System.out.println("偶尔抽空撸两把");
} public void intrduce(){
System.out.println("我的名字是:"+name+",我今年"+age+"岁,我的手机号码是:"+phone+",欢迎骚扰");
}
}

  

package com.demo1102;

import java.util.Scanner;
/**
* 买票案例
* @author allen
*
*/
public class Demo2 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入您的年龄:");
Guest g = new Guest();
g.age = s.nextInt(); System.out.println("请输入性别:");
g.sex = s.next();
g.ticket();
}
} class Guest{
int age;
String sex; public void ticket(){
if("男".equals(sex)){
if(age<8){
System.out.println("全免");
}else if(age>=8&&age<15){
System.out.println("半票");
}else if(age>=15){
System.out.println("成人票");
}
}else if("女".equals(sex)){
if(age<=15){
System.out.println("全免");
}else if(age>15&&age<=60){
System.out.println("成人票");
}else if(age>60){
System.out.println("全免");
}
}else{
System.out.println("你可以上天了");
} }
}

  

package com.demo1102;

import java.util.Scanner;

import javax.security.sasl.SaslClient;
/**
* 计算器案例
* @author allen
*
*/
public class Calculate {
double num1;
double num2;
String type;
double result; public void count(){
switch(type){
case "+":
result = num1+num2;
break;
case "-":
result = num1-num2;
break;
case "*":
result = num1*num2;
break;
case "/":
result = num1/num2;
break;
case "%":
result = num1%num2;
break;
}
System.out.println("result="+result);
} public void test(){
int a=1;
if(a!=1){
return;//return在此处的作用就是结束当前方法
}
System.out.println("程序结束");
} public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Calculate c = new Calculate();
System.out.println("请输入第一个数:");
c.num1 = sc.nextDouble();
System.out.println("请输入运算符号:");
c.type = sc.next();
System.out.println("请输入第二个数:");
c.num2 = sc.nextDouble(); c.count();
}
}
package com.demo1102;

import java.util.Scanner;

/**
* 榨汁器案例
* @author allen
*
*/
public class Demo4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要榨汁的水果:");
String shuiguo = sc.next(); Juicer j = new Juicer();
String result = j.juicing(shuiguo);
System.out.println("您炸的"+result+"已经好了");
}
} class Juicer{
public String juicing(String fruit){
System.out.println("正在榨汁.....");
try {
Thread.sleep(5000);//模拟一个5秒的等待过程
} catch (InterruptedException e) {
e.printStackTrace();
}
return fruit+"汁";
}
}

 

/*
* 3.编写一个计算器的程序,完成各项运算。
要求:面向对象的编程思想
*/
package com.class1102; import java.util.Scanner; public class Class03 { public static void main(String[] args) {
// TODO Auto-generated method stub Scanner sc=new Scanner(System.in);
Operate o=new Operate();
System.out.println("请输入第一个数");
o.a=sc.nextDouble();
System.out.println("请输入第二个数");
o.b=sc.nextDouble();
System.out.println("请输入操作符");
o.sign=sc.next();
o.js();
} } class Operate{
double a,b,result;
String sign; public Operate(){ } public void js(){
if(sign.equals("+"))
{
result=a+b;
}else if(sign.equals("-"))
{
result=a-b;
}else if(sign.equals("*"))
{
result=a*b;
}else if(sign.equals("/"))
{
result=a/b;
}
System.out.println("计算结果为:"+result);
}
}
/*
* 1.写一个类描述笔记本电脑:
属性有:品牌,重量,cpu型号,内存大小,硬盘大小,显卡型号
方法有:显示笔记本基本信息 showInfo()
编写测试类:给笔记本对象属性赋值,调用显示笔记本基本信息方法展示给客户
*/
package com.class1102; import java.util.Scanner; public class Test1 { public static void main(String[] args) {
// TODO Auto-generated method stub Notebook nt=new Notebook();
nt.sign="宏碁(acer)";
nt.weight=1.3;
nt.cpu="N3450";
nt.memory=4;
nt.hdisk=128;
nt.dcard="集成显卡";
nt.showInfo();
} } class Notebook{
String sign;
double weight;
String cpu;
int memory;
int hdisk;
String dcard;
public void showInfo()
{
System.out.println("该笔记本品牌是:"+sign+",");
System.out.println("该笔记本重量是:"+weight+"kg,");
System.out.println("该笔记本cpu型号是:"+cpu+",");
System.out.println("该笔记本内存大小是:"+memory+"G,");
System.out.println("该笔记本硬盘大小是:"+hdisk+"G,");
System.out.println("该笔记本显卡型号是:"+dcard+",");
} }

  

/*
* 2.写一个个人所得税计算器,用户输入税前工资,计算得到税后工资
要求用带参数和返回类型的方法
规则:个税起征点为3500
超过部分 税点
1500以内 5%
1500-3000 10%
3000-5000 15%
5000-8000 20%
8000以上 25%
*/
package com.class1102; import java.util.Scanner; public class Test2 { public static void main(String[] args) {
// TODO Auto-generated method stub Scanner sc=new Scanner(System.in);
TaxCalculator tc=new TaxCalculator();
System.out.println("请输入税前工资");
tc.count(sc.nextDouble());
} } class TaxCalculator{
public double count(double i)
{
double result=0;
if(i<=3500)
{
result=i;
}else if(i>3500&&i<5000)
{
result=3500+(i-3500)*(1-0.05);
}else if(i>=5000&&i<6500)
{
result=3500+1500*(1-0.05)+(i-5000)*(1-0.1);
}else if(i>=6500&&i<8500)
{
result=3500+1500*(1-0.05)+1500*(1-0.1)+(i-6500)*(1-0.15);
}else if(i>=8500&&i<11500)
{
result=3500+1500*(1-0.05)+1500*(1-0.1)+2000*(1-0.15)+(i-8500)*(1-0.2);
}else{
result=3500+1500*(1-0.05)+1500*(1-0.1)+2000*(1-0.15)+3000*(1-0.2)+(i-11500)*(1-0.25);
}
System.out.println("税后工资为:"+result);
return result;
} }

  

/*
* 3.完成一个自动摇奖机
摇奖机可以由工作人员设置奖品,然后随机抽奖
思路:
设计一个摇奖机类
属性:是一个奖品数组
方法:
方法一 :设置奖品方法
方法二:随机抽出奖品
测试类:
第一步工作人员设置奖品,第二步,工作人员完成抽奖
*/
package com.class1102; import java.util.Random;
import java.util.Scanner; public class Test3 { public static void main(String[] args) {
// TODO Auto-generated method stub Scanner sc=new Scanner(System.in);
Random r=new Random(); Ernie e=new Ernie();
String s[]=new String[7];
for(int j=0;j<e.prize.length;j++)
{
System.out.println("请输入第"+j+"个奖品");
s[j]=sc.nextLine();
}
e.setErnie(s); System.out.println("开始抽奖");
String j=e.getERnie(r.nextInt(8));
System.out.println("奖品是"+j); } } class Ernie{
String prize[]=new String[7];;
public void setErnie(String s[])
{
for(int i=0;i<prize.length;i++)
{
prize[i]=s[i];
}
}
public String getERnie(int t)
{
String p=null;
for(int i=0;i<prize.length;i++)
{
if(t==i)
{
p=prize[i];
}
}
return p;
} }

  

六.小游戏  

/*
* 1.猜数字游戏:
系统会自动生成0-9的不重复的4个数字 例如:8350
用户有8次机会来猜这些数字的,不仅要数字正确,顺序也要正确才为答对
每次用户都是输入4个数字,系统给出相应的提示:
提示规则:数字和位置正确的提示A 数字正确但位置不正确的提示B
例如:用户输入1234 系统提示:0A1B
用户第二次:5678 系统提示:0A2B
用户第三次:0912 系统提示:0A1B
用户第四次:1203 系统提示:0A2B
用户第五次:3051 系统提示:1A2B
用户第六次:
Random r = new Random();
r.nextInt(10);0-9
*/
package com.class1101; import java.util.Random;
import java.util.Scanner; public class Class01 { public static void main(String[] args) {
// TODO Auto-generated method stub int arr[]=new int[4];
Random r=new Random(); for(int i=0;i<arr.length;i++)
{
arr[i]=r.nextInt(10);
for(int j=0;j<i;j++)
{
while(arr[i]==arr[j])
{
arr[i]=r.nextInt(10);
}
}
//System.out.print(arr[i]+" ");
} Scanner sc=new Scanner(System.in);
int num;
int arr2[]=new int[4];
for(int i=1;i<9;i++)
{
System.out.print("请输入第"+i+"个数:");
num=sc.nextInt();
arr2[0]=num/1000;
arr2[1]=(num%1000)/100;
arr2[2]=(num%1000)%100/10;
arr2[3]=(num%1000)%100%10;
int a=0;
int b=0;
for(int j=0;j<arr2.length;j++)
{
//System.out.print(arr2[j]+" ");
if(arr2[j]==arr[j])
{
a++;
}else{
for(int k=0;k<arr.length;k++)
{
if(arr2[j]==arr[k])
{
b++;
}
}
}
}
if(a==4)
{
System.out.println("恭喜猜中数字");
break;
}else
{
System.out.println("提示:"+a+"A"+b+"B");
}
} } }

  

/*
* 2.穿越火线
用二维数组生成一个15*15的地图,全部用方块表示□
随机生成用户位置用三角形△表示,随机生成目的位置用五角星☆表示,在地图上随机生成20个地雷用户不可见。
用户选择上下左右移动位置,每次移动一格,移动后要显示用户走过的路程用○表示。踩上地雷身亡,顺利到达目标则为胜利!
*/
package com.class1101; import java.util.Random;
import java.util.Scanner; public class Class02 { public static void main(String[] args) {
// TODO Auto-generated method stub Scanner sc=new Scanner(System.in);
char arr[][]=new char[15][15];
Random r=new Random(); //1、随机生成起点和终点的坐标,并使两点不重复
int r1=r.nextInt(arr.length);
int r2=r.nextInt(arr[0].length);
int s1=r.nextInt(arr.length);
int s2=r.nextInt(arr[0].length);
while(r1==s1&&r2==s2)
{
r1=r.nextInt(arr.length);
} //2、生产20个地雷的坐标,并使其本身不重复,和起点、终点也不重复
int d1[]=new int[20];
int d2[]=new int[20];
for(int i=0;i<d1.length;i++)
{
d1[i]=r.nextInt(arr.length);
d2[i]=r.nextInt(arr.length);
for(int j=0;j<i;j++)
{
while(d1[i]==d1[j]&&d2[i]==d2[j]||d1[i]==r1&&d2[i]==r2||d1[i]==s1&&d2[i]==s2)
{
d1[i]=r.nextInt(arr.length);
d2[i]=r.nextInt(arr.length);
}
}
} int t1[]=new int[arr.length];
int t2[]=new int[arr.length];
int t3=0;
//int t1=-1,t2=-1;
while(true)
{
//3.通过键盘输入移动用户位置
String key=sc.nextLine();
if(key.equals("w")){
if(r1>0)
{
r1--;
}
}else if(key.equals("s"))
{
if(r1<arr.length-1)
{
r1++;
}
}else if(key.equals("a"))
{
if(r2>0)
{
r2--;
}
}else if(key.equals("d"))
{
if(r2<arr.length-1)
{
r2++;
}
} //4.判断用户是否踩到地雷,如果踩到,游戏失败。
boolean b=false;
for(int i=0;i<d1.length;i++)
{
if(r1==d1[i]&&r2==d2[i])
{
b=true;
System.out.println("踩到地雷,游戏失败");
break;
}
}
if(b)
{break;} //5.输出游戏界面
int i,j=0;
for(i=0;i<arr.length;i++)
{
for(j=0;j<arr[i].length;j++)
{
if(i==r1&&j==r2)
{
arr[i][j]='△';
}else if(i==s1&&j==s2){
arr[i][j]='☆';
}else{
arr[i][j]='□';
for(int k=0;k<t3;k++ )
{
arr[t1[k]][t2[k]]='○';
} /*if(i==t1&&j==t2)
{
arr[i][j]='○';
}else{
arr[i][j]='□';
}*/
}
System.out.print(arr[i][j]+"\t"); }
System.out.println();
}
t1[t3]=r1;
t2[t3]=r2;
t3++;
//t1=r1;
//t2=r2; //6.当用户成功到达终点时,游戏胜利。
if(r1==s1&&r2==s2){
System.out.println("胜利!");
break;
}
} } }