类和对象
.java文件通过jdk变成.class文件再通过jre
java申请一个足够大的数组(块),其中有方法区,包含类常量池和静态常量池(被static修饰的部分)
随后是方法的运行,方法的运行要依托栈结构,随着栈的进行会在堆中创建大量的对象,堆里有字符串常量池,程序计数器和本地方法栈之后会学习类的封装,封装后我们只需要知道怎么使用,而不需要知道其内部的实现原理
构造器和方法实现构造
构造方法的隐含参数是对象
1.构造器和类同名
2.每个类有一个以上构造器
3.构造器可以有0个,一个或者多个参数
4.构造器没有返回值
5.构造器伴随new一起使用,已经new过的对象不能再使用构造器
person类
package com;
public class Person {
public String name;
public int age;
public Person() {
System.out.println("============");
}
public Person(String n,int a)
{
age=a;
name=n;
System.out.println("#######");
}
public String toString() { //非静态方法,必须依托对象存在。
return "age:"+age+"name:"+name;//如果不定义此方法返回对象类型和类地址
}
public static Person of(String n,int a) {//方法实现构造
return new Person(n,a);
}
}
main方法
package com;
import java.util.*;
public class Test11 {
public static void main(String[] arg) {
Person x1=new Person();
x1.name="张三";
x1.age=33;
Person x2=new Person("李四",14);
System.out.println(x1);//如果不重写tostring,输出一个对象就是输出对象名称和地址,对象占用8字节,内存条是8字节
System.out.println(x1.toString());//不管是否重定义,直接输出和调用toString效果一样
System.out.println(x2);
System.out.println(x2.toString());
Person x3=Person.of("王五",12);
System.out.println(x3.toString());
}
}
更改器和访问器
当变量设置为私有private变量的时候我们需要使用访问器get和更改器set对其进行操作,这种方法阻止不了任何安全问题,只是多线程的时候用,它本身没有任何安保问题,但是我们可以修改让其实现只读或者只写,比如一个数组,只是给他增加访问器,由于引用类型的特性,这个数组尽管被设为私有类型但是它仍旧可以被修改,但是我们可以new一个数组,这个其实就是深拷贝,拷贝值而不拷贝地址
person类
package com;
public class Person {
private String name;
private int age;
private static int[] arr= {1,2,3}; //field是属性,constructor构造器 method方法 这三种组成一个类,说全一点其实应该还有注解信息@
public int getAge() {
return age;
}
public void setAge(int n) {
age=n;
}
public String getName() {
return name;
}
public void setName(String n) {
name=n;
}
public int[] getArr() {
return arr;
}
public int[] getArr2() {
int[] arrNew=new int[arr.length];
for(int i=0;i<arr.length;i++) {
arrNew[i]=arr[i];
}
return arrNew;
}
public static int[] getArr3() {
int[] arrNew=new int[arr.length];
for(int i=0;i<arr.length;i++) {
arrNew[i]=arr[i];
}
return arrNew;
}
public String toString() { //非静态方法,必须依托对象存在。
return "age:"+age+"name:"+name;//如果不定义此方法返回对象类型和类地址
}
}
main方法
package com;
import java.util.*;
public class Test11 {
public static void main(String[] arg) {
Person x1=new Person();
x1.setName("张三");
x1.setAge(33);
System.out.println(x1);
int[] w=x1.getArr();
w[0]=99;
System.out.println(w[0]);//通过访问器没有实现安全还是可以对数组进行修改
System.out.println(x1.getArr()[0]);
int[] w2=x1.getArr2();
w2[0]=9;
System.out.println(w2[0]);
System.out.println(x1.getArr()[0]);
int[] w3=x1.getArr2();//需知道w2和w3不是一个arrNew,每次调用arrNew都是拷贝一份压入栈,每一份都new了一个arrNew重新分配地址,初始值为0,通过循环让他等于arr,其他语言也一样,执行方法都是拷贝一份执行
w3[0]=6;
System.out.println(w3[0]);
System.out.println(x1.getArr()[0]);
//static和非static结果是一样的
int[] w4=Person.getArr3();
w4[0]=100;
System.out.println(w4[0]);
System.out.println(x1.getArr()[0]);
int[] w5=Person.getArr3();
System.out.println(w5[0]);
}
}
一个类文件里可以有多个类,但是只能有一个public类
私有方法只能类内调用
主方法操作系统会把他当作一个进程来对待,否则他是个线程