类和对象练手题目

目录

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、数据周期

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

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

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

相关推荐

  1. [c++]对象常见题目详解

    2024-01-16 10:06:02       21 阅读
  2. python对象

    2024-01-16 10:06:02       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-16 10:06:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-16 10:06:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-16 10:06:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-16 10:06:02       18 阅读

热门阅读

  1. 《设计模式的艺术》笔记 - 抽象工厂模式

    2024-01-16 10:06:02       29 阅读
  2. Unity3D 如何把全部游戏逻辑都放到lua层实现详解

    2024-01-16 10:06:02       32 阅读
  3. Docker-Compose详解与部署示例

    2024-01-16 10:06:02       28 阅读
  4. 自动化理论基础(2)—开发语言之Python

    2024-01-16 10:06:02       25 阅读
  5. Django命令模块

    2024-01-16 10:06:02       28 阅读
  6. 2024/1/15 DFS BFS

    2024-01-16 10:06:02       37 阅读
  7. 前端知识汇编(持续更新中)

    2024-01-16 10:06:02       38 阅读