Android菜鸟饭团#Java中文学习#第十五课 活动笔记
1. 继承 子继承父类的全部,且子又有自己的 继承的定义: java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。 (1)无法继承private修饰的属性和方法。 (2)无法继承父类的构造方法// (3)为什么要继承? (4)答:通过继承可以使对对象的描述更加清晰,可以实现代码的复用,可以实现重写类中的变量或方法,可以实现在无源代码的情况下修改被继承的类。 (5)Java的类如何实现继承? (6)答:Java类的继承是单一的,也是完全继承的。通过关键词extends关键字来实现。被继承的类称为父类,继承父类的类称为子类。继承语法:public calss classname extends superclassname.因为Java类的继承是单一的,所以extends后面只能指定一个父类。而完全继承则是指“一个类继承了父类的所有成员变量和成员方法。 2. Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。 private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问 default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下。 ,只允许在同一个包中进行访问。 protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。 public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。 【注意】修饰class时只能用public和default(不写)。
3.重写 重写方法的规则: 1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。 2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。 3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private) 4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如: 父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。 在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。 但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。 方法重写又称方法覆盖。 (2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。 重写的主要优点是能够定义某个子类特有的特征: public class Father{ public void speak(){ System.out.println(Father); } } public class Son extends Father{ public void speak(){ System.out.println("son"); } } 而重载的规则: 1、必须具有不同的参数列表; 2、可以有不责骂的返回类型,只要参数列表不同就可以了; 3、可以有不同的访问修饰符; 4、可以抛出不同的异常; 重写与重载的区别在于: 重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。 用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.
4.super关键字主要有以下两种用途。 1.调用父类的构造方法 子类可以调用由父类声明的构造方法。但是必须在子类的构造方法中使用super关键字来调用。其具体的语法格式如下: super([参数列表]); 如果父类的构造方法中包括参数,则参数列表为必选项,用于指定父类构造方法的入口参数。 下面将以5.4.3节介绍的实例为例介绍如何在子类中调用父类的构造方法。 class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();//调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); } public static void main(String argv[]) { Checket c = new Checket(); } } 2.操作被隐藏的成员变量和被覆盖的成员方法 如果想在子类中操作父类中被隐藏的成员变量和被覆盖的成员方法,也可以使用super关键字,具体格式如下: super.成员变量名 super.成员方法名([参数列表]) 例如, class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Hefei"; super.value();//不调用此方法时,super.name返回的是父类的成员变量的值null System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); } } 注意:1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. super和this的异同: 1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) 3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参) 4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名) 5)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。 6)super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。 7)super()和this()均需放在构造方法内第一行。 8)尽管可以用this调用一个构造器,但却不能调用两个。 9)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。 10)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。 11)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。 必须满足以下四条规则: - 子类的构造过程中必须调用父类的构造方法
- 子类可以在自己的构造方法中用super调用父类的构造方法,并且必须放在子类构造方法的第一行。 如果用this则调用本类的其它构造方法。
- 如果子类的构造方法没有显示的调用父类的构造方法,系统默认调用无参数的构造方法。
- 如果子类中既没有显示调用父类的构造方法,父类中也不存在无参数的构造方法,则无法编译通过。
例子: 1. class FatherClass { 2. private int n; 3. 4. FatherClass() { 5. System.out.println("FatherClass"); 6. } 7. 8. FatherClass(int n) { 9. System.out.println("FatherClass" + n); 10. this.n = n; 11. } 12. } 13. 14. class ChileClass extends FatherClass { 15. private int n; 16. 17. ChileClass(int n) { 18. // 如果注释了super()已经父类的无参数构造方法则报错 19. // super()不放首行也报错 20. super(); 21. System.out.println("ChileClass" + n); 22. this.n = n; 23. } 24. 25. ChileClass() { 26. super(300); 27. System.out.println("ChileClass"); 28. } 29. } 30. 31. public class SubSuper { 32. public static void main(String[] args) { 33. ChileClass sc1 = new ChileClass(); 34. ChileClass sc2 = new ChileClass(400); 35. } 36. } 输出结果: FatherClass300 ChileClass FatherClass ChileClass400
class Person { public static void prt(String s) { System.out.println(s); } Person() { prt("A Person."); } Person(String name) { prt("A person name is:" + name); } } public class Chinese extends Person { Chinese() { super(); // 调用父类构造函数(1) prt("A chinese.");// (4) } Chinese(String name) { super(name);// 调用父类具有相同形参的构造函数(2) prt("his name is:" + name); } Chinese(String name, int age) { this(name);// 调用当前具有相同形参的构造函数(3) prt("his age is:" + age); } public static void main(String[] args) { Chinese cn = new Chinese(); cn = new Chinese("kevin"); cn = new Chinese("kevin", 22); } } 继承的定义: java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。 注意:JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。 实例://建一个A类 class A{ //成员变量 其中num是实参 int num=0; //成员方法,其中 i 是型参 public A(int i){ //输入int型文件输出下面 System.out.println("aaaaaaaaaaaaaaaaaaa"); System.out.println("i= "+i); //把输入的i赋值给成员变量num num=i; } } //B继承A class B extends A{ int num=0; //成员方法B. public B(){ //继承类A的方法.因为B继承了A必然继承了A的特性.所以输入int值10令方法实现. super(10); System.out.println("bbbbbbbbbbbbbbbbbbbb"); //这里的num是类B的. System.out.println("num= "+num); //如果想显示类A的num则需要用下列的super.num.这里注意num在类A中需是成员变量才可以. System.out.println("super.num= "+super.num); } } //建立测试类C public class C{ //main public static void main(String aa[]){ //new 一个对象B() new B(); } } Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。 private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问 default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下。 ,只允许在同一个包中进行访问。 protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。 public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。 注意:修饰class时只能用public和default(不写)。 Super:子类的构造的过程中必须调用其父类的构造方法。(super语句) 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();//调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); } public static void main(String argv[]) { Checket c = new Checket(); } } 2. 在Java中,有时还会遇到子类中的成员变量或方法与超类(有时也称父类)中的成员变量或方法同名。因为子类中的成员变量或方法名优先级高,所以子类中的同名成员变量或方法就隐藏了超类的成员变量或方法,但是我们如果想要使用超类中的这个成员变量或方法,就需要用到super. class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Hefei"; super.value();//不调用此方法时,super.name返回的是父类的成员变量的值null System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); } } 为了在子类中引用父类中的成员变量name和方法value(),在代码中使用了super、super.name和super.value(),若不调用super.value()时,super.name返回父类成员变量默认值null,调用此方法时,super.value()方法把成员变量name赋值为China,再利用super.name调用父类的成员变量的值。 另外,要注意的是super.name调用的是成员变量的值, class Country { String name="xianfan"; String value(String name) { name = "China"; return name; } } class City extends Country { String name; String value(String name) { name = "Hefei"; super.value("失败");//不调用此方法时,super.name返回的是父类的成员变量的值null System.out.println(name); System.out.println(super.name); return name; } public static void main(String[] args) { City c=new City(); c.value("成功"); } } 结果为:Hefei xianfan 此时,super.name返回的值是父类成员变量的值xianfan,而此时的super.value()方法是不起作用的。
【书记员:刘鑫】 每一个技术小白都有一个成为大神的梦想,现在Android菜鸟饭团就给你这个成就梦想的机会。我们提供最新的Android技术教学,只要你又耐心和毅力就一定会在这里有所收获。 Android菜鸟饭团由南阳GDG组织发起,秉承着开放、分享、创新的原则,希望通过GDG社区的力量能够给更多的想要学习Android开发技术的小白们创造一个学习,交流,分享的环境。同往常的GDG活动一样,我们依然是任性的一个子都不要,并且还在周六的分享中提供盒饭和不定期的惊喜小礼物呦~所以快来加入我们吧,为你的大神梦想迈出第一步。
|