黑马程序员--Java基础之面向对象(下)

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!


Java面向对象整理(内容实在是不少,小妞分上下两部分吐血整理)


一、继承

继承(掌握)
(1)把多个类中的相同的属性和行为进行抽取,封装到一个类中,
  然后再建立新类的时候,不需要从头做起,继承刚才定义的那个类即可。
(2)好处:(面试)
A:提高代码的复用性。
B:让类与类之间产生了一个关系,是多态的前提。
(3)继承的特点:(面试)
A:Java只支持单继承,不支持多继承。
为什么?如果支持多继承,当多个父类定义了相同功能,但功能内容不同时,不确定要运行哪一个,就会有调用不明确的问题。
B:Java支持多层(重)继承。


(4)什么时候使用继承?
A:如果类之间存在着:
is a 的关系,就可以考虑使用继承。
B:不要为了继承部分功能,而去使用继承。


通过继承,子类可以使用父类的非私有的成员(成员变量和成员方法)
(一)this、super
1.this
A:概念:用于在方法中访问对象的其他成员;
B:用法
a.调用成员变量,解决与局部变量名称冲突问题;
b.调用成员方法,
eg.
this.show(name,age);
c.调用构造方法,
eg.
this(参数);
注意点:1.这种调用形式只能在构造方法中调用其他构造方法时使用,不能在成员方法中使用;
2.此语句必须位于构造方法的第一句;
3.不能在一个类的两个构造方法中使用this相互调用,这样会形成类似死锁。
2.super
A.概念:调用父类成员。
B.用法:
super:子类想要调用父类中与自己重名的成员时


注意:通过super调用父类的构造方法的代码必须位于子类构造方法的第一行,且只能出现一次

super和this的区别?
A:super是一个关键字,代表父类的存储空间的标识。(可以理解为父类对象的引用)
B:它和this的用法相似
a:成员变量
this.变量 -- 本类的成员变量
super.变量 -- 父类的成员变量
b:构造方法
this(...) -- 本类的的构造方法
super(...) -- 父类的的构造方法
c:成员方法
this.方法名() -- 本类的
super.方法名() -- 父类的

应用场景:
this:局部变量把成员变量隐藏/需要用到当前类对象的时候
super:子类想要调用父类中与自己重名的成员时

下面对this的作用描述错误的是  D
A. 当成员变量和局部变量重名的时候可以用this区分  √
B. this()语句必须放在构造函数的第一行,根据this后面括号中的参数调用本类其他的构造函数.   √
C. this可以调用本类的一般函数   
D. this可以调用父类的一般函数 

下面关于 this和super描述正确的是  C
A、都可以用在main()方法中
B、都是指一个对象的内存地址
C、不能用在main()方法中   
D、意义相同   错

(二)子父类成员变量/方法的用法  重写
1.子父类中成员变量的用法:
A:名称不同,这个太简单了。
B:名称相同,子类对象在使用的时候(就近原则):

先找子类局部范围
再找子类成员范围
最后找父类成员范围


this代表本类对象的引用,super代表父类对象的引用


2.子父类中成员方法的用法:
A:名称不同,这个太简单了。
B:名称相同,子类对象在使用的时候:
先找子类的
再找父类的
C:方法重写
在子类中,方法声明(修饰符(权限修饰符不一定),返回值,方法名,参数列表)
与父类中方法声明相同的情况。


注意事项:
a:父类中私有方法是不能被重写
b:子类方法的访问权限一定要大于等于父类的访问权限
c:静态只能重写静态。(这个不能算,因为静态跟类相关)


重载:只看同名函数的参数列表
重写:子父类方法要一模一样


面试题:方法重载和方法覆盖的区别


方法重写是在子父类两个类中实现的,实现的是方法的覆盖,两个方法是完全一样的;
方法重载是在同一个类中实现的,实现的是方法的并列存在,两个方法只是名字一样,而方法参数类型或者参数个数至少有一个不同。


(三)final关键字
final(掌握)
(1)是一个关键字,可以用于修饰类,成员变量,成员方法。
(2)特点:
1.它修饰的类不能被继承。
2.它修饰的成员变量是一个常量。public static final int A = 2; 
3.它修饰的成员方法是不能被子类重写的。


1.可以修饰类:
被其修饰的类不可以被继承;因为final类的成员方法没有机会被覆盖,默认都是final的。
但是final类中的成员变量可以被定义为final或非final形式。在设计类时候,如果这个类不需要有子类,
类的实现细节不允许改变,那么就设计为final类。
 

2.可以修饰变量(注:成员是否被final修饰并不影响被子类继承,子类是否能继承取决于类以及成员的权限修饰符):
 注意点:
A.当变量为基本类型变量:
被其修饰的变量是一个常量,只可以赋值一次,可修饰成员变量以及局部变量,此时决不可进行++、--等类似的运算;
===>final修饰的成员变量没有初始化值,只能显示初始化;可以在定义时赋值,也可在构造方法中赋值。
   只要在构造方法结束前给赋值就OK。
B.当变量为引用类型变量(对象):
被其修饰的变量是一个地址常量,也就是说它指向的地址是不变的,但是地址里面所存的数据是可以变化的;
即对象地址不能被修改,对象内部的成员可以被修改,被定义为final的对象引用只能指向唯一一个对象,
不可以将它再指向其他对象,但是一个对象内部的值却是可以改变的。

3.可以修饰函数(注:成员是否被final修饰并不影响被子类继承,子类是否能继承取决于类以及成员的权限修饰符):
被其修饰的方法不可以被复写;final不能用来修饰构造方法。


4.方法内部类只可访问该局部被final修饰的局部变量。
(四)子父类中构造方法的用法
super();使用父类中的构造函数
子类中所有的构造函数默认第一行都是super();
当父类中没有空参数的构造函数时,子类必须手动通过super语句来指定要访问父类中的构造函数
this(); 调用本类中的构造函数
子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数
子类中至少会有一个构造函数会访问父类中的构造函数


子父类中构造方法的用法:
A:子类的初始化过程中,首先回去执行父类的初始化动作。
  因为子类的构造方法中默认第一行有一个super()。
为什么要这样呢?子类要使用父类的成员变量,这个初始化,靠父类完成,必须在子类初始化之前完成。
所以,子类的初始化过程中,会先执行父类的初始化。
B:如果父类没有无参构造方法(这时有两个目的:1,完成对super()的覆盖;2,完成子类自身的初始化)
A:使用super(参数)调用父类的带参构造。推荐方式。
B:使用this调用本类中的其他构造函数。
此时特别注意:
1.因为父类中没有无参构造了,所以子类的每个构造函数中必须至少有一个super(参数)或者this(参数或者无参),
 否则会自动默认有super(),而实际上已经没有super()了,所以编译会报错!!
2.如果子类有多个构造函数,则其中至少有一个构造函数必须是引用super(参数)的,这样其它子类构造函数中若都是引用this(参数或者无参),
 这样就可以形成环,而如果都是引用this(参数或者无参),则形成类似死锁的东西,导致子类构造函数之间互相调用而没去调用父类构造函数,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值