网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
假设这个大框是内存的一块区域,
class Test{
public static void main(String args[]){//reference
Human zhangsan=new Human();
Human lisi=new Human();}
Human(),类名加括号(函数/方法)就叫做构造函数
构造函数的用法 Constructor
当我们给Java编译器一个类文件时,编译器会首先检查这个类文件里有没有写构造函数,如果一个构造函数都没有写的话, 编译器会自动的给类文件添加上一个参数列表为空,方法体也为空的构造函数
//constructor
//这样的一个函数,就叫做参数列表为空,方法体也为空的函数
//注意method 会有一个返回值类型,如果没有返回值的话, 会用到void
//构造函数的函数名必须要和类名一致,大小写也要一致
public Human(){
}
//。3
区分method 和 constructor
//构造函数,带参数的目的,就一个:给这些属性附上初始值
public Human(String name1,int age1,double h1,double w1){
name=name1;//name表示属性,name1表示参数
age=age1;
height =h1;
weight=w1;
}
在入口文件中
class Test{
public static void main(String args[]){//reference ,想要给类文件中的属性赋值时,需要挨个的用**“对象名.”**
Human zhangsan=new Human();
zhangsan.name=“zs”;zhangsan.age=20;
zhangsan.height=178.0
zhangsan.weight=140.0;
然而以下两行代码和上面的五行代码是完全可以替代,且一致的。
//将参数直接放到括号里就好了
Human lisi=new Human(“lisi”,18,180.0,160.0);
其实都是因为在构造函数中,封装好了赋值语句,所以就好用了
如果参数和属性的名字一致,该怎么区分呢?—使用this. 关键字,
//如何区分参数中的name,和属性中的name,使用this. 关键字
public Human(String name,int age,double height,double weight){
//带this.的是这个属性,不带this.的是constructor里的参数
this. name=name;
this.age=age;
this. height =height;
this. weight=weight;
}
如果有一万个属性,只需要用带一句带参数的构造函数,或者就是用一万句的赋值语句
如果发现之后对代码进行更新迭代,需要多添加一个属性,例如一年后,我需要添加一个新的属性,比如gender 性别
class Human{ String name; int age; double height; double weight; String gender; //constructor public Human(){ } public Human(String name,int age,double height, double weight, String gender){ this.name=name; this.age=age; this.height=height; this.weight=weight; this.gender=gender; } }
class Test{ public static void main(String args[]) { Human zhangsan=new Human(); zhangsan.name="zs"; zhangsan.age=20; zhangsan.height=178.0; zhangsan.weight=140.0; Human lisi=new Human("lisi",18,180.0,160.0); } }
在类文件中添加了之后,而我原先的代码,在已经调用过本来定义好的代码时,运行就会出错。
如果我已经使用了成千上万,好多次了,如果每个调用过的代码中都加上这个参数,是不太可能每个都重新加上的。所以对于历史已经使用过的代码是不要动的,否则会出现很多问题。
所以在源代码的基础上,直接添加一下,
this.() 调用本来中的其他函数
public Human(String name,int age,double height, double weight, String gender){
this(name,age,height,weight);
this.gender=gender;
}
this. ,指的是调用了某个方法的对象/使用了某个方法的对象
this.+属性,也可this.+方法
//this. 调用了这个方法的某个对象
int doAddition(int a,int b,int c){
return this.doAddition(a,b)+c;
}
两个用法:在构造器中,生成的函数是谁,这个结果就是谁;
在普通函数或者说是method中使用,指的是调用了那个方法的这个对象。–表示的是引用的对象是谁,结果就是谁。
Reference
class Test{
public static void main(String args[]) {
//zhangsan这个名字叫做reference,指的是对象放在内存的哪个地方
Human zhangsan=new Human();
zhangsan.name="zs";
zhangsan.age=20;
zhangsan.height=178.0;
zhangsan.weight=140.0;
System.out.println(lisi.gender);
//用new关键字,调用了构造函数,生成了对象
//但是wang右侧并没有调用构造函数,(只有引用没有对象)叫做空引用--Null Reference
Human wang;
//(只有对象,没有引用)匿名对象--anonymous object
new Human();
//匿名对象的出现只是想临时的做一下,不需要总是做,通过这样的匿名对象能够使用一次后,被垃圾回收机给收掉
new Human().doAddition(1,2);
//因为lisi这个reference的所有的值都指向了wang,所以lisi里的值发生改变的时候,wang也会对应改变
//但是如果一个对象没有被引用的话, 这个就会被作为垃圾删除掉。
//而一个对象,也可以被引用无数次
Human lisi=new Human("lisi",18,180.0,160.0,"male");
Human wang=lisi;
}
}
对于一个对象来说,最多可以有多少个引用呢—是没有上限的。
但是当一个对象一个引用都没有的时候,就会变成垃圾
方法的重载,overload a method
指的是方法名一样,但是参数列表是不一样的,这种写法叫做overload
int doAddition(int a,int b){
int result=a+b;
return result;
}
int doAddition(int a,int b,int c){
return a+b+c;
}
double doAddition(double a,double b,double c){
return a+b+c;
}
参数列表不一样,可以分为数据类型不一样,和参数类型的个数不一样。
注意:一旦方法名一样,那参数列表必然要不一样。
所以overload不是指的具体的某个代码,而是一种关系。
Private
private指的是这个变量只能在本类中来使用
代码演示:
//在类文件中, 把这几个属性设置为私有的,这样能够他们的作用域仅限于本类所书写的大括号里
//在类文件中, 把这几个属性设置为私有的,这样能够他们的作用域仅限于本类所书写的大括号里
private String name;
private int age;
private double height;
double weight;
String gender;
//对应的调用数据
Human lisi=new Human();
lisi.name=("lisi");
lisi.age=18;
用javac进行运行发现结果是
只有在本类的书写的大括号中,使用:1,可以看这个值是多少。2,改变这个值
如果一个类中所有的属性都是私有的,并且没有带有参数的构造函数,然而内存却已经构造好了一个默认的构造器导致的结果很尴尬,就是在类的外部的Test,无法对其进行查看或者修改(read and write)。
用带有参数的构造函数,对其进行赋值。
accessor(访问器)/getter(得到器) and modifier(修改器)/setter(设置器)
假设一个人出生,什么都没改变,只有年龄在发生改变。
在类文件中,这样书写,就可以成功访问上面设置好的私有的变量了。
private int age;
//setter or modifier---用于修改
public void setAge(int age){
this.age=age;
}
//getter or accessor--用于查看
public int getAge(){
return age;
}
public 指的是在任何一个地方,都可以去使用,如果是一个方法, 就可以调用,如果是一个属性就可以读或者写。----在Java中是最高权限
Private 和public刚好相反,对应的也是最小的,最低权限。在这期间,也会有很多其他的权限,在这其中,介绍一下default。
就是我们平时写的前面什么都不加的,default 指的是,和当前所属类在同一个文件夹的文件是可以同时使用 的,即为文件所在的同一个目录下。
public >default>private
Primitive type & Reference type
上面的zhangsan ,lisi ,就是 Reference tyoe–所有含有一个类的都叫做引用数据类型
int a=10;
double b=3.0;
char c=‘z’;
boolean d=true;
a和b,就是Primitive type(基本数据类型)—没有在内存开辟区域作为整个对象。
区分方式: 如果变量的数据类型是以小写的字母开头,那一定是一个基本数据类型;如果是大写的数据类型,一定是引用数据类型。在Java语言中,但凡是引用,都是大写字母开头。String就是典型的引用数据类型,
String a=“123”;
甲骨文这个公司,是java的开发公司,
我们下载的JDK包含了一个java的编译器,还有一个工具类,class String,其中会有各种各样的方法,来提供使用.
基本数据类型传递的是值,引用传递的是地址信息,
引用和传递的是t和lisi的值,不管类文件中怎么操作,结果都不会发生任何改变
//a是基本数据类型,b是引用数据类型
//基本数据类型,传递的是值,而引用数据类型,传递的是一个引用
public void makeChange(int a,int b){
a=a+1;
b=null;
}
int t=10;
Human zhangsan=new Human("zhangsan",18,180.0,140.0);
Human lisi=new Human("ls",18,180.0,140.0);
lisi.makeChange(t,lisi);
System.out.println(t);
System.out.println(lisi.getAge());
Another way to control the program procedure other than “continue” and “break”: “return”
添加一个behavior
public void testLoop(int num){
for(int i=0;i<100;i++){
System.out.println();
}
}
在编译文件中
zhangsan.testLoop(17);
可以看到运行结果正常,输出结果为0-99
再添加两句话
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
添加一个behavior
public void testLoop(int num){
for(int i=0;i<100;i++){
System.out.println();
}
}
在编译文件中
zhangsan.testLoop(17);
可以看到运行结果正常,输出结果为0-99
再添加两句话
[外链图片转存中…(img-8Gnbx6bS-1715619354031)]
[外链图片转存中…(img-xy5lqZCG-1715619354031)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新