博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java继承
阅读量:6458 次
发布时间:2019-06-23

本文共 3994 字,大约阅读时间需要 13 分钟。

* 继承(extends)
* java是一种树形结构(联结类的层次模型),单继承(父类),多实现(接口+内部类)
* 子类和父类之间是is-a关系
* 在子类中使用super关键字,访问父类的成员,super必须出现在子类。本类中方法中this调用本类的成员(属性和方法,区别于局部变量),在构造方法中调用(替代)其他构造方法
* 继承规则:①不能继承private成员
*                 ②子类和父类不在同包时,不能继承default默认修饰符成员
*                 ③不能继承(覆盖)父类构造方法(但,在子类构造方法中,使用super可以调用,必须构造方法的第一行)
* 方法重写(覆盖){继承多态}:重写方法和被重写方法,必须有相同的方法名,参数列表,返回值,并且重写方法的访问修饰符权限大于等于被重写方法
* 1:成员方法被覆盖,静态方法不能覆盖
* 2:成员属性(对象)、静态成员属性(类)、静态块(类)被继承了,但不会被覆盖
* 3:用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生;final修饰的类不可以被继承
* 4:子类构造方法中第一行没有显示使用super调用父类构造方法或this调用本类其他构造方法,则系统默认调用父类的无参构造方法,这种情况,super可以不写(代码规范应该写)
* 5:类在new关键字初始化时,会递归调用高一级的构造方法,结束于Object类的无参构造方法
* 6:abstract(抽象)修饰方法,声明方法而不去实现。此时类为抽象类,不能实例化,必须继承使用,可以作为引用类型。
* 7:抽象(或非抽象)父类:将子类中的共性最大限度的抽取出来,放在父类中,提高程序的简洁性。例如:狗(子类)是一种哺乳动物(父类),is - a

* 8:方法:abstract必须继承才能使用,static不能被覆盖,final不能被覆盖,所有不能同时作为修饰符

* 9:局部变量和成员变量,在同一个类中,不能有重名的成员变量,在同一方法中不能有重名的局部变量,但同一个类中多个不同方法,成员变量和局部变量可以重名(冲突)。

局部变量,要先赋值,在进行计算。而成员变量new出来就已经赋有初值值。

实现代码:

父类:

package ca.bx.staticextends;public class APClass {	private String p1;	private int p2;	//有参构造方法	public APClass(String x,int y){		this.p1 = x;		this.p2 = y;	}	//默认构造方法	public APClass(){		super();	}	//成员变量(属于对象)	private int a = 1;	int b = 2;	protected int c = 3;	public int d = 4;	public int f = 444;	public static final int h = 555;	//静态变量,类变量(属于类)	public static int sa = 5;	public static int sc;	public static int sd;	public static int sf;	//静态块,初始化静态成员变量	static{		sc = 6;		sd = 7;		sf = 8;	}	//成员方法(属于对象)	public int add(int x,int y){		return x + y;	}	//静态方法,类方法(属于类)	public static int multiply(int x,int y){		return x * y;	}	//final修饰方法	public final int minus(int x,int y){		return x - y;	}	//省略对私有属性,访问接口,getter和setter方法}
子类继承父类:

package ca.bx.staticextends;public class SClass extends APClass{	private boolean p3;	private String p4;	//调用构造方法,	//this和super不能同时使用	public SClass(boolean b,String s){		this();//相当于本类的public SClass()构造方法,也可以this(false,"ss");必须第一行		this.p3 = b;		this.p4 = s;	}	//默认构造方法	public SClass(){		super("ss", 1);//调用父类的public APClass(String x,int y)构造方法;必须第一行	}	//成员变量(属于对象)	private int a = 11;	int b = 22;	protected int c = 33;	public int d = 44;	//静态变量,类变量(属于类)	public static int sa = 55;	public static int sc;	public static int sd;	//静态块,初始化静态成员变量	static{		sc = 66;		sd = 77;	}	//成员方法(属于对象)	public int add(int x,int y){		return x + y+8;	}	//静态方法,类方法(属于类)	public static int multiply(int x,int y){		return x * y *2;	}	//Error:不能覆盖final方法,故报错//	public final int minus(int x,int y){//		return x - y;//	}	//super调用父类的成员	public void apcPrint(){		System.out.println("父类b属性:"+super.b+",父类add方法:"+super.add(4, 9));	}	//this局部变量和成员变量,优先级前者高	public void scPrint(){		int b = 200;		System.out.println("变量(局部)b:"+b+",成员变量b:"+this.b);	}}
测试类:

package ca.bx.staticextends;public class TestX {	public static void main(String[] args) {		SClass sc = new SClass();		APClass apc = new SClass();		int x = 2;		int y = 3;		System.out.println("调用方法:");		System.out.println(apc.add(x, y));//2 + 3 + 8  //成员方法被覆盖,多态		System.out.println(apc.multiply(x, y));//2 * 3 //静态方法未被覆盖(静态),无多态   *APClass.multiply(x, y)		//用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生		System.out.println(sc.minus(x, y));		System.out.println(apc.minus(x, y));		sc.apcPrint();		sc.scPrint();		System.out.println("子类对象调用属性1:");		//父类访问修饰符对子类可见,子类才可以继承(*方法也类似*)		//a属性,为private,本来可见,子类不可见,不继承		//b属性不在同包下,不可见,不继承		System.out.println(sc.b); 		System.out.println(sc.c);		System.out.println(sc.d);		System.out.println(sc.f);		System.out.println(sc.sa);		System.out.println(sc.sc);		System.out.println(sc.sd);		System.out.println(sc.sf);		System.out.println(sc.h);		System.out.println("父类对象调用属性1:");		System.out.println(apc.b); 		System.out.println(apc.c);		System.out.println(apc.d);		System.out.println(apc.f);		System.out.println(apc.sa);		System.out.println(apc.sc);		System.out.println(apc.sd);		System.out.println(apc.sf);		System.out.println(apc.h);		//***可见类的成员变量,可继承,但不可被子类覆盖	}}
输出结果:

调用方法:

13
6
-1
-1
父类b属性:2,父类add方法:13
变量(局部)b:200,成员变量b:22
子类对象调用属性1:
22
33
44
444
55
66
77
8
555
父类对象调用属性1:
2
3
4
444
5
6
7
8
555

转载地址:http://piszo.baihongyu.com/

你可能感兴趣的文章
Picasa生成图片幻灯片页面图文教程
查看>>
js获取当前时间的前一天/后一天
查看>>
[洛谷P3978][TJOI2015]概率论
查看>>
Python学习——编程语言介绍
查看>>
Python字符串的格式化
查看>>
C#反射---属性
查看>>
服务器常用的状态码及其对应的含义如下
查看>>
完美字符串
查看>>
zoom和transform:scale的区别
查看>>
邬建国教授受聘为浙江大学光彪教授
查看>>
过来人谈在美国大学里的中国研究生
查看>>
WCF核心技术
查看>>
R语言编程艺术
查看>>
SQL的bit列名转换成access是/否数据类型,True无效的问题
查看>>
技术普及帖:你刚才在淘宝上买了一件东西
查看>>
幸福框架:可扩展的、动态的、万能的 编号生成器
查看>>
黄聪:PHP 防护XSS,SQL,代码执行,文件包含等多种高危漏洞
查看>>
svn status 显示 ~xx
查看>>
常用HiveQL总结
查看>>
[转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
查看>>