Java学习笔记-郝斌老师

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) {
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值