学习记录16面对对象
static
static修饰属性时,该属性就对所有该类的对象共有。
特点:被该类所有对象共享
调用方式:
1.实例化对象调用;
2.类名调用
只需要实例化一次,就一直是这个值。
比如:实例化了三个对象,s1,s2,s3。对象那个所属的类中的属性,其中有一个属性比如年龄是static修饰的,那么当对s1的年龄属性赋值23后,其他所有的对象的年龄属性都是23,并且在以后的赋值中,会被覆盖。

覆盖

类名调用:由此一般情况不会单独赋值,在前面,利用类名直接对公共且静态的属性赋值

无论是方法还是属性,静态与非静态的区别就是,静态谁用谁就去拿,面对的是所有实例化对象;而非静态之单独面对,需要实例化对象单独调用。
若属性符合“需要被共享”的特点,那么就可以被共享,用static来修饰。具体业务场景具体分析。
工具类
javabean类
描述一类事物的类。包括属性,无参、全参构造其,get/set方法,必要时书写成员方法
测试类
用来检查其他方法书写是否正确的类,带有main方法的类,是程序的入口
工具类
不用于描述事物,用于帮我们做一些事情的类
工具类命名规则:
1.见名知意
2.私有化构造方法.(构造方法一旦私有化,那么在外界就不能再创建这个类的对象了。因为创建它的对象没有什么实际意义)
3.方法用static修饰
static注意事项
1.静态方法只能访问静态内容和静态方法
2.非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量(非静态属性)和非静态的成员方法
3.静态方法中是没有this关键字的
总结:
1.静态方法中,只能访问静态
2.非静态方法可以访问所有
3.静态方法中没有this关键字
this.属性,代表的是类中的属性,语句this.属性 = 值1;意为,类中的这个属性被赋值为了值1,而调用成员方法或是调用get/set方法都是通过实例化的对象或者实例化语句来调用的,是一种专属的关系,所有this就等价于这个实例化对象或者实例化语句。
静态属性和方法,是随着类的加载而加载的,是同时的;非静态属性和方法,是只有当对象调用访问时再开始被加载,或者按照顺序在main中被执行
重新认识main
1.public:被jvm调用,访问权限足够大
2.static:被jvm调用,不用创建对象,直接类名调用;因为main方法是静态的,所以main中其他方法也必须是静态的
3.void:被jvm调用,不需要给jvm返回值
4.main:一个通用名称2,虽然不是关键字,但会被jvm识别
5.String[] args:以前用于接收键盘录入数据的,现在没用,但为了向下兼容,依然保留了
继承
封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。我们为了把零散的数据以及部分方法统一起来,于是将它们都放到一个类中,而这样的行为又是基于某一个对象来实现的,是对对象服务的。但有时会有不同的对象,可他们很多的属性或方法是相同、类似的,为了避免重复代码,我们就将这些相同点整合起来,再创建一个类,就叫做父类。我们可以看出,是由各个子类中提取共同点形成父类,但代码实现,确实相反,我们必须让子类去继承父类,形成了有父类才有子类的思维。当然如果单从继承这个概念出发来说的话,就是子承父业。
集成的关键词是extends,如,Student extends Person,前者是子类(派生类),后者是父类(基类或超类)。
优点:
1.提高代码复用性
2.增加功能,强大子类功能
继承的学习主要有两点?
1.自己会设计继承
2.如何使用别人设计好的继承
什么时候用继承?
1.当类与类之间,存在相同的内容,2.并满足子类是父类中的一种,就可以考录继承
子类必须是父类当中的一种,如,学生的姓名,年龄,学号,;老师的姓名,年龄,教师号。那么我们可以把姓名,年龄提取出来放到一个叫person的类中;但,如果是学生的id,名字,与手机的id,名字,那么那么时候就不能把id和名字属性给提出来
格式:public class 子类 extends 父类 {}
继承后的特点:1.子类可以得到父类的属性和行为,子类可以使用它们;2.子类在父类的基础上可以再新增其他功能
继承的特点:
Java只支持单继承/不支持多继承/但支持多层继承
单继承就是指一个子类只能继承一个父类,子类不能同时继承多个父类;多层继承就是a继承b,b继承c类。我们称b是a的直接父类,c是a的间接父类;java中所有的类都直接或间接继承于Object类。
继承体系的设计 书写代码时,一层一层地写

基于上述需求,获得一下代码
测试代码:

各类继承:


私有方法只能在本类中使用。所以说,子类只能访问父类中非私有的成员方法,而私有属性还是可以通过get/set方法来访问的
继承到底能够继承父类中的那些内容?

一.先看父类中有哪些内容:
1.构造方法:不管有没有修饰符,子类都是无法继承的
2.成员变量:不管有没有修饰符,子类都可以把成员变量继承下来,但,能否调用访问是另一回事(get/set方法,这是在private修饰的情况下 )调用时,不仅将main方法放到方法区,连同父类的字节码文件一同放入了;在内存堆中,不仅放入子类自己的成员变量,还将父类的成员变量一同放入,并且这在堆内存中被分为了两个区域
3.成员方法:非私有可以继承(调用方式分情况),私有无法继承
成员方法的继承。jvm在底层做了优化,从最顶层的父类开始设立了一个虚方法表,存放到虚方发表中的方法满足以下条件(1.非private;2.非static;3.非final),而后将虚方法表下传,子类将符合条件的方法再加进去。这样一来,子类对象在调用方法时,jvm就在这个表中寻找可以使用的方法,而非一个类一个类的依次向上寻找
继承中:成员变量的访问特点
访问成员变量时,现在局部找该变量,如果没有就到本类当中去找,本类没有就到父类当中过去找,再没有就报错
当多个变量重名时,调用方式如下:(不重名时,依然是遵循就近原则)

super调用表示在父类当中的变量。在子类当中最多只能调用一个super
特点:
1.就近原则,按局部->本类->父类的顺序获取那个唯一的变量(非重名)
2.按局部->本类->父类的顺序获取最近出现的变量
this就是在本类中找,没有的话去父类;super就是在父类中找,没有的话就报错
继承中:成员方法的访问特点
特点:
1.直接调用遵循就近原则(非重名)
2.super调用,直接访问父类(重名方法,且,最高层也只能访问到父类)
如果测试类中有同名方法的话,还是最先调用测试类中的方法
this就是在本类中找,没有的话去父类;super就是在父类中找,没有的话就报错(与前面成员变量的调用基本相同)
方法重写:当父类中的方法不满足子类的需求时,就要进行方法重写,用@override注解
方法重写的本质:
每一个类下面都有一个虚方法表,子类继承时会继承下来,并在此基础上添加自己满足条件的方法;而当子类进行方法重写后,那么子类中的方法就会进行覆盖,即是,覆盖掉父类当中的同声明方法
方法重写注意事项及要求:
1.重写的方法名、形参列表必须与父类当中的一致
2.子类重写父类方法时,访问权限必须大于等于父类(即,如果父类的方法由protected修饰,那么子类中的重写方法就得用public/protected修饰,规则:public>protected>空着不写)
3.方法重写时,返回之泪信封必须小于等于父类的返回值
建议:重写的方法尽量和父类保持一致(“返回值类型”、修饰词)
5.私有方法不能被重写(不能被覆盖);换句话说,私有方法根本就不满足需方发表的要求,而方法重写却是基于学方法表的概念而生的
6.子类不能重写父类的静态方法(不能覆盖,与上同理)
继承中:构造方法的特点
1.父类中的构造方法不会被子类继承
2.子类中所有的构造方法默认先访问父类中的无参构造,再访问自己的
为什么呢?根据继承的关系,我们知道无论是何种修饰词修饰父类的属性,子类都会将父类中的属性继承下来,而无参构造器在类中的作用不就是为属性赋值,如果父类中的属性没有值的话,那么子类就没有东西可以继承,所以,子类中的所有无参构造器会默认先访问父类中的无参构造器,目的是为给父类中的属性赋值,避免出错
怎么调用父类构造方法?
子类构造方法的第一行语句默认为:super(),不写也存在,且是在第一行的
情况一:测试类中创建子类对象,并调用子类无参构造器(前面说了父类的构造器是无法继承的,是通过子类的无参构造器访问的,无参构造器的这种访问是默认的)

情况二:带参构造,在测试类中创建对象时就直接赋值。
首先是需要在子类中创建带参构造器,(前面说了父类的构造器是无法继承的,是通过子类的无参构造器访问的,无参构造器的这种访问是默认的;而子类的有参构造器也是需要先访问父类的有参构造器的,与前者不同的是,这里的访问必须手动设置)语句如下:

要清楚,为什么必须要先访问父类中的构造器,因为子类中没有属性,子类继承的属性来源于父类
特点:
1.子类不能继承父类的构造器,只能通过super来调用
2.子类无参构造器的第一行,有一个默认的super()
3.默认先访问父类中无参构造器,在执行子类无参构造器
4.如果想访问父类有参构造,必须手动书写super(形参类型 形参值;...),并且写在第一行
this、super
- this:理解为一个变量,表示当前方法调用者的地址值
- super:代表父类所在的存储空间
![]()
可以利用this访问本类的其他构造,换言之,就是用它调用有参构造器。


浙公网安备 33010602011771号