实验三 类与类的特性实验日期: 学号: 姓名: 一、实验目的1、掌握定义类、创建对象以及方法参数传递的语法;2、学会类的构造方法、类中方 法的重载、类的静态成员的定义和使用;3、理解类的封装、继承与多态,并掌握如何在实际编程中应用。二、实验内容完成如下任务或编写能够满 足如下条件的程序:调试教材对应章节的例题,确保自己可以做出每一道题。2、完成如下任务或编写能够满足如下条件的程序:(1)(实验目的 :学习类的一般结构与类的定义;学习类的成员变量和成员方法的声明格式。)在程序中定义一个Student类,并且按照要求补全Java程 序代码。(2)(实验目的:学习创建对象,调用对象的成员变量与成员方法。)编写一个程序,在程序中创建(1)题目中Student类的两 个实例,并访问它们的属性和方法,并输出如下结果。(3)(实验目的:学习方法调用时参数的传递)在第(2)题的基础上为Student类 增加一个方法,该方法能够接收参数并对Student类中的各个属性进行赋值。编写一个程序,通过调用新定义的方法完成类成员的赋值。St udent类增加的方法为://将参数n、a、c、m、e赋值给属性name、age、chinese、math、english(4)定 义一个Student类,包含如下内容:成员变量:学号、姓名、性别、数学、语文、外语成员方法:输入(完成成员变量的输入),总分,平均 分编程实现Student类,并通过public类中的main()调试,完成数据的输入(读入字符串时用next())和输出。代码截图 :运行结果截图:(5)在类SumNum中定义方法colnum,以m行n列二维数组为参数,分别计算二维数组各列元素之和,并能返回;在 主类中通过main方法调试,并输出所计算的结果。代码截图:运行结果截图:(6)(实验目的:学习类的构造方法的作用和执行过程)编写一 个Java应用程序,在程序中定义一个Student类,Student类有三个构造方法,分别对不同的属性进行初始化。class St udent{String name;int age;public Student() {System.out.println("S tudent()构造方法被调用");}//定义一个Student类构造方法,该方法接收一个字符串参数,在方法体中,把该参数赋给na me属性,并显示“Student(String newName)构造方法被调用”public Student(String new Name) {this.name=name;System.out.println("Student(String newName) 构造方法被调用");}//定义一个Student类构造方法,该方法接收一个字符串参数与一个整形参数,在方法体中,把该字符串参数赋值 给name属性,把整形参数赋值给age属性,并且显示"Student(String newName,int newAge)构造方法 被调用"public Student(String newName,int newAge) {this.name=name;thi s.age=age;System.out.println("String newName,int newAge)构造方法被调用") ;}}public class Hw7_2 {public static void main(String[] args) { / /创建Student类的一个对象s1,不传入参数 Student s1=new Student(); //创建Student类的一 个对象s2,传入一个参数“张三”Student s2=new Student("张三"); //创建Student类的一个对象s3 ,传入两个参数“李四”和15Student s3=new Student("李四",15); }}(7)(实验目的:学习类的构造方 法之间的调用,及关键字this的使用)编写一个Java应用程序,在程序中定义一个Employee类。Employee类有四个构造方 法,分别对不同的属性进行初始化,有一个setAge()方法能设置age属性值,有一个getAge()方法能返回age属性值。cla ss Employee{private String name;private int age;private double sa lary;public Employee(String newName,int newAge,double newSalary) {//要求调用两个参数的构造方法,传入参数newAge和newSalarythis.age=newAge;this.salary= newSalary;System.out.println("三个参数的构造方法被调用");name=newName;}public Employee(int newAge,double newSalary) {//要求调用一个参数的构造方法,传入参数newSa larythis.salary=newSalary; System.out.println("两个参数的构造方法被调用");age =newAge;}public Employee(double newSalary) {//要求调用没有参数的构造方法this.g etAge; System.out.println("一个参数的构造方法被调用");}public Employee() {Sys tem.out.println("没有参数的构造方法被调用"); }void setAge(int newAge) {//设置ag e属性的值为newAgethis.age=newAge; }int getAge() {return this.age; }}pu blic class Hw7_3 {public static void main(String[] args) {Employe e s1=new Employee("李四",30,8000);System.out.println("年龄是"+s1.getAg e());s1.setAge(31);System.out.println("年龄是"+s1.getAge());}}思考:如果要 求输出对象的完整信息,应用如何编写代码?(8)(实验目的:掌握类的静态成员和非静态成员的使用)编写一个程序,在程序中定义一个Ca类 。Ca类中有静态成员和非静态成员,再定义一个Cb类,在Cb类中创建Ca类的对象。class Ca{int a;static int b; //定义一个静态整型属性bpublic static void m1() {Ca s1=new Ca();//把属性a赋值 为100s1.a=100; b=100; //把属性b赋值为100,思考属性a和属性b的赋值方式为什么不同?}public voi d m2() {a=50;b=50;}public static void m3() {m1(); //调用m1方法Ca s1=n ew Ca(); //调用m2方法,思考m1、m2方法的调用为什么不同?s1.m2() ; }}class Hw7_4 {publ ic static void main(String[] args) {Ca s1=new Ca();Ca s2=new Ca() ;Ca.b=2;s1.a=3;s1.b=3;s2.a=4;s2.b=4;s1.m3();System.out.println("C a.b="+Ca.b) ; //显示Ca.b的值System.out.println(s1.a+s1.b) ; //显示s1的a、 b值System.out.println(s2.a+s2.b); //显示s2的a、b值}}(9)(实验目的:学习类的私有成员和公 共成员的定义,以及类的私用成员的访问方法)在程序中定义一个Person类,其中age属性是一个私有属性,并且范围为5-20。然后根 据所赋值年龄输出个人信息或报错。class Person{String name;private int age; //定义一个私 有整数属性agepublic boolean setAge(int newAge) {//如果newAge在[5,20]之间,将n ewAge赋值给age并返回true;否则,返回falseif ( newAge>=5&&newAge<=20) {age=new Age; return true; } else return false;}public int getAge(){//返回ag e属性return age; }}public class Exe7_1 {public static void main(Str ing[] args) {Person s1=new Person();Scanner in=new Scanner(System .in);System.out.print("请输入姓名:");s1.name=in.next();//输入年龄并赋给s1,如果成 功,显示s1的姓名和年龄;否则,显示“年龄错误”System.out.print("请输入年龄:");if(s1.setAge(i n.nextInt()))System.out.println("姓名"+s1.name+","+"年龄"+s1.getAge() ); elseSystem.out.println("年龄错误"); }}(10)(实验目的:类的继承的语法)编写一个java程序 ,在程序中定义一个PersonA类,定义一个PersonA类的子类StudentA类,并在主类E1的main()方法中生成Stud entA类的对象。class PersonA{private String name;public void setName(St ring newName) {name=newName;}public String getName() {return name ;}}class StudentA extends PersonA{ //继承PersonA类private String dep artment; // department成员变量的set、get方法public void setdepartment(Str ing newdpartment) {department=newdpartment;}public String getdepa rtment() {return department;}}public class E1 {public static void main(String[] args) {StudentA s1=new StudentA(); s1.setName("张三" ); //调用setName方法,传入参数“张三”s1.setdepartment("计算机系");//设置s1的departme nt为“计算机系” System.out.println(s1.getName()) ; //显示s1的姓名System.out. println(s1.getdepartment()) ; //显示s1的系别}}(11)(实验目的:掌握父类子类构造方法的继承关 系,及调用方法)编写一个java程序,在程序中定义一个PersonB类,定义一个PersonB类的子类StudentB类,再定义一 个E2类,在main()方法中生成StudentB类的对象。/PersonB类包含name和age两个成员变量,权限为默认;包含 无参构造方法和有参构造方法(完成name的赋值);包含introduce方法完成“我是,今年岁”的自我介绍。/class PersonB{String name;int age;public PersonB() {System.out.println( "PersonB()被调用");}public PersonB(String newName) {name=newName;Sys tem.out.println("PersonB(String newName)被调用");}public void introd uce() {System.out.println("我是"+name+",今年"+age+"岁");}}class Studen tB extends PersonB{//创建StudentB类的无参构造方法,能输出“StudentB()被调用”public StudentB() {System.out.println("StudentB()被调用");}public StudentB( String newName,int newAge) {//调用父类的有参构造方法,传入newName参数super (newNa me); //将newAge赋值给age属性age=newAge; }}public class E2 {public stati c void main(String[] args) {// 创建无参学生对象s1,创建有参学生对象s2,并完成两个学生的自我介绍 StudentB s1=new StudentB();StudentB s2=new StudentB("李四",20);s2.i ntroduce();}}(12)(实验目的:学习类继承时方法的覆盖)编写一个Java程序,在程序中定义一个Animal类,再定义 两个Animal类的子类Bird、Fish类,在子类中覆盖父类的play()方法。class Animal{void play() {System.out.println("我是动物,我会很多本领");}}//定义Animal类的子类Bird,覆盖Animal 类的play()方法,并在play()方法中输出“我是小鸟,我能飞翔”class Bird extends Animal{void play() {System.out.println("我是小鸟,我能飞翔");}}class Fish extends Ani mal{void play() {System.out.println("我是小鱼,我能游泳");}}public class E 3 {public static void main(String[] args) {Animal s1=new Animal() ;Bird s2=new Bird();Fish s3=new Fish();s1.play();s2.play();s3.pla y();}}(13)(实验目的:编写程序,练习Java中的多态)编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音 ,可以弹奏的乐器包括二胡、钢琴和琵琶。实现思路:1)定义乐器类Instrument,包括方法makeSound()2)定义乐器类的子类:二胡Erhu和钢琴Piano3)定义乐手类Musician,可以弹奏各种乐器play(Instrument i)4)定义测试类,给乐手不同的乐器让他弹奏代码截图:运行结果截图:(14)按要求完成应用程序1)定义一个点Point类,它包含横坐标x和纵坐标y两个私有属性,包含一个无参构造方法和一个有参构造方法。2)定义一个圆Circle类,它包含圆心center(类型为Point类)和半径radius两个私有属性,包含一个有参构造方法,完成圆的参数设置;一个area()方法返回圆的面积;一个show()方法完成圆心、半径及面积的输出。3)定义CircleTest测试类,要求通过键盘输入圆心和半径。代码截图:(15)声明并测试一个复数类,其方法包括输出toString()及复数的加、减、乘运算。执行结果如下: 三、在本次实验中的问题和解决方法四、心得体会 |
|