类和对象练手题目

发布时间:2024年01月16日

目录

01:写一个人的类

02:写一个汽车类:

03:写一个课程类:

04:定义一个类,用于描述坐标点

05:定义一个圆类型

06:编程创建一个Box类,在其中定义三个变量表示一个立方体的长、宽和高,定义一个方法求立方体的体积。创建一个对象,求给定尺寸的立方体的体积。

07:定义一个计算机类:

08:编写一个类Student,代表学员,要求:

09:Java对内存的划分分为几类?

10:堆和栈的区别?


01:写一个人的类

属性:名字,性别,年龄

方法:(1)自我介绍的方法(2)吃饭的方法

创建一个对象“张三”

package com.nanchu.classpractice;

/**

?* @Author 南初

?* @Create 2024/1/15 16:20

?* @Version 1.0

?*/

public class Pen {

????String name;

????char sex ;

????int age;



????public String getName() {

????????return name;

????}



????public void setName(String name) {

????????this.name = name;

????}



????public char getSex() {

????????return sex;

????}



????public void setSex(char sex) {

????????this.sex = sex;

????}



????public int getAge() {

????????return age;

????}



????public void setAge(int age) {

????????this.age = age;

????}



????public void SelfIntroduction(){

????????System.out.println("我叫:"+name+",性别是:"+sex+",今年:"+age+"岁了");

????}

????public void Eat(String food){

????????System.out.println("我爱吃:"+food);

????}

}



public class alltest {

????@Test

????public void PenTest(){

????????Pen zhangsan = new Pen();

????????zhangsan.setName("张三");

????????zhangsan.setSex('男');

????????zhangsan.setAge(22);

????????zhangsan.SelfIntroduction();

????????zhangsan.Eat("鸡大腿");

????}



}

02:写一个汽车类:

属性:品牌;车长;颜色;价格;

方法:跑的方法

创建五个对象:“捷达”,“宝马”,“劳斯莱斯”,“科鲁兹”,“迈锐宝”

package com.nanchu.classpractice.two;

/**

?* @Author 南初

?* @Create 2024/1/15 16:40

?* @Version 1.0

?*/

public class Car {

????String brand;

????double carLength;

????String color;

????double price;



????public void CarAll(String brand, double carLength, String color, double price) {

????????this.brand = brand;

????????this.carLength = carLength;

????????this.color = color;

????????this.price = price;

????}



????public void run(String brand, double speed){

????????System.out.println(brand+"最可可以跑:"+speed+"km/h");

????}



????@Override

????public String toString() {

????????return "{" +

????????????????"brand='" + this.brand + '\'' +

????????????????", carLength=" + this.carLength +

????????????????", color='" + this.color + '\'' +

????????????????", price=" + this.price +

????????????????'}';

????}

}



    ?@Test

????public void CarTest(){

????????Car car1= new Car();

????????Car car2= new Car();

????????Car car3= new Car();

????????Car car4= new Car();

????????Car car5= new Car();

????????car1.CarAll("捷达",5.4,"白色",150000);

????????car2.CarAll("宝马",5.5,"黑色",200000);

????????car3.CarAll("劳斯莱斯",6.0,"银白色",2000000);

????????car4.CarAll("科鲁兹",5.1,"红色",10000);

????????car5.CarAll("迈锐宝",5.3,"黑色",15000);



????????System.out.println(car1.toString());

????????car1.run("捷达",200);

????????System.out.println(car2.toString());

????????car2.run("宝马",210);

????????System.out.println(car3.toString());

????????car3.run("劳斯莱斯",220);

????????System.out.println(car4.toString());

????????car4.run("科鲁兹",210);

????????System.out.println(car5.toString());

????????car5.run("迈锐宝",200);

????}

03:写一个课程类:

属性:课程名;学时;任课老师;

创建五个对象:“c语言”,“Java编程”,“php网络编程”,“c++”,“数据结构”

package com.nanchu.classpractice.question;

/**

?* @Author 南初

?* @Create 2024/1/15 17:05

?* @Version 1.0

?*/

public class ThreeCourse {

????/*属性:课程名;学时;任课老师;

创建五个对象:“c语言”,“Java编程”,“php网络编程”,“c++”,“数据结构”*/

????String courseName;

????double classHour;

????String teacher;



????public ?ThreeCourse(String courseName, double classHour, String teacher) {

????????this.courseName = courseName;

????????this.classHour = classHour;

????????this.teacher = teacher;

????}



????@Override

????public String toString() {

????????return "{" +

????????????????"课程名='" + courseName + '\'' +

????????????????", 学时=" + classHour +

????????????????", 任课老师='" + teacher + '\'' +

????????????????'}';

????}

}

@Test
public void ThreeCourseTest(){
????ThreeCourse course1 = new ThreeCourse("C语言",50,"李老师");
????ThreeCourse course2 = new ThreeCourse("Java编程",60,"王老师");
????ThreeCourse course3 = new ThreeCourse("php网络编程",40,"张老师");
????ThreeCourse course4 = new ThreeCourse("c++",55,"贾老师");
????ThreeCourse course5 = new ThreeCourse("数据结构",70,"肖老师");
????System.out.println(course1.toString());
????System.out.println(course2.toString());
????System.out.println(course3.toString());
????System.out.println(course4.toString());
????System.out.println(course5.toString());
????
}

04:???????0——————>X

??????????|

??????????|

??????????| ?????????P(X,Y)

??????????|

??????????|

??????????Y ?

04:定义一个类,用于描述坐标点

  1. 具有计算当前点到原点距离的功能
  2. 求到任意一点(m,n)的距离
  3. 具有坐标点显示功能,显示格式(x,y)

package com.nanchu.classpractice.question;

/**

?* @Author 南初

?* @Create 2024/1/15 18:42

?* @Version 1.0

?*/

public class FiveAxis {

????public double x,y,m,n;



????public FiveAxis(double x, double y, double m, double n) {

????????this.x = x;

????????this.y = y;

????????this.m = m;

????????this.n = n;

????}

????public void function1(double x,double y){

????????double distance;

????????distance = Math.sqrt(x*x+y*y);

????????System.out.println("距离原点距离:"+distance);

????}

????public void function2(double x,double y,double m,double n){

????????double distance;

????????distance =Math.sqrt(Math.pow(m-x,2)+Math.pow(n-y,2));

????????System.out.println("该店距离("+m+","+n+")的距离为:"+distance);

????}

????public void function3(double x,double y){

????????System.out.println("("+x+","+y+")");

????}

}

????public static void main(String[] args) {

????????FiveAxis axis = new FiveAxis(3,4,5,6);

????????axis.function1(axis.x,axis.y);

????????Scanner scan = new Scanner(System.in);

????????System.out.print("请输入坐标轴上的任意一点,例如1 2:");

????????double a= scan.nextDouble();

????????double b= scan.nextDouble();

????????axis.function2(a,b,axis.m,axis.n);

????????axis.function3(axis.x, axis.y);

????}

05:定义一个圆类型

提供显示圆周长功能的方法

提供显示圆面积的方法

package com.nanchu.classpractice.question;

/**

?* @Author 南初

?* @Create 2024/1/15 18:29

?* @Version 1.0

?*/

public class FiveCircle {

????public double radius;



????public double getRadius() {

????????return radius;

????}



????public void setRadius(double radius) {

????????this.radius = radius;

????}

????public void Perimeter(double radius){

????????double perimeter;

????????perimeter = 2*3.14*radius;

????????System.out.println("该圆周长为:"+perimeter);

????}

????public void Area(double radius){

????????double area;

????????area = 3.14*radius*radius;

????????System.out.println("该圆的面积为:"+area);

????}

}

????@Test

????public void FiveCircleTest(){

????????FiveCircle circle = new FiveCircle();

????????circle.setRadius(3.0);

????????System.out.println("该圆的半径为:"+circle.getRadius());

????????circle.Perimeter(circle.radius);

????????circle.Area(circle.radius);

}

06:编程创建一个Box类,在其中定义三个变量表示一个立方体的长、宽和高,定义一个方法求立方体的体积。创建一个对象,求给定尺寸的立方体的体积。

package com.nanchu.classpractice.question;

/**

?* @Author 南初

?* @Create 2024/1/15 18:21

?* @Version 1.0

?*/

public class SixBox {

????public double length;

????public double width;

????public double height;



????public SixBox(double length, double width, double height) {

????????this.length = length;

????????this.width = width;

????????this.height = height;

????}

????public void Volume(double length, double width, double height){

????????double volume=0;

????????volume = length*width*height;

????????System.out.println("该长方体体积为:"+volume);

????}

}

@Test

????public void SixBoxTest(){

????????SixBox box = new SixBox(4,3,5);

????????box.Volume(box.length,box.width, box.height);

????}

07:定义一个计算机类:

属性:品牌;价格;颜色;

方法:(1)编程的功能??(2)上网的功能

实例化两个对象:“lenovo”;“hasee”

package com.nanchu.classpractice.question;

/**

?* @Author 南初

?* @Create 2024/1/15 18:08

?* @Version 1.0

?*/

public class SevenComputer {

????public String brand;

????double price;

????String color;



????public SevenComputer(String brand, double price, String color) {

????????this.brand = brand;

????????this.price = price;

????????this.color = color;

????}



????@Override

????public String toString() {

????????return "{" +

????????????????"品牌='" + brand + '\'' +

????????????????", 价格=" + price +

????????????????", 颜色='" + color + '\'' +

????????????????'}';

????}



????public void Programme(String brand){

????????System.out.println(this.brand+"具有良好的编程功能!");

????}

????public void Internet(String brand){

????????System.out.println(brand+"具有良好的上网功能!");

????}

}

????@Test

????public void SevenComputer(){

????????SevenComputer computer1 = new SevenComputer("Lenovo",8000,"白色");

????????SevenComputer computer2 = new SevenComputer("Hasee",7000,"黑色");

????????System.out.println(computer1.toString());

????????computer1.Programme(computer1.brand);

????????computer1.Internet(computer1.brand);

????????System.out.println(computer2.toString());

????????computer2.Programme(computer2.brand);

????????computer2.Internet(computer2.brand);



????}

08:编写一个类Student,代表学员,要求:

1)具有属性:学号、姓名、年龄、性别、专业。

2)具有方法:自我介绍,负责输出该学员的姓名、年龄、性别以及专业。

package com.nanchu.classpractice.question;

/**

?* @Author 南初

?* @Create 2024/1/15 17:19

?* @Version 1.0

?*/

public class EightStudent {

????int studentNumber;

????String name;

????int age;

????char sex;

????String career;



????public EightStudent(int studentNumber, String name, int age, char sex, String career) {

????????this.studentNumber = studentNumber;

????????this.name = name;

????????this.age = age;

????????this.sex = sex;

????????this.career = career;

????}

//学号、姓名、年龄、性别、专业

????@Override

????public String toString() {

????????System.out.println("{" +

????????????????"学号=" + studentNumber +

????????????????", 姓名='" + name + '\'' +

????????????????", 年龄=" + age +

????????????????", 性别=" + sex +

????????????????", 专业='" + career + '\'' +

????????????????'}');

????????return null;

????}

}

    @Test

????public void EightStudentTest(){

????????EightStudent student = new EightStudent(204812,"王妍",18,'女',"艺术");

????????student.toString();

????}

09:Java对内存的划分分为几类?

???划分一运行时数据区域; 程序计数器; Java虚拟机栈; 本地方法栈; 堆; 方法区;运行时常量池; 对象访问。

???划分二栈区、堆区、静态区、代码区。

以下是网上常见的两种说法:
说法一、

1、栈(stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中

        局部变量:方法的参数,或者是方法体{}中内部的变量

        作用域:一旦超出作用域,立刻从栈内存中消失

2、堆(Heap):凡是new出来的东西,都在堆当中

        堆内存里面的东西都有一个地址值:16进制

        堆内存里面的数据,都有一个默认值。规则:

          基本数据:整型,默认0;

               浮点型,默认为0.0;

               字符型,默认为‘\u0000’

               布尔型,默认为false

引用类型数据:字符串、数组、对象,默认为null

3、方法区(Method Area):储存.class相关信息,包含方法的信息;

4、本地方法栈(Native Method Stack):与操作系统相关。

5、寄存器(pc Register):与CPU相关

说法二、

1、程序计数器

????????CPU的计算时间是以分片的方式给到每个线程的,换句话说,所谓的并行其本质就是串行。比如线程A执行到了一部分,CPU将控制权给了线程B,那么线程A重新得到CPU的资源时,如何恢复工作呢?这个程序计数器就来帮助线程A找到其中间状态,从而恢复到正确的执行位置。程序计数器所占内存是线程私有的,同时也是Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2、JAVA虚拟机栈

????????它也是线程私有的,它所占有的内存空间也就是我们平时所说的“栈(stack)内存”。并且和线程的生命周期相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(StackFrame①)用于存储局部变量表(基本数据类型,对象的引用和returnAddress类型)、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

3、JAVA堆

????????JAVA堆一般是JVM管理的内存中大的一块,JAVA堆在主内存中,是被所有线程共享的一块内存区域,其随着JVM的创建而创建,堆内存的目的是存放对象实例。同时JAVA堆也是GC管理的主要区域。

????????如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、FromSurvivor空间、ToSurvivor空间等。

????????如果从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(ThreadLocalAllocationBuffer,TLAB)。

????????不过,无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存。

如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

4、本地方法栈

????????本地方法栈(NativeMethodStacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如SunHotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

5、方法区

????????方法区也是各线程共享的一个内存区域。主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

????????Java虚拟机规范对这个区域的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是有必要的。

????????根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

6、常量池

????????Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量表(constant_pooltable),用于存放编译期已可知的常量,这部分内容将在类加载后进入方法区(永久代)存放(JDK1.7开始,常量池已经被移到了堆内存中)。

10:堆和栈的区别?

堆:存放的是引用数据类型;

栈: 存放的是基本数据类型;容量小、速度快、适合存放小型数据。

以下是两种常见解释:
解释一、

定义

栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;

堆是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在区域不连续,会有碎片。

1、功能不同

栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

2、共享性不同

栈内存是线程私有的, 堆内存是所有线程共有的。

3、异常错误不同

如果栈内存或者堆内存不足都会抛出异常。

栈空间不足:java.lang.StackOverFlowError。

堆空间不足:java.lang.OutOfMemoryError。

4、空间大小

栈的空间大小远远小于堆的。

解释二、

1、数据类型

????????堆:堆用于存储Java对象实例,包括类的实例变量和实例方法。

????????栈:栈用于存储基本数据类型和对象引用。

2、分配方式和管理

????????堆:堆内存是在程序运行时动态分配的。Java的垃圾回收器自动管理堆内存,负责对象的分配和释放。对象在堆中分配,无需手动释放,垃圾回收器会自动识别并回收不再使用的对象。

????????栈:栈内存是按照固定的大小进行分配的,用于存储方法调用和局部变量。栈的管理是自动的,随着方法的调用和返回,栈帧的创建和销毁也会相应发生。

3、内存分配效率

????????堆:由于堆内存的动态分配机制,对象的创建和销毁可能会涉及到内存的分配和回收,因此堆的内存分配效率相对较低。

????????栈:栈内存的分配和释放都是通过指针的移动来实现的,效率较高。

4、内存空间

????????堆:堆内存的大小通常比栈大,可以通过调整JVM的堆内存参数来进行配置。

????????栈:栈的大小在程序运行前就被确定,并且通常比堆的大小小得多。

5、数据周期

????????堆:堆中的对象生命周期由程序员控制,当对象不再被引用时,垃圾回收器会在适当的时候回收它们。

????????栈:栈中的数据周期与方法的调用和返回相关联,当方法执行结束时,栈帧会被销毁,栈上的数据也随之消失。

????????总的来说,堆用于存储对象,由垃圾回收器自动管理内存,而栈用于存储基本数据类型和对象引用,具有自动的分配和释放机制。了解堆和栈的区别对于正确使用和管理内存是非常重要的。

文章来源:https://blog.csdn.net/qq_53483101/article/details/135608804
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。