实验2 Java面向对象初步

1.实验目的

1)进一步熟悉Java语法特征
2)初步掌握Java面向对象特征
3)了解包的使用
4)Java编程实现简单功能

2.实验内容

1)下面的程序有错误请修改并编译运行。

写两个java文件,分别定义如下类A,B,改正错误,编译运行。

package  my.abc;
class A {
	public int x;
	public void print() { //自主填上执行内容}
}

package my.xyz;
import abc.A;
class B {
	public static void main(String[]args) {
		A a = new A();
		a.x = 100;
		a.print();
	}
}} 

2)定义一个表示学生的类student,包括的成员变量有学号、姓名、性别、年龄,包括的成员方法有获得学号、姓名、性别、年龄和修改年龄。书写Java程序创建student类的对象及测试其方法。

----------------------------------

3)扩充修改2的程序,为student类定义构造方法初始化所有的成员,增加一个方法public String printInfo(),该方法将student类对象的所有成员信息组合形成一个字符串并输出,在主类中创建student类的对象及测试其方法。

----------------------------------

4)阅读下面的程序

import java.io.*;
class A
{
    void callme()
  {
    System.out.println("调用A的callme()的方法”)
  }
}
class B extends A
{ 
   void callme()
  {
   System.out.println("调用B的callme()的方法”)
  }
}
public class Ex
{
   public static void main(String args[])
  { 
     A a=new B();
     a.callme();
  }
}
A a=new B();a.callme();a调用的是A的方法还是B的方法呢?为什么?编译运行验证之。

5)抽象并定义一个动物类(Animal)(抽象类),它包含动物的基本属性,例如名称(name)、年龄(age)、重量(weight)等,并设计相应的动作(用 抽象方法,如abstract void GetArea(); 或空方法,void GetArea(){}),例如跑(run)、跳(jump)、走(walk) 、吃(eat)等。再定义一个猫(Cat)类和一个狗类(Dog),继承动物类(Animal),改写父类eat方法和run方法。再定义一个白猫(whileCat),继承猫类,改写父类的eat方法。(方法体里只需用输出语句输出相应信息即可,编写主类测试这些定?编译运行验证之。
-----------------------------------

6)编写java程序,求13的13次方的最后三位数。(研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。)
-----------------------------------

3.实验分析、代码及运行结果

1)
    
    package  my.abc;
    public class A {
    	public int x;
    	public void print() {System.out.println(x);}
    }
    
    package my.xyz;
    import my.abc.A;
    
    class B {
    	public static void main(String[] args) {
    		A a = new A();
    		a.x = 100;
    		a.print();
    	}
    }

运行结果:

在这里插入图片描述

分析: A类在my.abc包下,导入时import my.abc.A即可;A类和B类未在一个包下,
默认访问权限为default,需要加public修饰符

2)

package cn.whb.work2;

public class student {
	private long id;
	private String name;
	private boolean gender;
	private int age;
	public static void main(String[] args) {
		student st = new student(1001,"张三",true,18);
		System.out.println(st.getGender());
		st.setGender("女");
		System.out.println(st.getGender());
	}
	
	student(){
		
	}
	// 构造方法
	student(long id,String name,boolean gender,int age){
		this.id = id;
		this.name = name;
		this.gender = gender;
		this.age = age;
	}
	
	// 获得学号
	public long getId() {
		return id;
	}
	
	// 设置学号
	public void setId(long id) {
		this.id = id;
	}
	
	// 获得姓名
	public String getName() {
		return name;
	}
	
	// 设置姓名
	public void setName(long id) {
		this.name = name;
	}
	
	// 获得性别
	public String getGender() {
		return gender==true? "男":"女";
	}
	
	// 设置性别
	public void setGender(String gen) {
		gender = gen.equals("男")?true:false;
	}
	
	// 获得年龄
	public int getAge() {
		return age;
	}
	
	// 设置年龄
	public void setAge(int age) {
		this.age = age;
	}  	

}

运行结果:

在这里插入图片描述

分析:
将属性封装为private私有属性,对各个属性设置相应的get方法和set方法,重载构造方法(默认构造方法会被覆盖,需要手写一个)

3)

package cn.whb.work2;

public class student {
	private long id;
	private String name;
	private boolean gender;
	private int age;
	public static void main(String[] args) {
		student st = new student(1001,"张三",true,18);
		System.out.println(st.printInfo());
	}
	
	student(){
		
	}
	// 构造方法
	student(long id,String name,boolean gender,int age){
		this.id = id;
		this.name = name;
		this.gender = gender;
		this.age = age;
	}
	
	public String printInfo() {
		String gen = gender==true? "男":"女";
		
		return "学号:"+id+" 姓名:"+name+" 性别:"+gen+" 年龄:"+age;
	}
	
	// 获得学号
	public long getId() {
		return id;
	}
	
	// 设置学号
	public void setId(long id) {
		this.id = id;
	}
	
	// 获得姓名
	public String getName() {
		return name;
	}
	
	// 设置姓名
	public void setName(long id) {
		this.name = name;
	}
	
	// 获得性别
	public String getGender() {
		return gender==true? "男":"女";
	}
	
	// 设置性别
	public void setGender(String gen) {
		gender = gen.equals("男")?true:false;
	}
	
	// 获得年龄
	public int getAge() {
		return age;
	}
	
	// 设置年龄
	public void setAge(int age) {
		this.age = age;
	}

}
运行结果:

在这里插入图片描述

分析: 将各属性与字符串连接,自动转换为字符串,然后返回

4)
import java.io.*;
class A
{
    void callme()
  {
    System.out.println("调用A的callme()的方法");
  }
}
class B extends A
{ 
   void callme()
  {
   System.out.println("调用B的callme()的方法");
  }
}
public class Ex
{
   public static void main(String args[])
  { 
     A a=new B();
     a.callme();
  }
}

A a=new B();a.callme();a调用的是A的方法还是B的方法呢?为什么?编译运行验证之。

运行结果:

在这里插入图片描述

分析: 由多态的性质可知(向上转型),a调用的是B中的方法

5)

package cn.whb.work2;

abstract public class Animal {
	String name;
	int age;
	int weight;
	abstract void run();
	abstract void jump();
	abstract void walk();
	abstract void eat();
}

class Cat extends Animal{

	@Override
	void run() {
		System.out.println("猫轻轻的跑了..");
	}

	@Override
	void jump() {
		
	}

	@Override
	void walk() {
		
	}

	@Override
	void eat() {
		System.out.println("嗷呜...");
	}
	
}

class Dog extends Animal{

	@Override
	void run() {
		System.out.println("狗飞快的跑了");
		
	}

	@Override
	void jump() {
		
	}

	@Override
	void walk() {
		
		
	}

	@Override
	void eat() {
		System.out.println("狗,舔.......");
		
	}
	
}

class whileCat extends Cat{
	void eat() {
		System.out.println("白猫吃.....");
	}
}

class Test{
	public static void main(String[] args) {
		Cat cat1 = new Cat();
		cat1.eat();
		cat1.run();
		Dog d1 = new Dog();
		d1.eat();
		d1.run();
		whileCat wcat = new whileCat();
		wcat.eat();
		wcat.run();
	}
}

运行结果:

在这里插入图片描述

分析:
子类必须实现抽象父类的所有方法,如果子类也是抽象类,则不用实现

6)

解法一(暴力):

-----------------------------------
public class Test {
	public static void main(String[] args) {
		long a = (long) Math.pow(13, 13);
		String aa = "" + a;
		System.out.println(aa);
		System.out.println(aa.substring(aa.length()-3));
		
	}
}
----------------------------------

解法二(合理利用题意):

---------------------------------
public class Test {
public static void main(String[] args) {
    int a = 13;
	String aa;
	for(int i=0;i<12;i++) {
		a *= 13;
		aa = "" + a;
        while(aa.length()<3){
           aa = "0" + aa;            
        }
		a = Integer.parseInt(aa.substring(aa.length()-3));
		}
		System.out.println(a);
	}
}

运行结果:

在这里插入图片描述

总结:

继承:

子类的对象也是父类的对象,但反过来不成立.

java中子类必须调用父类的构造函数.如果没有用super()明确指明的话,默认调用没有参数的那个构造函数,
如果自己定义了一个构造函数将
默认的无参构造函数覆盖掉,并且没有再定义无参构造函数,则会报错.
```可以通过super(参数)的形式在子类的构造函数中调用父类的有参数构造函数,此时,如果父类没有
无参数	构造函数也不会报错.

extends关键字用来表明父类:
    class Person{}
    class Student extends Person{}

Student拥有Person类的属性和方法.

多态:

子类通过重写父类的方法,可以用自身的行为替换父类的行为.方法的重写是实现多态的必要条件.
多态指的是同一个方法调用,由于对象不同可能会有不同的行为.

多态的要点:
  1. 多态是方法的多态,不是属性的多态(多态与属性无关).
  2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象.
  3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了.

对于子类和父类对象的相互转化,向上自动专型,向下需要强制类型转换.
向下指的是从父类==>子类.
抽象类:
抽象方法:
 使用abstract修饰的方法,没有方法体,只有声明.定义的是一种“规范”,就是告诉子类必须要给抽象方法
 提供具体的实现.

抽象类:

 包含抽象方法的类就是抽象类.通过abstract方法定义规范,然后要求子类必须定义具体实现.通过抽象类,
 我们就可以做到严格限制子类的设计,使子类之间更加通用.

猜你喜欢

转载自blog.csdn.net/qq_46456049/article/details/108789576