类的高级概念


1、访问修饰符:
分为五种情况:本类 同包子类 同包类 外包子类 外包类
举例:自己 儿子 老婆 女儿 陌生人
private: true false false false false
默 认: true true true false false
protected: true true true true false
public: true true true true true

2、get/set方法:
好处:
1、避免自身信息被外部程序修改,将属性变为只读或者只写; 仅设置get方法、set方法
2、对外部用户设定值可以进行有效性控制,set中加判断语句; 在set中加判断条件才能执行设置;
public void setAge(int age) {
if(age > 0 && age <= 100){
this.age = age;
}
}
3、 隐藏信息,猜不到内部是如何保存的,在内部将数据类型进行转换拆解,难以通过get/set方法推断数据保存方式; 举例设置年月日中 将存储的int 类型转换为 String类型输出; 输入String将该类型转化为 int 存储;
public String getBirthDay(){
return this.birthYear + "-" + this.birthMonth + "-" + this.birthDate;
}
public void setBirthDay(String birthday){
/*
* 把字符串birthday拆分为年、月、日三个子字符串,然后转换成int,
* 分别存入到birthYear、birthMonth、birthDate三个属性当中去
*/
}
使 用:1、直接调用get set方法; 在其他方法中调用属性设置,进行记录;
没有get/set方法的 sales 通过
public void addToSales( double s ){ sales += s ; }
2、通过构造器调用统一设定方法,将初始化值,传递给每个属性;
构造其中{ setCommissionRate( 形参 ) }
3、static关键字:凡是static修饰的东西是跟对象没有关系的;只跟类有关系; 插入JVM运行图
1、属性
效果差异:使用static 的属性 所有实例化对象都赋一个值,所有对象共享一个值;
怎么使用
1、使用缺陷:Static在使用中,改变一个值就改变了所有实例化对象的值;
2、在常量的时候使用static比较方便,存一处,处处使用; public static double pi = 3.14;
3、与对象无关的变量,使用static;
2、方法:
public static void selfIntroduce(){
System.out.println( "我叫" + this.name + “,是一个学生” )
}
系统首先报错:this 还没有对象,系统报错; 去掉this后 name也无法调用;
修改: 把name改为static 属性,就可以调用了;
怎么使用
1、 工具类工具方法才会设计为static--与 对象无关,且不改变对象的状态
【举例】:Math.randow; 原因:1、数学是工具,没有数学对象,调用该方法不改变数学中的某个值; 榔头类:在五金店,因功能与对象价值有关,所以是非Static 装修房子中,敲钉子,产生榔头对象与否不重要, 钉钉子(工具方法)行为 不会对榔头 状态产生影响,使用static;
3、static特点:①与对象无关(面向对象中都与对象有关不能设置static/ 在main方法中main()是static的所以必须用static才能被调用!); ②static修饰的东西在加载器有特殊动作;


4、初始化块,实例初始化块
实例初始化块的执行顺序(父类构造器之后,子类构造器之前):---用不上;
实例初始化块产生对象之后,但是在执行构造方法我们写的代码之前被自动调用;
这个效果完全可以通过在构造器开始进行操作完成,所以完全用不上;
静态初始化块;使用地方:做准备工作 / 资源预加载的代码(项目中比较常见) /

5、内部类
认识、了解分类、每种语法特点; 会用内部类会变得很优美; 复杂在:到底什么时候该使用
一、成员内部类
1、 其他类名写法:① 在一个 类文件本身 去除掉 public 可以任意修改类名 但是这个类名不会与类文件名冲突 ②在类本身下面可以再定义其他类;
2、在类文件下的方法体后面还可以定义其他的类, 其中成员内部类可以使用各种访问修饰符,使用后效果和属性、方法、构造是一样的;
3、内部类,在类的内部与属性/方法/构造,处于平行地位; 申明方法:public class Innerl { }; class 文件名:其独立的class文件,命名规则为 外部类的类名+$+内部类的类名;

4、成员内部类内部可以定义各种属性/构造/方法/初始化块/甚至可以再定义内部类;
5、成员内部类当中的属性和方法不能是static的;
6、使用方法
外部类使用: new一个对象的方法一样; (实例化: 内部类 标识符 = this.new 内部类() 调用方法: (标识符. 方法名 ))
外部使用语法: 首先new一个外部内对象: OutClass outC = new OutClass();
然后再使用实例化:( OutClass.内部类 标识符 = outC.new 内部类();) outC不是类名;
内部类使用外部类
情况①在作用域上看,在内部类可以直接使用外部类的属性和方法;
情况②在调用外部类的方法和属性的时候不能使用( this. )-->调用自己了!
情况③存在相同的命名标识符的时候调用外部类的方法: (外部类.this.标识符 = )

二、静态内部类---成员内部类的特例---用static修饰的成员内部类;
在文件命名规则, 使用访问修饰符和内部构成与 成员内部类一致的原则;
区别点:静态内部类可以使用Static的属性和方法
语 法: public static class Inner2 { }
使用方法
外部类使用它: 可以直接使用( 实例化:( 内部类 标识符 = new 内部类(); ) 方法调用:(/ 非静态方法/: 标识符.方法 ) (/ 静态方法/: 内部类类名.方法 ) 在外部类直接被调用;
在类以外使用它非静态方法: (外部类.内部类 标识符 = new 外部类.内部类()); A、 调用普通方法:( 标识符.方法名 )
//无需产生外部类的对象,但要先产生外部类的对象 ?确认
B、调用静态方法: 可以直接点出来: (外部类.内部类. 方法名)
它调用外部类: (外部类 . 方法名) //静态内部类不能操作外部类的非静态属性和方法;只能操作外部类中静态的属性/方法;

三、局部内部类
class Inner3 { }
1、拥有独立class文件 ;命名规则:外部类的类名+$+(序号:1、2、3)+内部类的类名;序列号从1开始;
2、局部内部类没有访问修饰符/ 只能在方法内部使用/; 使用效果和 局部变量 是一样的;
3、内部有非Static属性、 有构造器、 有非static方法; 甚至可以定义内部类;
使用方法
外部内方法中操作:只能在本方法中使用 (实例化一个 i3 // 用( i3. )进行操作)
局部内部类操作外部类
1、在匿名内部类的方法中操作外部类的属性和方法( 外部类. this . 属性 )
2、不能操作外部类方法中的局部变量,只能访问其中的常量

四、匿名内部类:// 由于没有类名, 只能使用1次,在产生它的对象的时候同时去定义它;语法及其特殊;
new Object(){ 定义属性 定义方法 }
1、拥有独立class文件 ;命名规则:外部类的类名+$+(序号:1、2、3);序列号从1开始; 2、没有访问修饰符,没有类名,没有class关键字,
3、匿名内部类产生对象的语法和类的定义语法写在一起,只能用一次;
4、匿名内部类不可以定义构造方法(没有类名); 内部的属性和方法不能是static的;
使用方法:
1、如果想操作它的属性和方法,只能在new出来以后马上操作属性和方法,可以操作私有的属性和方法; new Object() { 方法体 } . 方法 / 属性
匿名内部类操作外部类
1、在匿名内部类的方法中操作外部类的属性和方法( 外部类. this . 属性 )
2、不能操作外部类方法中的局部变量,只能访问其中的常量包括形参
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值