标签:
修饰符如果是public,则该类在整个项目中可见;若无public修饰符,则该类只在当前包可见;不可以使用private和protected修饰类。
"Super(name);"表示调用父类pet的有参构造方法,还可以使用super关键字调用直接父类的方法,如"super.print()"。
Java中只支持单继承,即每个类中只能由一个直接父类。继承表达的是is a的关系,或者说是一种特殊和一般的关系,如Dog is a Pet。
在Java中,所有的Java类都直接或间接的继承了java.lang.Object类。Object类是所有Java类的祖先。在定义一个类时,如果没有使用extends关键字,那么这个类直接继承Object类。例如,public class MyObject{}表明:MyObject类的直接父类为Object类。
在Java中,子类可以从父类中继承到那些“财产”呢?
继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包里。
继承默认权限修饰符(friendly)修饰的属性和方法,但子类和父类必须在同一个包里。
无法继承private修饰的属性和方法。
无法继承父类的构造方法。
访问修饰符的访问权限:
Private:本类。
默认(friendly):本类,同包。
Protected:本类,同包,子类。
Public:本类,同包,子类,其他。
在子类中可以根据需求对从父类继承的方法进行重新编写,称为方法的重写或方法的覆盖。方法重写必须满足如下要求。
重写方法和被重写法法必须具有“相同”的“方法名”。
重写方法和被重写方法必须具有“相同”的“参数列表”。
重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类。
重写方法不能缩小被重写方法的访问权限。
重载和重写有什么区别和联系?重载设计同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型、访问修饰符无关。
重写涉及的是子类和父类之间的同名方法,要求方法名相同、参数列表相同、返回值类型相同(或是其子类)、访问修饰符不能严于父类。
Super代表对当前对象的直接父类的对象的默认引用。在子类中可以通过super关键字来访问父类的成员。
无法通过super访问private成员。
Super(name);//访问直接父类的对应构造方法,只能出现在构造方法中。
继承条件下构造方法的调用规则如下:
1//如果子类的构造方法中没有通过super显式调用父类的有照构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,有没有“super();”语句,效果都一样。
2//如果子类的的构造方法中通过super显式调用父类的有参构造方法,则将执行父类相应的构造方法,而不执行父类无参构造方法。
3//如果子类的构造方法中通过this显式调用自身的其他构造方法,则在相应构造方法中应用以上两条规则。
4//特别注意的是,如果存在多级继承关系,则在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直执行顶级父类Object类的无参构造方法为止。
在构造方法中如果有this语句或super语句出现,则只能是第一条语句。
在一个构造方法中不允许同时出现使用this和super语句调用的构造方法(否则就有两条第一条语句)。
在类方法中不允许出现this或super关键字。
在实例方法中,this和super语句不要求是的第一条语句,可以共存。
类方法:用static修饰,可通过类名直接调用类方法。
实例方法:不可通过类名直接调用类方法。
抽象类:通过abstract来修饰Pet类,使其成为抽象类,可以使Pet被限制而不能通过new实例化。
抽象方法:通过abstract来修饰print()方法并去掉方法体,使其成为抽象方法,则子类必须重写该方法,否则就提示出错。
抽象类和抽象方法的特点如下:
(1)抽象类和抽象方法都通过abstract关键字来修饰。
(2)抽象类不能被实例化。抽象类中可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法。
(2)抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类。
Abstract可以用来修饰类和方法,但不能用来修饰属性和构造方法。
抽象类中可以有构造方法吗?
抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用,若此构造方法不是由private修饰,也可以被本类的子类中的构造方法调用。
用final修饰的类,不能再被继承。
用final修饰的方法不能被子类重写。
用final修饰的变量(包括成员变量和局部变量)将变成变量,只能赋值一次。
final和abstract是功能相反的两个关键字,可以对比记忆。
Abstract可以用来修饰类和方法,不能用来修饰属性和构造方法。Final可以用来修饰类、方法和属性,不能修饰构造方法。
Java提供的很多类都是final类,如String类、Math类,他们不能再有子类。Object类中一些方法,如getClass()、notify()、wait()都是final方法,只能被子类继承而不能被重写,但是hashCode()、toString()、equals(Object obj)不是final方法,可以被重写。
对于引用型变量,一定要区分对象的引用值和对象的属性值两个概念。使用final修饰引用型变量,变量不可以再指向另外的对象,但是所指对象的内容却是可以改变的。
使用final修饰引用型变量时,变量的值是固定不变的,而变量所指向的对象的属性值是可变的。
(错)private abstract void sleep();
抽象方法是让子类来重写的,而子类无法继承到private方法,自然就无法重写。
(错)static abstract void sleep();
抽象方法只有声明没有实现,而static方法可以通过类名直接访问,但无法访问一个没有实现的方法。
(错)final abstract void sleep();
抽象方法是让子类来重写的,而final修饰的方法不能被重写,互相矛盾。同理,抽象类只有让子类继承才能实例化,而final修饰的类不允许被子类继承。
标签:
原文地址:http://www.cnblogs.com/water5832/p/5560246.html