面向对象之继承
2016-07-28 20:28
351 查看
面向对象之继承
为了代码的复用性,提出了继承。1.继承:使用 extends 关键字
public class Student extends Person(){ }
2.如果类A继承自类B,则B称为父类、超类、基类(Superclass);A称为子类、派生类(Subclass)。
3.什么时候才能建立父子关系: A is a B,A就可以继承B
4.有哪些会被继承:
* 一般方法会被继承,受访问修饰符的限制
* 属性会被继承,但是受访问修饰符的限制,比如private修饰的属性,在类的外部就不能直接访问
* 构造方法不会被继承
5.super关键字的使用
*
super.来调用父类的属性或一般方法,但是要注意访问修饰符
public class Student extends Person{ private int sno; public Student(){} public Student(String name,int age,int sno){ super.setName(name);// 对父类一般方法的调用 super.setAge(age); this.sno = sno; } }
super()来调用父类的构造方法
public class Student extends Person{ private int sno; public Student(){} public Student(String name,int age,int sno){ super(name,age);// 对父类构造器的调用 this.sno = sno; } }
如果一个构造方法的第一行,没有任何的this()和super(),则默认有一个super(),即对父类无参构造的引用。因此如果一个类没有写无参构造器,子类的构造方法可能报错。所以通常对所有的类写出无参构造器,即使当前类不需使用。
public class Student extends Person{ private int sno; public Student(){// 子类构造器 super();// 表示对父类无参构造的使用 } }
6.方法的重写
* 概念:如果子类中有和父类中同名同参同返回的方法,则子类中的方法会覆盖父类中的相应方法。
* 发生在父子类之间
* 同名同参同返回
* 如果一个方法是重写的方法,则可以在方法之前加一个标注:@Override,用于表明这个方法是重写方法。同时,该标注可以给我们检测语法。
public class Student extends Person{ @Override public void learn(){// 重写父类的learn()方法 System.out.println("学习Java"); } }
要注意区分重载与重写的区别:
重载发生在同一个类中的不同方法之间
重写发生在父类的方法和子类继承来的方法间
7.Java中的继承是单继承,一个类只能有一个直接父类
* 如果一个类没有继承自任何的其他类,则默认继承自Object
8.Object类方法的重写
* toString()
* 使用System.out.println()输出一个对象时,其实就是输出对象的字符串形式,也即输出
对象.toString()的内容
* equals()
* 基本数据类型之间的比较,是用==
* 引用数据类型之间
* 如果使用==,比较的是对象在堆中的地址,地址相同(同一个对象)则为 true ,否则为 false
* 如果使用 equals
1.如果没有重写 equals,则使用默认的 equals,默认的equals 比较的是两个对象的地址,和 == 一样
2.重写 equals ,自己定义比较规则,完成逻辑上的相等比较。(String:重写了Object的 equals方法,规则是比较两个字符串每一位上的字符,如果所有字符都相同,则返回 true)
* 使用
alt+shift+s,选中
Generate hashCode() and equals()可以快捷生成重写equals方法。
7.字符串常量池
String s3="abc";
语句先判断字符串常量池中有没有”abc”这样的一个字符串常量,如果没有,则将”abc”放入字符串常量池,同时将引用给s3,如果有,则直接将字符串常量池中的”abc”的引用给s3
String s3 = "abc"; String s4 = "abc"; System.out.println(s3==s4);// true 内存地址相同 System.out.println(s3.equals(s4));// true 均为字符串常量池中"abc"的引用
相关文章推荐
- Android Native 绘图方法
- PostgreSQL教程(三):表的继承和分区表详解
- Lua编程示例(二):面向对象、metatable对表进行扩展
- C#中面向对象编程机制之多态学习笔记
- C#中struct和class的区别详解
- 浅谈Lua的面向对象特性
- Lua面向对象之类和继承浅析
- 浅析Ruby中继承和消息的相关知识
- JavaScript面向对象的两种书写方法以及差别
- 浅谈c# 面向对象之类与对象
- C#面向对象特征的具体实现及作用详解
- C# 面向对象的基本原则
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- 浅谈对c# 面向对象的理解
- C++实现不能被继承的类实例分析
- Ruby面向对象编程详解
- C# 面向对象三大特性:封装、继承、多态
- Python3 面向对象概述