JAVA 学习第六天 加油
JAVA面向对象之继承
-
继承需要通过关键字 extends
-
继承的属性和方法,任然要满足修饰符的条件,不同包仍然只能调用public修饰符的方法和属性。
-
如果我就非要在这里调用怎么办呢?
package com.javajicheng.test;
import com.javajicheng.Test1;
public class test1 extends Test1 {
//子类继承,继承不同包下的类
//继承不同包下的类,只能调用修饰符是public的属性或方法,因此可以看到继承仍然得满足修饰符的条件
public static void main(String[] args) {
Test1 test1 = new Test1();
/*可是我就是想在这个包里访问父类的任何修饰符的方法或者属性怎么办呢?
* 只能在父类中声明公共的方法来供子类调用
* 具体是怎么做的呢
* 如果是属性的话,我们可以直接使用public get方法来返回属性,然后在父类调用这个public方法即可
* 如果是方法的话,我们可以public void 调用那个方法,然后在子类就调用这个public方法即可*/
System.out.println("a2:" +test1.a2+"\ta1:" +test1.getA1()+
"\ta3:" +test1.getA3()+
"\ta4:" +test1.getA4());
/*调用原本的private方法s2*/
test1.getS2();
//调用原本的public方法s1
test1.s1();
}
}
package com.javajicheng;
public class Test1 {
public int a2 = 100;
protected int a4 = 10000;
int a3 = 1000;
//此类父类
private int a1 = 10;
public int getA1() {
return a1;
}
public int getA3() {
return a3;
}
public int getA4() {
return a4;
}
public void s1() {
System.out.println("我是方法public:s1");
}
private void s2() {
System.out.println("我是方法private:s2");
}
void s3() {
System.out.println("默认方法:s3");
}
protected void s4() {
System.out.println("我是方法protected:s4");
}
public void getS2(){
s2();
}
}
总结:想要改变修饰符为public,就写一个公共方法,返回或调用原本修饰符的方法或属性即可。
子类必会调用父类的构造器,完成父类的初始化
-
如果你的父类有构造器的时候,在你new一个子类得时候,它必然会调用父类的构造器,完成父类的初始化操作 。 如果父类没有构造器,啥也不输出,啥也不是。
-
当创建子类对象时,不管子类有多少个个数的参数的构造器,默认情况下总会调用父类中的无参构造器,如果父类没有无参构造器,则必须在子类所有的构造器中使用super去指定使用父类的哪个构造器(传什么参数就是使用哪个) 去完成对父类的初始化操作,否则,子类的构造器会报错,编译不通过。
-
-
显视使用super();的时候必须放在子类构造器的第一行。
-
super();只能在构造器中使用。
-
为什么new一个子类的时候,一定会调用父类的构造器呢?
答:其实编译器,在我们编译子类的时候,它自动生成并隐藏了一个叫super(); 的方法,此方法就是完成父类初始化操作的方法,它会默认调用父类的无参构造器,由于它是被隐藏的,因此必定会调用。 -
父类构造器的调用不限于直接父类
答:它会一直往上找,一直到object截止,然后一次返回父类的构造器。 -
JAVA中子类最多只能直接继承一个父类,即只能extends一个父类。
-
那么如何让A继承B,同时A又继承C呢?
答:其实很简单,只需要让B继承C即可,那么A就获得了C的所有属性和方法。
继承的本质(重要)
- 问题引出:当子类继承父类,创建子类对象时, 内存中发生了什么?
继承的本质 - 例子:
package com.javajicheng.test;
public class test3 {
public static void main(String[] args) {
//执行会发生什么
B1 b1 = new B1();
}
}
class A1{
public A1(){
System.out.println("a");
}
public A1(String name){
System.out.println("a name");
}
}
class B1 extends A1{
public B1(){
//这里因为写了this就不存在super了
this("ABC");
System.out.println("b");
}
public B1(String name){
//super被隐藏了,但是是有的
System.out.println("b name");
}
}
输出:
a
b name
b
快捷键 CTRL+H查看类的关系表
super的使用
- 访问父类的属性,但是不能访问private属性,方法:super.属性名
- 注意:当子类中有和父类中同名的属性或方法,为了访问父类的成员属性或方法,必须使用super.属性名,其他不重名的可以直接访问(this啊、直接名字啊)
- 访问父类的方法,但是不能访问private方法,方法:super.方法名
- 访问父类的构造器,当父类有含参构造器的时候子类必须创建构造器,且必须引用父类的构造器,以初始化父类。此时你可以直接在子类使用快捷键创造构造函数,IDEA会自动使用super(),如果就父类就一个含参构造器的话,如果有多个构造器,那么你可以在super中指定参数来匹配不同的构造器。
- -super的访问不限于直接父类,如果父类中没有与子类同名的属性,那么它会继续向爷爷寻找,如果爷爷有与本类同名的属性,那么它就会引用爷爷该属性的值。
this和super的关系
JAVA之方法重写
子类和父类方法名、参数要一致
- 子类的方法的参数、方法名称要和父类的参数、方法名称相同,返回值类型可以不同,但必须是父类的子类,比如父类是object子类可以是String。
子类不能缩小父类的访问权限
- 子类方法不能缩小父类的访问权限(重写的时候)。
吃过饭后,我突然脑子里出现了一个问题,那就是我们在写程序或者看视频的时候,总会遇到一些变量要用get或set方法,为什么不直接用public呢?反正都是能查到结果或者更改变量,于是我上网查了查,找到了一位前辈的总结:为什么用Set和Get而不用Public的原因