学习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个小时,明天加油吧.