java中的继承
2016-03-24 10:42
603 查看
java中的继承:(参考java编程思想)
子类自动覆盖父类中所有定义的非private的成员变量和普通方法。(包括protected访问修饰符修饰的成员变量和方法,也包括静态的成员变量和方法)
所以子类可以覆盖父类的静态方法。
若子类没有覆盖,就继续沿用父类的成员变量和方法。
public class Father1 {
static {
System.out.println("父类静态代码块");
}
public Father1(int a ){
System.out.println("父类:"+a);
}
public Father1(){
this(1);
System.out.println("父类无参构造");
}
}
public class Son1 extends Father1{
static {
System.out.println("子类静态代码块");
}
public Son1 (){
super();
System.out.println("子类无参构造函数");
}
public static void main(String[] args) {
Son1 son = new Son1();
}
}
输出:
父类静态代码块
子类静态代码块
父类:1
父类无参构造
子类无参构造函数
public class Father1 {
static {
System.out.println("父类静态代码块");
}
public Father1(int a ){
System.out.println("父类:"+a);
}
public Father1(){
System.out.println("父类无参构造");
}
}
public class Son11 extends Father1{
public Son11(int a) {
System.out.println("子类的构造方法:"+a);
}
public static void main(String[] args) {
Son11 son11 = new Son11(5);
}
}
父类静态代码块
父类无参构造
子类的构造方法:5
(顺序为:父类静态代码块---子类静态代码块---父类的无参构造方法---子类的构造方法)
----------------------------------------------------------------------------
public class Father1 {
static {
System.out.println("父类静态代码块");
}
public Father1(int a ){
System.out.println("父类:"+a);
}
public Father1(){
System.out.println("父类无参构造");
}
}
public class Son11 extends Father1{
public Son11(int a) {
super(1);
System.out.println("子类的构造方法:"+a);
}
public static void main(String[] args) {
Son11 son11 = new Son11(5);
}
}
父类静态代码块
父类:1
子类的构造方法:5
-------------------------------------------------------------------
子类构造方法中,如果不显示的调用super(参数),或调用super(),则会默认调用父类的无参构造方法(不管子类的构造方法是否有参)。
但是,若子类构造方法中显示调用super(参数),则调用父类相应的有参构造方法,而无参的构造方法就不会被调用了。
或者说,父类的构造方法都会被继承,默认调用无参的,只有子类构造方法显示调用父类有参构造方法,才会舍父类无参而选有参构造。
----------------------------------------------------------------------------------------------------------------------------
多态
动态绑定
当方法被调用时,系统根据当时对象本身所属的类来确定调用哪个方法,只在子类对父类方法进行覆盖时才使用,
实例方法运行时动态绑定,成员变量没有这个特性
Father f = new Son();
f.test();---------------调用子类的方法
f.a;--------------------调用Father的成员变量。
即,变量被“隐藏”,方法被“覆盖”。
public class Animal {
private int a = 1;
public String name = "animal";
public void test() {
System.out.println("父类"+name);
}
}
public class Dog extends Animal{
private int a = 3;
public String name = "dog";
public void test() {
System.out.println("子类-----"+name+"-----"+a);
}
public static void main(String[] args) {
Animal dog = new Dog();
dog.test();
System.out.println(dog.name);
}
}
输出:
子类-----dog-----3
animal
(对象名.成员变量,才会出现隐藏。)
最终类和方法:
最终类可以从其他类派生出来
最终方法不能被子类覆盖,最终类不能有子类。
最终方法可以出现在任何类中,但不能和abstract修饰符同时使用。而且不能被覆盖,但可以被重载。
--------------------
Collection接口
基本方法:
boolean add(Object obj) 添加成功为true 否则为false
Iterator iterator()迭代器
|--Object next();
|--boolean hasNext();
|--void remove();
顺序时,先判断是否存在,hasNext(),然后移动指针next(),可以取值也可以删除remove()
子类自动覆盖父类中所有定义的非private的成员变量和普通方法。(包括protected访问修饰符修饰的成员变量和方法,也包括静态的成员变量和方法)
所以子类可以覆盖父类的静态方法。
若子类没有覆盖,就继续沿用父类的成员变量和方法。
public class Father1 {
static {
System.out.println("父类静态代码块");
}
public Father1(int a ){
System.out.println("父类:"+a);
}
public Father1(){
this(1);
System.out.println("父类无参构造");
}
}
public class Son1 extends Father1{
static {
System.out.println("子类静态代码块");
}
public Son1 (){
super();
System.out.println("子类无参构造函数");
}
public static void main(String[] args) {
Son1 son = new Son1();
}
}
输出:
父类静态代码块
子类静态代码块
父类:1
父类无参构造
子类无参构造函数
public class Father1 {
static {
System.out.println("父类静态代码块");
}
public Father1(int a ){
System.out.println("父类:"+a);
}
public Father1(){
System.out.println("父类无参构造");
}
}
public class Son11 extends Father1{
public Son11(int a) {
System.out.println("子类的构造方法:"+a);
}
public static void main(String[] args) {
Son11 son11 = new Son11(5);
}
}
父类静态代码块
父类无参构造
子类的构造方法:5
(顺序为:父类静态代码块---子类静态代码块---父类的无参构造方法---子类的构造方法)
----------------------------------------------------------------------------
public class Father1 {
static {
System.out.println("父类静态代码块");
}
public Father1(int a ){
System.out.println("父类:"+a);
}
public Father1(){
System.out.println("父类无参构造");
}
}
public class Son11 extends Father1{
public Son11(int a) {
super(1);
System.out.println("子类的构造方法:"+a);
}
public static void main(String[] args) {
Son11 son11 = new Son11(5);
}
}
父类静态代码块
父类:1
子类的构造方法:5
-------------------------------------------------------------------
子类构造方法中,如果不显示的调用super(参数),或调用super(),则会默认调用父类的无参构造方法(不管子类的构造方法是否有参)。
但是,若子类构造方法中显示调用super(参数),则调用父类相应的有参构造方法,而无参的构造方法就不会被调用了。
或者说,父类的构造方法都会被继承,默认调用无参的,只有子类构造方法显示调用父类有参构造方法,才会舍父类无参而选有参构造。
----------------------------------------------------------------------------------------------------------------------------
多态
动态绑定
当方法被调用时,系统根据当时对象本身所属的类来确定调用哪个方法,只在子类对父类方法进行覆盖时才使用,
实例方法运行时动态绑定,成员变量没有这个特性
Father f = new Son();
f.test();---------------调用子类的方法
f.a;--------------------调用Father的成员变量。
即,变量被“隐藏”,方法被“覆盖”。
public class Animal {
private int a = 1;
public String name = "animal";
public void test() {
System.out.println("父类"+name);
}
}
public class Dog extends Animal{
private int a = 3;
public String name = "dog";
public void test() {
System.out.println("子类-----"+name+"-----"+a);
}
public static void main(String[] args) {
Animal dog = new Dog();
dog.test();
System.out.println(dog.name);
}
}
输出:
子类-----dog-----3
animal
(对象名.成员变量,才会出现隐藏。)
最终类和方法:
最终类可以从其他类派生出来
最终方法不能被子类覆盖,最终类不能有子类。
最终方法可以出现在任何类中,但不能和abstract修饰符同时使用。而且不能被覆盖,但可以被重载。
--------------------
Collection接口
基本方法:
boolean add(Object obj) 添加成功为true 否则为false
Iterator iterator()迭代器
|--Object next();
|--boolean hasNext();
|--void remove();
顺序时,先判断是否存在,hasNext(),然后移动指针next(),可以取值也可以删除remove()
相关文章推荐
- JAVA 多态 由浅及深介绍
- java调用jdbc驱动操作数据库
- Struts2+Hibernate实现数据分页的方法
- Eclipse视图:navigator、 package explorer、 project explorer
- [Java Web]敏感词过滤算法
- Java 线程同步详解
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
- 【jdk1.8】Integer源码分析
- Spring分层矛盾问题
- Springmvc中@Autowired注解与@Resource注解的区别
- Java程序运行机制及运行过程
- eclipse安装quick text search插件,全文搜索
- 环境配置_JDK
- MapReduce在Eclipse上调试(利用Tool20160324)
- 221. Maximal Square | Java最短代码实现
- Spring的四种注入方式
- java 处理上传exl数据 并导入数据库
- 请问一下在java中的List<int> list=new List<int>();这条语句的两个int处会报错,请问为什么?
- eclipse导入workspace已经存在项目
- Java基础-多线程-③线程同步之synchronized