java学习-内存分配
class A {
int i;
int j;
}
public class TestMemo {
public static void main(String[] args) {
A aa = new A();
// new A(); 在堆中动态分配一块区域,被当做了A对象
// aa本身的内存是在栈中分配的
// 堆中内存的地址赋给了aa
// aa指向堆中的内存块,aa代表了堆中的内容
// aa.i 代表: aa这个静态指针(引用)变量所指向的动态内存中的A对象的成员变量
}
}
java学习–访问控制符
类的访问控制符有四种:
public
protected
默认[即不加任何修饰符] default
private
在一个类的内部,所有的成员都可以互相访问, 访问控制符是透明的(可以无视的)
访问控制符是对外部访问而言的
外部访问包括两种方式
通过类名访问类内部的成员
通过类对象名访问类的内部成员
public: 可以通过 外部访问方式访问类内部的public成员
private: 不可以通过外部访问方式访问类内部的private成员
其他内容在学完集成和包之后再讲
java学习–类的构造函数
当一个对象被创建时,会对其中各类型的成员变量自动进行初始化赋值
byte 0
short 0
int 0
long 0
float 0.0F
double 0.0D
char '\u0000'(表示为空)
boolean false
ALL reference type(引用(指针)类型) null
//引用的本质是对指针的某些危险功能屏蔽之后剩下的东西
class A {
//指定默认初始值
public int i = 2;
}
public static void main(String[] args) {
A a = new A();
//不会报错,因为会调用默认构造函数(无参构造函数)
//i不属于局部变量
//数值型变量默认为0
//boolean类型默认是false
System.out.println(a.i);
int k;
//会报错,k是局部变量,局部变量定义之后必须初始化,java禁止垃圾值出现
System.out.println(k);
}
java学习–函数重载
函数重载的要求
1. 函数的形参个数
2. 函数的形参顺序
3. 函数的形参数据类型
这三个至少有一个是不一样的
如果两个函数只有函数的返回值是不一样的,其他都一样,
这构不成函数的重载,并且编译时会报错!
java学习–this
this是一个系统隐藏的指针被自动附加在非静态成员函数的参数列表中
当前时刻,哪个对象调用该函数,那么this就指向当前调用该函数的对象,系统会自动
在函数的参试列表中加一个隐藏的this指针,并且把调用该函数的对象的地址赋给this指针
这样一来,在函数内部通过this就可以访问当前正在调用该函数的对象的成员
静态函数内部,没有this指针
我觉得,this指针的意义就是实现了同一个类的对象的函数共享,否则,每个对象都要分配函数代码空间
class A {
public int i;
//所以我认为其实 构造函数含有参数 this
public A(int j){
i = j;
}
//实际上, show隐含了一个引用型变量 A this
//所以函数头应该写成 public void show(A this)
//来表明调用show方法的是哪一个对象
public void show() {
//i也可以换成 this.i
System.out.printf("i = %d\n", i);
}
}
java学习–static
public是控制符
static是修饰符
静态属性存放在 内存的 data segment区域
这个区域也用来存放字符串常量
class A {
public static int i;
public static void f() {
System.out.println("2020年12月19日21:35:22");
}
}
public class Main {
public static void main(String[] args) {
//可以通过类名来访问该类内部的static属性
System.out.println(A.i);
}
A.f();
A aa = new A();
//这样写也可以运行,没有错
//但是严格来讲,static应该属于类,而不是属于具体的对象
aa.f();
}
class A {
private int i;
public static void f() {
System.out.println("ffff");
}
//出现的问题是: 非静态的方法能否访问静态的方法?
//[解释]: 能执行g() 说明一定有对象, 有对象一定可以直接调用f()
public void g() {
f();
System.out.println("gggg");
}
//出现的问题是:静态的方法能否访问非静态的方法?
//[解释]:能执行h()时, 不一定创建了对象, 那么就不一定能调用g()方法
public static void h() {
g();
System.out.println("hhhh");
}
}
public class Main {
public static void main(String[] args) {
}
}