类是什么
- 类和对象的使用三部曲是
创建
实例化
使用 - 通常每个类对应一个源程序,源程序文件名等于类名* (public修饰的类和程序同名)*
- java语言用class关键字来创建类
- 类就是一种自定义的数据类型,可以用来声明变量 (Dog是自定义数据类型 小白是dog类型的变量)
- java语言用new关键字来创建对象
- 对象可以被赋值给相应类型的变量,变量即代表该对象
主类
String[] args是字符串数组参数,cmd里运行字节码Dog.class时输入java Dog aaa,就可以把aaa作为参数传进去,args.length就会变成1
现在我们用DogShow来接收参数,第一个是狗名字,第二个是叫几声
包
每个包都是独立命名空间,一班二班两个包就是两个命名空间,里面可以有相同的类,男生女生
也就是说不同包里类能重复
包有隔离功能
同包的类,互相可见,可以用简单类名直接访问
不同包的类,只有public修饰的,才是可见的
访问不同包的类,必须用全限定类名
导包分两步,先用public修饰再import,import了另一个包同名类自己包里的就要用全限定名了
导包能把那个包里的子包一起导进来吗??
不能默认包不推荐使用的原因是默认包没有全限定名,不能挎包
变量
为什么局部变量要有作用域呢?
限制有效区,名字是稀缺资源
变量是内存空间,一进方法这部分运行空间是一直保留,在方法结束才释放,内存利用率才会提高,所以局部变量的作用域不超过方法
循环变量也是局部变量(能用for就不用while,因为while会需要声明变量)
属性也是变量作用域是哪?
他的作用域是声明语句到大括号,可以覆盖该类的所有方法
既然属性会覆盖局部变量的作用域,怎么避免冲突呢?
就近原则,sum会取局部变量强龙不压地头蛇,要想访问属性sum要加上this.
总结一下:
1.属性,参数和局部变量,是java变量声明的三种形式
2.属性的作用范围始于声明语句,止于类的右大括号
3.不论声明在方法之前或之后,属性作用范围涵盖所有方法
4.属性与局部变量名称冲突时,局部变量优先
5.参数的作用范围涵盖方法的整个代码块
6.参数的第一次赋值发生在方法调用之时
7.只有属性有默认值,参数和局部变量都没有
8.数值类型默认0,布尔类型认false,类默认null
构造方法
用途:
1.创建实例
2.实例的初始化
全是默认值不合适,确保实例状态符合逻辑,比如一个人300岁不符合逻辑,要用到有参构造了
无参构造
我们知道Dog后面跟了()所以是个方法,也就是构造方法
new 和构造方法就是实例化代码,创建新对象
我们知道方法必须先声明后调用
编译器帮我们在字节码里夹带私货就是构造方法
java有个反编译javap.exe这个和javaxc.exe作用相反
构造方法与普通方法有啥差别
他没有返回类型,他会返回新创建的实例对象
方法名称和类名要一模一样
有参构造
初始化实例,添加限制条件
为了减少代码的重复量我们有两种方式解决
1.把重复代码提取成方法
比如验证年龄的我们可以弄成一个方法用this来指代该实例来调用LimitAge方法
这样一来要修改限制就只需要改一个地方了
2.第二种方法是构造方法互相调用,专门解决构造方法代码重复问题
挑一个最最通用的构造方法
把全部参数有效性代码都放到这个最最通用的构造方法
这个this呢看起来像方法名其实是关键字,this后面跟着()代表本类的构造方法,是种特殊的写法
这个时候性别用的固定的字面值true代表是公的
** 构造方法的调用语句必须在第一句**
这是关于面向对象编程的
总结:
1.构造方法可以用来初始化新创建的实例
2.构造方法可以用来为新创建的实例做准备工作
3.this关键字指代本实例,用来区分属性,参数和局部变量
4.重复代码容易导致bug,增加维护工作量,要尽量避免
5.可将重复代码提取为一个万法,以解决代码重复问题
6.构造万法可以互相调用,格式是this关键字加小括号
7.一个通用构造方法,可以避免构造方法中的代码重复
8.对构造方法的调用,必须是第一条语句
访问控制
访问是什么为什么要控制
还用dog类,有姓名年龄和性别,可以对该类的业务逻辑进行限制,比如年龄不超过200
我们发现调用构造语句可以很好的限制Dog的年龄,一旦AccessDemo里的语句染指了Dog
类的实例aHuang,(这个行为就叫访问,AccessDemo访问了Dog类)
他可以1.读属性2.写属性3.调用方法4.创建实例也就是读写属性调用方法
Demo代码里如何访问Dog类
它第一条语句是第一次访问调用了Dog类的构造方法创建了实例aHuang
第二条语句调用了阿黄的自我介绍方法
第三条语句第三次访问写了阿黄的属性值
第四条语句再次调用自我介绍方法
我们可以禁止AccessDemo类写Dog的属性,就可以解决了
把Dog类的age属性变成private(私有的不足为外人道也)
这样别的类写属性就会发现age属性不可见,但Dog类自己还是可以作,写一句this.age=300
private(私有的不足为外人道也)是最严格的,外人甚至连读属性的权利都被剥夺了
private放在方法前,自我介绍方法就是私有的了,别的类不能调用
private放在构造方法前,Dog类变成私用,别的类连调用构造方法创建实例都不能了
private这样的修饰符(modifier)用于修饰访问