Java中的继承

###Java语言中继承的特点:

java只支持单继承,不支持多继承,一个类只能继承一个类,而不能继承多个类

java支持多层继承,尽管一个类只能继承一个类,但是被继承的类可以继承其他的一个类

package 继承;
/*java只支持单继承,不支持多继承,一个类只能继承一个类,而不能继承多个类
 *java支持多层继承,尽管一个类只能继承一个类,但是被继承的类可以继承其他的一个类
 * */
public class ExtendDemo1 {
	public static void main(String[] args) {
		lol lol=new lol();
		lol.update();//pcgame更新了
		lol.start();//具备了父类的父类的功能
	}
}
class Game{
	public void start() {
		System.out.println("启动游戏");
	}
}
class PCGame extends Game{
	public void update() {
		System.out.println("pcgame更新了");
	}
}
class MobileGame extends Game{
	public void update() {
		System.out.println("mobilegame更新了");
	}
}
class lol extends PCGame{
	
}

继承中成员变量的特点:

1.子类只能获取父类的非私有成员。

package 继承;
/*继承中成员变量的特点
 * 子类只能获取父类的私有成员
 * */
public class ExtendsDemo {
	public static void main(String[] args) {
		Kid kid=new Kid();
		kid.show();
	}
}
class Dad{
	private String name="老王";//父类的成员变量被私有
}
class Kid extends Dad{
	public void show() {
		//System.out.println(name);加上private修饰后不可见,无法获取
	}
}

2.就近原则。

package 继承;

/*继承中成员变量的特点
 * 就近原则
 * */
public class ExtendsDemo {
	public static void main(String[] args) {
		Kid kid = new Kid();
		kid.show();
	}
}

class Dad {
	String name = "老王";
}

class Kid extends Dad {
	String name = "儿子";

	public void show() {
		System.out.println(name);//输出"儿子",如果成员变量名字相同,会获取子类的的那个
	}
}

如果一定要获取父类的成员呢?

可以使用super关键字,用法和this一样,它可以获取父类的成员变量和成员方法:

package 继承;

/*继承中成员变量的特点
 * 就近原则
 * */
public class ExtendsDemo {
	public static void main(String[] args) {
		Kid kid = new Kid();
		kid.show();
	}
}

class Dad {
	String name = "老王";
}

class Kid extends Dad {
	String name = "儿子";

	public void show() {
		System.out.println(super.name);
	}
}

继承中成员方法的特点:

1.子类中没有这个方法,就调用父类的

2.子类中重写了这个方法,就调用子类的

3.关于方法的重写和重载:

方法的重写:在子父类中,子类的方法和父类的名称完全一样,子类重写了父类的方法(覆盖),当子类重写了父类的方法后,使用子类对象调用的就是子类的方法。

方法的重载:在一个类中,有多个重名的方法,但是其参数不一样,与方法的返回值无关。

package 继承;

public class ExtendsDemo2 {
	public static void main(String[] args) {
		son s=new son();
		s.eat();
	}
}
class father{
	public void eat() {
		System.out.println("喝酒");
		System.out.println("吃饭");
	}
}
class son extends father{
	public void eat() {
		System.out.println("好好吃饭");
	}
}

方法的重写的应用场景和注意事项:

当父类的方法不能完全满足子类的使用,这个时候子类可以重写父类的方法。并可以在方法中使用关键字super调用父类的方法,这样做既可以保有父类的功能,也可以拥有子类的功能

注意事项:

使用注解@Override用来描述下方的方法是重写,但是没有强制要求使用。

不能重写父类私有的方法。

权限必须大于等于父类方法的权限。

继承中构造方法的执行顺序和要点:

在有子父类继承关系的类中,创建子类的对象,
调用子类的构造方法,如果子类构造方法的第一行代码没有调用父类的构造方法则会默认调用父类的无参构造。

肯定会先执行父类的构造方法,因为要先给父类的成员初始化,子类构造中可能要使用到

可以使用super()在子类的构造方法的第一行中调用父类的构造方法

package 继承;

public class ExtendsDemo2 {
	public static void main(String[] args) {
		son s=new son(2);//父类无参构造方法
						//子类无参构造方法
	}
}
class father{
	public father() {
		System.out.println("父类无参构造方法");
	}
	public father(int num) {
		System.out.println("父类有参构造方法");
	}
}
class son extends father{
	public son() {
		//this(2);
		System.out.println("子类无参构造方法");
	}
	public son(int num) {
		this();
		System.out.println("子类有参构造");
	}
}

输出:

父类无参构造方法
子类无参构造方法
子类有参构造

this和super的区别:

this:当前对象的引用

1.调用子类的成员变量

2.调用子类的成员方法

3.在子类的构造方法第一行调用子类其他的构造方法

super:子类对象的父类引用

1.调用父类的成员变量

2.调用父类的成员方法

3.在子类的构造方法第一行调用父类的构造方法

继承的优缺点:

优点:

提高了代码的复用性

提高了代码的可维护性

缺点:

类之间的耦合性变高了

开发的一个重要原则是:高内聚低耦合

内聚:自身完成某件事情的能力,比如类的功能和属性

耦合:类与类之间的关系

posted @ 2019-03-13 16:51  HzdWwZz"LJF  阅读(250)  评论(0)    收藏  举报