------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! 面向对象之继承
一:继承(extends)
(1)继承的体系结构:就是对要描述的事物进行不断的向上抽取,就出现了体系结构。
要了解这个体系结构中最共性的内容,就看最顶层的类。
要使用这个体系的功能,就用最底层的类创建对象。
(2)继承的好处:
A:继承的出现,提高了代码的复用性。
B:继承的出现,让类与类之间产生了关系,extends来表示,这个关系的出现,为后面我们讲面向对象的第三个特点多态打下了基础。
(3)特点
A:java只支持单继承(其实确切的说是java对多继承进行了优化,避免了安全问题)。
B:java支持多重(层)继承。
(4)注意:
A:子类可以直接访问父类中的非私有的属性和行为。
B:不要仅为了获取其他类中部分功能而去继承。
C:类与类之间要有所属( " is a " )关系,xx1是xx2的一种。
如何判断A和B是否有继承关系?
A如果继承B,那么就可以说A是B的一种。
二:继承后子父类之间成员的关系
(1)成员变量
1 class Fu{ 2 3 int num = 5; 4 5 } 6 7 8 9 class Zi extends Fu{ 10 11 int num = 20; 12 13 14 15 16 17 public void show() { 18 19 int num = 30; 20 21 System.out.println("num:"+num); 22 23 //当局部变量和成员变量重名的时候用this来区分 24 25 System.out.println("this num:"+this.num); 26 27 //当子类和父类出现了同名变量,用super来区分 28 29 System.out.println("father num:"+super.num); 30 31 } 32 33 }
总结:在一个类中如果方法中的局部变量和方法外的成员变量重名,那么如果在方法内输出这变量,就是方法自己的变量里的值,想要区分要用this,加上this.就是输出成员变量的值
在子父类中如果出现成员变量重名的时候,在子类输出会输出自己的变量里的值,想要区分要用super,加上super.就是输出父类里变量的值
this和super的区分:
this代表本类对象的引用
super本类对象父类的引用。
this可以用于区分局部变量和成员变量同名的情况。
super可以用于区分子类和父类成员变量同名的情况。
一般,子类中不会出现和父类同名的成员变量。面试可能问到。
(2)成员方法
1 class Fu { 2 3 public void show() { 4 5 System.out.println("fu show"); 6 7 } 8 9 public void method() {} 10 11 } 12 13 14 15 class Zi extends Fu{ 16 17 18 19 public void show(){ 20 21 22 23 System.out.println("zi show"); 24 25 } 26 27 }
子类中存在和父类成员方法同名的这种现象,叫做重写,复写,覆盖。
重写(override)和重载(overload)的区别:
重载的特点:
1, 在同一类中。
2, 方法名相同,参数列表不同。
重写的特点:
1,要有继承关系。在子父类中
2,方法的声明相同。(方法名和参数列表都相同)
3,覆盖时,子类方法权限一定要大于等于父类方法权限
父类的权限不能是私有的
静态只能覆盖静态。
(3)构造方法
1 class Fu{ 2 3 4 5 Fu(){} 6 7 8 9 Fu(int age){ 10 11 System.out.println("father age:"+age); 12 13 } 14 15 } 16 17 18 19 class Zi extends Fu{ 20 21 Zi(){ 22 23 this(40); 24 25 System.out.println("son"); 26 27 } 28 29 30 31 Zi(int age){ 32 33 super(); 34 35 System.out.println("son age:"+age); 36 37 } 38 39 } 40 41 42 43 Zi z = new Zi(); 44 45 46 47 Zi z = new Zi(30);
总结:子类中所有的构造方法默认都会访问父类中空参数的构造方法。
因为每一个构造方法的第一行都有一条默认的语句super();
当父类中没有空参数的构造方法时,子类的构造函数必须通过this
或者super语句指定要访问的构造方法。或者手动提供无参构造方法。
this(...):调用本类中的构造方法
super(...):调用父类中的构造方法
构造方法用于创建对象,并进行初始化.建议如果你写了有参的构造函数,也要把空参的构造函数再手动加上
否则你定义了有参的构造函数,空参的系统就不会再给了
你这样创建对象的时候就会报错Person p = new Person();//这句话是会去找空参的构造函数
1 class Person{ 2 3 Person(){} 4 5 6 7 Person(int age){ 8 9 this.age = age; 10 11 } 12 13 14 15 Person(int age,String name){ 16 17 this(age); 18 19 //this.age = age; 20 21 this.name = name; 22 23 } 24 25 } 26 27 28 29 //Person p =new Person(); //系统默认给出无参构造 30 31 32 33 //当你手动给出构造方法后,系统就不会再给出默认的空的构造方法。 34 35 36 37 38 39 手动无参数,如果你想给属性赋值或者做一些初始化,无参你别删不就行了吗。 40 41 class Demo{ 42 43 private String name; 44 45 Demo(){} 46 47 48 49 public void setName(String name){ 50 51 this.name = name; 52 53 } 54 55 56 57 public String getName(){ 58 59 return name; 60 61 } 62 63 } 64 65
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------