Java继承详解
作者:网络转载 发布时间:[ 2015/6/15 16:14:52 ] 推荐标签:软件开发 编程语言
抽象类注意事项:
抽象类不能被实例化,为什么还有构造函数?
只要是class定义的类里面肯定有构造函数。抽象类中的函数是给子类实例化的。
一个类没有抽象方法,为什么定义为抽象类?
不想被继承,还不想被实例化。
抽象关键字abstract不可以和哪些关键字共存?
final:如果方法被抽象,需要被覆盖,而final是不可以被覆盖,所以冲突。
private:如果函数被私有了,子类无法直接访问,怎么覆盖呢?
static:不需要对象,类名可以调用抽象方法。而调用抽象方法没有意义。
接口(interface)
接口是抽象方法和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,而没有变量和方法的实现。
格式:interface接口名{}
接口的出现将”多继承“通过另一种形式体现出来,即”多实现“。
实现(implements)
格式:class类名implements接口名{}
特点:
接口不能被实例化。
一个类如果实现了接口,要么是抽象类,要么实现接口中的所有方法。
接口的成员特点:
接口中的成员修饰符是固定的!
成员常量:public static final,接口里定义的变量是全局常量,而且修饰符只能是这三个关键字,都可以省略,常量名要大写。
成员方法:public abstract,接口里定义的方法都是抽象的,两个修饰符关键字可省略。
推荐:永远手动给出修饰符。
继承与实现的区别:
类与类之间称为继承关系:因为该类无论是抽象的还是非抽象的,它的内部都可以定义非抽象方法,这个方法可以直接被子类使用,子类继承即可。只能单继承,可以多层继承。((class))
类与接口之间是实现关系:因为接口中的方法都是抽象的,必须由子类实现才可以实例化。可以单实现,也可以多实现;还可以在继承一个类的同时实现多个接口。((class)extends(class)implements(interface1,interface2…))
接口与接口之间是继承关系:一个接口可以继承另一个接口,并添加新的属性和抽象方法,并且接口可以多继承。((interface)extends(interface1,interface2…))
抽象类和接口的区别:
成员变量
抽象类能有变量也可以有常量
接口只能有常量
成员方法
抽象类可以有非抽象的方法,也可以有抽象的方法
接口只能有抽象的方法
构造方法
-抽象类有构造方法
-接口没有构造方法
类与抽象类和接口的关系
类与抽象类的关系是继承extends
类与接口的关系是实现implements
接口的思想特点:
接口是对外暴露的规则;
接口是程序的功能扩展;
接口的出现降低耦合性;(实现了模块化开发,定义好规则,每个人实现自己的模块,大大提高了开发效率)
接口可以用来多实现;
多个无关的类可以实现同一个接口;
一个类可以实现多个相互直接没有关系的接口;
与继承关系类似,接口与实现类之间存在多态性。
//运动员和教练的案例(下图是思路分析)
/*
篮球运动员和教练
乒乓球运动员和教练
现在篮球运动员和教练要出国访问,需要学习英语
请根据你所学的知识,分析出来哪些是类,哪些是抽象类,哪些是接口
*/
interface SpeakEnglish{
public abstract void speak();
}
interface GoAboard{
public abstract void aboard();
}
abstract class Person{
private String name;
private int age;
public Person(){}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
//吃饭
public abstract void eat();
//睡觉
public void sleep(){
System.out.println("Zzz...");
}
}
//运动员
abstract class Player extends Person{
public abstract void study();
}
//教练
abstract class Coach extends Person{
public abstract void teach();
}
//篮球运动员
class BasketballPlayer extends Player implements SpeakEnglish,GoAboard{
public void eat(){
System.out.println(getAge()+"岁的"+getName()+"吃鸡腿");
}
public void study(){
System.out.println(getAge()+"岁的"+getName()+"学扣篮");
}
public void speak(){
System.out.println(getAge()+"岁的"+getName()+"Say Hello World");
}
public void aboard(){
System.out.println(getAge()+"岁的"+getName()+"Go Aboard");
}
}
//乒乓运动员
class PingPangPlayer extends Player{
public void eat(){
System.out.println(getAge()+"岁的"+getName()+"吃鸡蛋");
}
public void study(){
System.out.println(getAge()+"岁的"+getName()+"学扣球");
}
}
//篮球教练
class BasketballCoach extends Coach implements SpeakEnglish{
public void eat(){
System.out.println(getAge()+"岁的"+getName()+"啃鸡爪");
}
public void teach(){
System.out.println(getAge()+"岁的"+getName()+"教扣篮");
}
public void speak(){
System.out.println(getAge()+"岁的"+getName()+"Say Hello Java");
}
public void aboard(){
System.out.println(getAge()+"岁的"+getName()+"Go Aboard");
}
}
//乒乓球教练
class PingPangCoach extends Coach{
public void eat(){
System.out.println(getAge()+"岁的"+getName()+"吃鸡蛋皮");
}
public void teach(){
System.out.println(getAge()+"岁的"+getName()+"教扣球");
}
}
class PlayerAndCoach{
public static void main(String[]args){
//篮球运动员
BasketballPlayer bp=new BasketballPlayer();
bp.setName("郭艾伦");
bp.setAge(33);
bp.eat();
bp.sleep();
bp.study();
bp.speak();
bp.aboard();
System.out.println("***********************");
//篮球教练
BasketballCoach bc=new BasketballCoach();
bc.setName("波波维奇");
bc.setAge(65);
bc.eat();
bc.sleep();
bc.teach();
bc.speak();
bc.aboard();
System.out.println("***********************");
//多态
Person p=new BasketballPlayer();
p.setName("Kobe Bryant");
p.setAge(33);
p.eat();
p.sleep();
//p.study();
//p.speak();
BasketballPlayer bp2=(BasketballPlayer)p;
bp2.study();
bp2.speak();
bp2.aboard();
System.out.println("***********************");
}
}
内部类
将一个类定义在另一个类里面,里面的那个类称为内部类。内部类的出现,再次打破了Java单继承的局限性。
访问特点:
内部类可以直接访问外部类的成员,包括私有成员。
外部类要访问内部类的成员,必须要建立内部类的对象。
内部类分类及共性:
共性:
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
成员内部类
在外部类中有成员变量和成员方法,成员内部类是把整个一个类作为了外部类的成员;
成员内部类是定义在类中方法外的类;
创建对象的格式为:外部类名.内部类名对象名=外部类对象.内部类对象;
成员内部类之所以可以直接访问外部类的成员,那是因为内部类中都持有一个外部类对象的引用:外部类名.this;
成员内部类可以用的修饰符有final,abstract,public,private,protected,static.
静态内部类
静态内部类是成员内部类加上静态修饰符static,定义在类中方法外。
在外部类中访问静态内部类有两种场景:
在外部类中访问静态内部类中非静态成员:*外部类名.内部类名对象名=外部类名.内部对象*,需要通过创建对象访问;
在外部类中访问静态内部类中的静态成员:同样可以使用上面的格式进行访问,也可以直接使用外部类名.内部类名.成员。
局部内部类
局部内部类是定义在方法中的类。
方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
方法内部类对象不能使用该内部类所在方法的非final局部变量。
可以用于方法内部类的修饰符有final,abstract;
静态方法中的方法内部类只能访问外部的静态成员。
匿名内部类
匿名内部类是内部类的简化写法,是建立一个带内容的外部类或者接口的子类匿名对象。
前提:
内部类可以继承或实现一个外部类或者接口。
格式:
new外部类名或者接口名(){重写方法};
通常在方法的形式参数是接口或者抽象类,并且该接口中的方法不超过三个时,可以将匿名内部类作为参数传递。
不同修饰符修饰的内容(和内部类无关)

注意,常见规则如下:
以后,所有的类都用public修饰。并且,在一个java文件中,只写一个类。
以后,所有的成员变量用private修饰。
以后,所有的成员方法用public修饰。
如果是抽象类或者接口:public abstract+…
以后,所有的构造方法用public修饰。
如果类是工具类或者单例类:构造用private修饰
四种权限修饰符

成员变量private
构造方法public
成员方法public
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Java性能测试有哪些不为众人所知的原则?Java设计模式??装饰者模式谈谈Java中遍历Map的几种方法Java Web入门必知你需要理解的Java反射机制知识总结编写更好的Java单元测试的7个技巧编程常用的几种时间戳转换(java .net 数据库)适合Java开发者学习的Python入门教程Java webdriver如何获取浏览器新窗口中的元素?Java重写与重载(区别与用途)Java变量的分类与初始化JavaScript有这几种测试分类Java有哪四个核心技术?给 Java开发者的10个大数据工具和框架Java中几个常用设计模式汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等

sales@spasvo.com