java的类与对象
《概念》
类就是一大类概念:比如人,猫,笔等很广泛的概念
对象就是一大类中单独的个体:比如 次林梦叶作为人是个单独的个体
《类与对象在JVM中的内存机制与创建过程》
上面就如同c++一样
《关于成员方法》
访问修饰符可以用来控制方法的使用范围
返回数据类型:
当要返回多个数据时应该怎么办?
在java中方法的返回值甚至可以是数组:如
public int [] getArr(){},当要返回多个数据时只要将数据存放到数组中返回即可
《底部传参机制》
结论:
《重载》
关于printIn,会发现他可以打印各种不同的数据类型,原因如下:我只在文档中截取了一部分:
会发现很多方法其都叫做printIn,只是他们的传参不同而已
《注意点》
如果返回类型不同,其他均相同也不构成重载
如 public int sum(int a.int b){}
public void sum (int a,int b){} 这两个方法是不构成重载的
《可变参数》
如下图中就是可变参数的作用,可变参数本质上就是个数组:
所以我们传参数还可以直接传数组:
《注意点》
《全局变量与局部变量》
《构造器》
写法如下:
《构造器的调用顺序》
构造器调用顺序是在加载完普通变量与方法之后调用
《this的引出》
上面代码有一个挺烦的地方就是:
在构造器中的传参总要写与类中的属性不同的名字,如果不写:
结果:
这个是因为当变量名字相同区分不开时,开始就近原则;
这里相当于传过来的参数,自己给自己付了一遍值
没有影响到类的属性,其还是默认值;
为了解决这个问题:
《this的使用》
其中访问构造器的语法还是有点意思:
《this在构造器中的使用》
答案:c,d;
《包》
《创建方法》
然后在com这个软件包下就有了itsname的软件包;
《日后学习深入理解包》
在记事本中我有如下代码,并且命名为A.java
然后我执行如下DOS命令:
生成如下:
然后我执行:
这个是因为在打包后其真实的类名为a.b.x.App
这个是因为计算机真的会去找a目录下的b目录下的x目录下的App.class
但是直接javac A.java会使生成的class文件直接在,这个当前的目录下
正确的做法是:
“.”表示当前目录,-d .表示将class文件放在指定的文件中
如果没有这个文件,则生成,则有如下效果:
《访问修饰符》
外部类为什么不能使用protected、private修饰:
1.不能用private:
对于一个外部类,用private修饰是没有意义的。因为如果使用private修饰外部类,其它类就不能访问的这个类,那么这个类就不能创建实例,这个类的属性和方法就不能被外界访问,所以没有意义。
2.不能用protected:
protected是用来修饰类中的属性和方法的,不是用来修饰类的。假如定义一个A类用protected修饰,再在与A类不同包的另一个保重定义一个B类,B类如果要继承A类,前提是B类能够访问到A类。仔细想想就会发现这是冲突的。(你要成为A类的子类,你的先访问到A类,但你要访问到A类,那你先得成为A类的子类。因为protected修饰的类就是给子类访问的)这个逻辑明显是冲突的。
所以不仅是外部类,普通类也不能用protected修饰。
这时肯定有人会说:把B类放在A类同一个包下,那B类不就可以访问到A类了吗?
但是:如果你把B类放在和A类同一个包下,那和用default修饰A类有什么区别,既然和default没有区别,那干嘛还要用protected修饰A类,而且protected本身可以跳出同一个包访问的意义也不存在了,所以用protected修饰类是没有意义的。
《日后学习的改进》
来观察一下protected这个修饰符,其最大的给与权限是:不同包下的子类可以访问
我有两个类:
可以看到当我用PowerTest02去继承PowerTest01的时候,我在PowerTest02中写了个PowerTest01对象
其访问自己上的属性num居然会报错,这是因为这依然要遵守跨包访问的准则:
因为PowerTest01不是PowerTest01的子类,只能访问外包中public类的public成员
而PowerTest02是PowerTest01的子类可以正常访问num