继承——java面向对象
来源:互联网 发布:怎么知道ftp端口是多少 编辑:程序博客网 时间:2024/06/08 14:11
- extend
- 四个修饰关键字
- 简单记忆
- 具体描述
- super
- 向上转型
- 向下转型
- instanceof
extend
继承是一种代码复用的方式。
Java使用 extends 作为继承的关键字,extends 关键字在英文中的意思是扩展,而不是继承! 这个关键字很好地体现了子类和父类的关系:子类是对父类的扩展,子类是一种特殊的父类。从这个意义上来看,使用继承来描述子类和父类的关系是错误的,用扩展更加恰当。
那么为什么国内把 extends 翻译为“继承”呢? 除了与历史原因有关之外,把它翻译成继承也是有理由的:子类扩展了父类,将可以获得父类的全部成员变量和方法,这与韩语中的继承(子辈从父辈那里获得一笔财富称为继承)具有很好的类似性
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void run() { System.out.println(name + " is running!"); }}
public class Student extends Person { private int score; public int getScore() { return score; } public void setScore(int score) { this.score = score; }}
public class Main { public static void main(String[] args) { Person p = new Person(); Student s = new Student(); p.setName("xiao ming"); s.setName("xiao hong"); p.run(); s.run(); }}
xiao ming is running!
xiao hong is running!
用法如上
- Java只允许单继承,如果要多继承需要用到接口,以后我们会提到的。而且这个说法还有另外一个更有瑕疵的说法:Java只有一个父类,严格来说这种说法是错误的,可以换成下面的说法:Java类只能有一个直接父类,事实上java可以有无限多个间接父类。
- Object类是所有类的超类(可以这样理解:如果一个类的“爸爸”不是它,那么它一定是这个类的“祖宗”)
继承有关细节:
- 类名的设定,被继承的类称之为父类(基类),继承的类称之为子类
- 子类并不能继承父类中所有的成员
- 父类定义完整的成员 静态成员,非静态,构造方法。静态变量和静态方
法都可以通过子类名.父类静态成员的形式调用成功。 - 所有的私有成员不能继承,private修饰的成员。
- 构造函数不能被继承
- 父类定义完整的成员 静态成员,非静态,构造方法。静态变量和静态方
四个修饰关键字
简单记忆:
- 仅对本类——private
- 对所有类——public。
- 对本包和所有子类——protected。
- 对本包——默认,不需要修饰符。
具体描述:
- private(当前类访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。很显然,这个访问控制符用于修饰成员变量最合适,使用它来修饰成员变量就可以把成员变量隐藏在在类的内部。
- default(包访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)或者一个外部类不使用任何访问控制符修饰,就称它是包访问权限的,default访问控制的成员或外部类可以被相同包下的其他类访问。
- protected(子类访问权限):如果一个成员(包括成员变量、方法和构造器等)使用protected访问控制符修饰,那么这个成员即可以被同一个包中的其他类访问,也可以被不同包中的子类访问。在通常情况下,如果使用protected来修饰一个方法,通常是希望其子类来重写这个方法。
- public(公共访问权限):这是一个最宽松的访问控制级别,如果一个成员(包括成员变量、方法和构造器)或者一个外部类使用public访问控制符修饰,那么这个成员或外部类就可以被所有类访问,不管访问类和被访问类是否处于同一个包中,是否具有父子继承关系。
super
- super关键字表示父类(超类)
- 构造方法的第一行语句必须调用super()
- 没有super()时编译器会自动生成super()
- 如果父类没有默认构造方法,子类就必须显示调用super()
super关键字的作用
- 主要存在于子类方法中,用于指向子类对象中父类对象。
- 访问父类的属性
- 访问父类的函数
- 访问父类的构造函数
那么它和this关键字有什么不同呢:
this和super很像,this指向的是当前对象的调用,super指向的是当前调用对象的父类。
在子类构造函数第一行通过super关键字调用父类任何构造函数。如果显式调用父类构造函数,编译器自动添加的调用父类无参数的构造就消失。构造函数间的调用只能放在第一行,只能调用一次。super() 和this()不能同时存在构造函数第一行。
向上转型
也就是父类引用指向子类对象
- 可以对实例变量进行向上转型(upcasting)
- 向上转型把一个子类型安全地变为更加抽象的类型(相对的向下转型是变得更加具体)
Person p = new Person();Studen s = new Student();Person ps = new Student();Object o1 = p;Object o2 = s;
向下转型
- 可以对实例变量进行向下转型(downcasting)
- 向下转型把抽象的类型编程一个具体的子类型
- 向下转型很可能报错:ClassCastException
Person p = new Person();Student s = (Student) p ; // ClassCastException
这里我们怎么保证向下转型的时候不报错呢 我们可以借助操作符——instanceof
instanceof
- instanceof操作符可以判断对象的类型
Person p = new Person();System.out.println(p instanceof Person);// trueSystem.out.println(p instanceof Student);// falseStudent s = new Student();System.out.println(p instanceof Person);//trueSystem.out.println(p instanceof Student);//trueStudent n = null;System.out.println(n instanceof Student);// false
- instanceof操作符可以判断对象的类型
- 向下转型前可以用instanceof判断
比如下面的例子 比较实用,希望以后可以记住
Person p = new Student();if (p instanceof Student){ Student s = (Student) p ; //OK}
这样一来 如果没有判断成功 那么if里面的语句就不会执行,也就不会报错了。
- JAVA面向对象——继承
- Java面向对象——继承
- Java面向对象——继承
- JAVA面向对象——继承
- JAVA继承——面向对象
- 继承——java面向对象
- Java ——面向对象的继承
- java面向对象——继承
- JAVA面向对象编程——继承
- java面向对象——继承--初识继承
- Java面向对象--继承
- Java面向对象:继承
- JAVA面向对象-----继承
- Java面向对象 继承
- java学习笔记《java面向对象编程》——继承
- 面向对象——继承
- 面向对象——继承
- 面向对象——继承
- LeetCode Algorithms 5. Longest Palindromic Substring 题解
- 将输入流(InputStream)对象保存到数据库(mysql)
- Retrofit2.0使用详解&&封装
- 关于ggplot2画散点图、条形图的一些细节认识
- 如何利用 Chrome 开发者工具远程调试 Android 中的原生 WebView?
- 继承——java面向对象
- static静态
- Caffe源码解读(十二):自定义数据输入层
- js之 同一页面中的多表单提交
- Android-ABIFilter-Device supports x86,but APK only supports armeabi-v7a,armeabi,x86_64
- 异常处理
- 计算机解决问题的方法
- Java源码——对象序列化(对象的存储及读取)(Object Serialization)
- HDU 1753