目录
01:写一个人的类
02:写一个汽车类:
03:写一个课程类:
04:定义一个类,用于描述坐标点
05:定义一个圆类型
06:编程创建一个Box类,在其中定义三个变量表示一个立方体的长、宽和高,定义一个方法求立方体的体积。创建一个对象,求给定尺寸的立方体的体积。
07:定义一个计算机类:
08:编写一个类Student,代表学员,要求:
09:Java对内存的划分分为几类?
10:堆和栈的区别?
属性:名字,性别,年龄
方法:(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("鸡大腿");
}
}
属性:品牌;车长;颜色;价格;
方法:跑的方法
创建五个对象:“捷达”,“宝马”,“劳斯莱斯”,“科鲁兹”,“迈锐宝”
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);
}
属性:课程名;学时;任课老师;
创建五个对象:“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
- 具有计算当前点到原点距离的功能
- 求到任意一点(m,n)的距离
- 具有坐标点显示功能,显示格式(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);
}
提供显示圆周长功能的方法
提供显示圆面积的方法
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);
}
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);
}
属性:品牌;价格;颜色;
方法:(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);
}
(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();
}
划分一:运行时数据区域; 程序计数器; 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开始,常量池已经被移到了堆内存中)。
堆:存放的是引用数据类型;
栈: 存放的是基本数据类型;容量小、速度快、适合存放小型数据。
定义
栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;
堆是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在区域不连续,会有碎片。
1、功能不同
栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。
2、共享性不同
栈内存是线程私有的, 堆内存是所有线程共有的。
3、异常错误不同
如果栈内存或者堆内存不足都会抛出异常。
栈空间不足:java.lang.StackOverFlowError。
堆空间不足:java.lang.OutOfMemoryError。
4、空间大小
栈的空间大小远远小于堆的。
1、数据类型
堆:堆用于存储Java对象实例,包括类的实例变量和实例方法。
栈:栈用于存储基本数据类型和对象引用。
2、分配方式和管理
堆:堆内存是在程序运行时动态分配的。Java的垃圾回收器自动管理堆内存,负责对象的分配和释放。对象在堆中分配,无需手动释放,垃圾回收器会自动识别并回收不再使用的对象。
栈:栈内存是按照固定的大小进行分配的,用于存储方法调用和局部变量。栈的管理是自动的,随着方法的调用和返回,栈帧的创建和销毁也会相应发生。
3、内存分配效率
堆:由于堆内存的动态分配机制,对象的创建和销毁可能会涉及到内存的分配和回收,因此堆的内存分配效率相对较低。
栈:栈内存的分配和释放都是通过指针的移动来实现的,效率较高。
4、内存空间
堆:堆内存的大小通常比栈大,可以通过调整JVM的堆内存参数来进行配置。
栈:栈的大小在程序运行前就被确定,并且通常比堆的大小小得多。
5、数据周期
堆:堆中的对象生命周期由程序员控制,当对象不再被引用时,垃圾回收器会在适当的时候回收它们。
栈:栈中的数据周期与方法的调用和返回相关联,当方法执行结束时,栈帧会被销毁,栈上的数据也随之消失。
总的来说,堆用于存储对象,由垃圾回收器自动管理内存,而栈用于存储基本数据类型和对象引用,具有自动的分配和释放机制。了解堆和栈的区别对于正确使用和管理内存是非常重要的。