学习java,day6(初识JVM的内存模型等)

学习java,day6(初识JVM的内存模型等)

用java特有的…的方式来传递可变个数的参数,这种参数在使用时与数组的使用方式相同
* 如果没有参数可以不填
* 这种…代表可以传递0到多个参数
* 如果有一个方法有多个的形参,可变的形参(…这种的参数)一定要放在所有的参数最后
* printInfo(String s,int d,String… args)这样的方式参数的方式是对的
* printInfo(String s, String… args, int d)这样的方式参数的方式是不对的
* printInfo(String… args, String s,int d)这样的方式参数的方式是不对的

	public void printInfo1(String... args) { //创建方法
		for(int i = 0; i < args.length; i++) {
			System.out.println(args[i]);
		}
public class Test3 {
	public static void main(String[] args) {
		Person2 p2 = new Person2();
		p2.printInfo1("lisi","23","男");//使用...的方式直接调用
		
	String[] ss2 = new String[] {"北京市","131111111","3213241111111111"};
		p2.printInfo1(ss2);//创建数组的时候也可以调用
}

JVM的内存模型
栈 stack
基础数据类型(int,char,boolean等等),对象的引用(对象的地址)
堆 heap
所有的对象(包括自己定义的对象和字符串对象)
方法区 method
所有的class和static变量

假设 Person p = new Person()
堆heap中储存的是 new Person()这个对象
在堆中的地址为BExxxxx.
栈stack中储存的是p的地址AGxxxx,但是储存的内容是
new Person()这个对象在堆中的地址BExxxxx

假设 int i = 1
在栈中储存的是i的值AGxxxxx,1

基本数据类型,值保存在栈中,引用对象,值保存在堆中,栈中存的对象是堆中的地址.

方法的参数传递:引用对象

public class DataSwap {
	public int a;
}
public class Test5 {
	public static void swap(DataSwap ds1) {
		ds1.a = 6;
		System.out.println("在swap方法中,ds1.a的值是:" + ds1.a);
	}
	public static void main(String[] args) {
	//把new Dataswap()存到了堆内存中,假设地址为BE0001
	//ds引用对象存到栈中,假设地址是AD0001,值是new
		DataSwap ds = new DataSwap();
		System.out.println("调用swap方法之前,ds.a的值是:" + ds.a);
	//调用swap方法,给ds1引用对象保存到栈中,假设地址是AD0002,存的值是来自与实参(ds),也就是ds的站中存的值
	//这个值实际上就是之前 new DataSwap()对象在堆内存中的地址
		swap(ds);
		System.out.println("调用swap方法之后,ds.a的值是:" + ds.a);
		
	}
}

得到的结果是
调用swap方法之前,ds.a的值是:0
在swap方法中,ds1.a的值是:6
调用swap方法之后,ds.a的值是:6

封装和隐藏
利用private进行逻辑控制,并使用getXxx()和setXxx()来进行操作
Q1:设计类Animal,并对legs进行信息隐藏
隐藏前设计,此时输入legs的数量为任意数

public class Animal {

	public int legs;
	
	public void printLegs() {
		System.out.println("legs: " + legs);
	}
	public int getLges(int t) {
		return legs = t;
	}
	public void eat(String eat) {
		System.out.println("Eating:" + eat);
	}
	public void move(String move) {
		System.out.println("Moving:" + move);
	}
}
public class Zoo {
	public static void main(String[] args) {
		Animal xb = new Animal();
		xb.getLges(6);
		xb.printLegs();
		xb.eat("气球");
		xb.move("飞");
				
	}
}

隐藏后的设计,legs大不能超过6.最小不能小于2

public class Animal {

	private int legs;
	
	public void printLegs() {
		System.out.println("legs: " + legs);
	}
	public void eat(String eat) {
		System.out.println("Eating:" + eat);
	}
	public void move(String move) {
		System.out.println("Moving:" + move);
	}
	
	public void setLegs(int a) {
		if(a <= 6 && a >= 2) {
			legs = a;
		}else{
			System.out.println("您输入的值不正确");
		}
	}
	
}

输入值时,如果比6大,比2小,则打印:您输入的值不正确

public class Zoo {
	public static void main(String[] args) {
		Animal xb = new Animal();
		xb.setLegs(-1000);
		xb.printLegs();
		xb.eat("气球");
		xb.move("飞");
				
	}
}

Q2:编写两个类,TriAngle和TestTriAngle,其中TriAngle中声明私有的底边长base和高height,
同时声明公共方法访问私有变量;另一个类中使用这些公共方法,计算三角形的面积.

public class TriAngle {
	//声明私有的base和height
	private int base;
	private int height;
	
	//使用setArea()声明公共方法访问私有变量
	public void setArea(int b,int h) {
	base = b;
	height = h;
}
	//使用getBase(),getHeight(),getArea()声明公共方法访问私有变量
	public void getBase() {
		System.out.println("base: "+ base);
	}
	public void getHeight() {
		System.out.println("height: " + height);
	}
	public void getArea() {
		System.out.println("area= "+ (base * height) / 2);
	}
}
public class TestTriAngel {
	public static void main(String[] args) {
		
	//使用公共方法,计算三角形的面积
	TriAngle t = new TriAngle() {};
		t.setArea(7, 9);
		t.getBase();
		t.getHeight();
		t.getArea();
	}
}

构造器的重载
构造器和方法一样,就是方法的变化。构造器重载跟方法重载一样:方法名一样,参数类型或参数个数不一样。

Q3:在这里插入图片描述

public class Person {
	String name;
	int age;
	String school;
	String major;
	
	public Person(String n, int a) {
		 name = n;
		 age = a;
	}
	public Person(String n, int a,String s) {
		name = n;
		age = a;
		school = s;
	}
	public Person(String n, int a,String s,String m) {
		name = n;
		age = a;
		school = s;
		major = m;
	}
	public static void main(String[] args) {
		
		Person one = new Person("zhangsan",18);
		System.out.println("one的姓名是: " + one.name  + "\n" + "年龄是: " + one.age);
		
		Person two = new Person("lisi",18,"ailisidun");
		System.out.println("two的姓名是: " + two.name  + "\n" + "年龄是: " + two.age + "\n" + "学校是: " + two.school);
		
		Person thr = new Person("wangwu",17,"ailisidun","zuosi");
		System.out.println("thr的姓名是: " + thr.name  + "\n" + "年龄是: " + thr.age + "\n" + "学校是: " +thr.school + "\n"+ "专业是: " + thr.major);
		}
		
	}

JavaBean

JavaBean的代码如下
三组 set get

public class Person2 {
	private String name;
	private int sex;
	private int age;
	
	public void steName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return this.name;
	}
	
	public void setSex(int sex) {
		this.sex =sex;
	}
	
	public int getSex() {
		return this.sex;
	}
	
	public void setAge(int age) {
		 this.age = age;
	}
	
	public int getAge() {
		return this.age;
	}
}

调用方法

public class test {
	public static void main(String[] args) {
		
		Person2 p2 = new Person2();
		
		p2.steName("zhangsan");
		p2.setSex(0);
		p2.setAge(20);
		
		System.out.println(p2.getName());
		System.out.println(p2.getSex());
		System.out.println(p2.getAge());
	}
}

定义完私有属性后,可以鼠标右键,点击Source→Generate Getters and Setters
可以自动生成javaBean代码

今天有点难度,听的有点累,这点内容学习了5个小时,明天加油吧.

发布了8 篇原创文章 · 获赞 0 · 访问量 83

猜你喜欢

转载自blog.csdn.net/Reishinj/article/details/104996495