Java继承回顾(一)
来源:互联网 发布:qq空间怎么做淘宝客 编辑:程序博客网 时间:2024/04/29 00:24
/** ** A:继承(extends) * 让类与类之间产生关系,子父类关系 * B:继承案例演示: * 动物类,猫类,狗类 * 定义两个属性(颜色,腿的个数)两个功能(吃饭,睡觉) * C:案例演示 * 使用继承前 * D:案例演示 * 使用继承后 * * ###08.04_面向对象(继承的好处和弊端)(掌握) * A:继承的好处 * a:提高了代码的复用性 * b:提高了代码的维护性 * c:让类与类之间产生了关系,是多态的前提 * B:继承的弊端 * 类的耦合性增强了。* 什么是耦合,耦合性增强就是指两个类之间的关系越来越紧密,父类的变化影响着子类的变化,关系紧密 * 开发的原则:高内聚,低耦合。 * 耦合:类与类的关系 * 内聚:就是自己完成某件事情的能力 */public class Demo_extends { public static void main(String[] args) {// cat c=new cat();// c.color="red";// c.leg=4;// c.eat();// c.sleep();// System.out.println(c.color +"...."+c.leg);// DemoE e=new DemoE();// e.show();// e.methon();// e.print();// Son s=new Son();// s.setName("sanmao");// System.out.println(s.getName());// Son s=new Son();// s.print();// Son2 s=new Son2();// s.print();// Son3 s=new Son3(2);// Son4 s1=new Son4();// System.out.println(s1.getName()+"..."+s1.getAge());// System.out.println("-------------");// Son4 s2=new Son4("sanmao",25);// System.out.println(s2.getName()+"..."+s2.getAge()); Zi zi=new Zi();// zi.show(); }}class Animal{ String color; int leg; public void eat(){ System.out.println("吃饭"); } public void sleep(){ System.out.println("睡觉"); }}class cat extends Animal{}class dog extends Animal{}/** * ###08.05_面向对象(Java中类的继承特点)(掌握) * A:Java中类的继承特点 * a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹) * 有些语言是支持多继承,格式:extends 类1,类2,... * b:Java支持多层继承(继承体系) * B:案例演示 * Java中类的继承特点 * 如果想用这个体系的所有功能用最底层的类创建对象 * 如果想看这个体系的共性功能,看最顶层的类 */class DemoA{ public void show(){ System.out.println("DemoA"); }}class DemoB{ public void show(){ System.out.println("DemoB"); }}//class DemoC extends DemoA,DemoB{ //Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)////}class DemoD extends DemoA{ public void methon(){ System.out.println("DemoD"); }}class DemoC extends DemoA{ //如果是多继承那么继承两个类的话,两个类里有重复行为,执行内容不一样,有二义性 //多继承具有安全隐患}class DemoE extends DemoD{ //Java支持多层继承,继承体系 E 继承 D ,D 继承 A 多层继承,继承是可以传递的 public void print(){ System.out.println("DemoE"); }}/** * ###08.06_面向对象(继承的注意事项和什么时候使用继承)(掌握) * A:继承的注意事项 * a:子类只能继承父类所有非私有的成员(成员方法和成员变量) * b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。 * (为什么不能继承父类的构造方法,构造方法都是和本类名一致,所以构造方法是本类私有的,用来创建类对象的 * ,既同一文件下不能有两个相同的类,不能传递给子类,) * c:不要为了部分功能而去继承 * 项目经理 姓名 工号 工资 奖金 * 程序员 姓名 工号 工资 * 项目经理 去继承程序员 实现上没有任何问题,但是不符合继承关系,应该创建一个员工类 让项目经理和程序员共同去继承 * B:什么时候使用继承 * 继承其实体现的是一种关系:"is a"。 Person Student Teacher 水果 苹果 香蕉 橘子 采用假设法。 如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。 *//** * ###08.07_面向对象(继承中成员变量的关系)(掌握) * A:案例演示 * a:不同名的变量 * b:同名的变量*/class Father { private String name;//子类只能继承父类所有非私有的成员(成员方法和成员变量), // 私有的将不会被继承,但可以用公共行为来调用 int num=10; int num2=30; public void show(){ System.out.println("Father"); } private void show2(){ System.out.println("Father2"); } public void setName(String name){ //子类可以继承父类公共的方法来,修改获取父类的私有成员变量 this.name=name; } public String getName(){ return name; }}class Son extends Father{ int num2=20; public void print(){ //子父类出现同名变量,只是在讲课上有,实际开发中不会存在这一情况 //子类继承父类就是为了使用父类的成员变量,再声明一个同名变量无意义 System.out.println(num); //10 System.out.println(num2); //20 就近原则 子类有的成员变量,就不用父类了 }}/** * ###08.08_面向对象(this和super的区别和应用)(掌握) * A:this和super都代表什么 * this:代表当前对象的引用,谁来调用我,我就代表谁 * super:代表当前对象父类的引用 * B:this和super的使用区别 * a:调用成员变量 * this.成员变量 调用本类的成员变量,也可以调用父类的成员变量 * super.成员变量 调用父类的成员变量 * b:调用构造方法 * this(...) 调用本类的构造方法 * super(...) 调用父类的构造方法 * c:调用成员方法 * this.成员方法 调用本类的成员方法,也可以调用父类的方法 * super.成员方法 调用父类的成员方法*/class Father2{ int num1=10; int num2=30; private int num3=99; public void show(){ System.out.println("Fathre2"); }}class Son2 extends Father2{ int num2=20; public void print(){ System.out.println(this.num1);//this 既可以调用本类的行为变量,也可以调用从父类继承的行为变量 System.out.println(this.num2); System.out.println(super.num2);//super调用父类公开的行为和变量, // System.out.println(super.num3); //super也无法调用父类的私有行为和变量 this.show(); super.show();// this.print(); 方法可以调用方法本身,其实就是死循环,循环到一定次数,会出错,溢出错误 }}/** * ###08.09_面向对象(继承中构造方法的关系)(掌握) * A:案例演示 * 子类中所有的构造方法默认都会访问父类中 空参数 的构造方法 * B:为什么呢? * 因为子类会继承父类中的数据,可能还会使用父类的数据。 * 所以,子类初始化之前,一定要先完成父类数据的初始化。 * 其实: * 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。*/class Father3{ //申请一个子类对象,就会默认先执行父类的无参构造参数,想执行父类的有参构造 //方法,需要用super来调用有参构造方法 int num; public Father3(){ System.out.println("Father3的无参构造方法"); } public Father3(int num){ this.num=num; System.out.println("Father3的有参构造方法"); }}class Son3 extends Father3{ // int num1; public Son3(){ //如不重写构造参数,编译器默认带有一个无参构造方法,如果你指定了一个有参构造参数 //那么编译器将不再自动添加无参构造参数,你需要写上无参构造参数 super(); //如果不写 系统将默认加上,无论是系统自动的无参构造方法,还是你重申的,都会有super(); System.out.println("Son3的无参构造方法"); } public Son3(int num1){ this.num1=num1; System.out.println("Son3的有参构造方法"); }}/** * ###08.10_面向对象(继承中构造方法的注意事项)(掌握) * A:案例演示 * 父类没有无参构造方法,子类怎么办? * super解决 * this解决 * B:注意事项 * super(…)或者this(….)必须出现在构造方法的第一条语句上*/class Father4{ private String name; private int age;// public Father4(){// System.out.println("Father4 空参构造");// } public Father4(String name,int age){ //super(…)或者this(….)必须出现在构造方法的第一条语句上*/ this.name=name; this.age=age; System.out.println("Father4 有参构造"); } public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setAge(int age){ this.age=age; } public int getAge(){ return this.age; }}class Son4 extends Father4{ public Son4(){//super(…)或者this(….)必须出现在构造方法的第一条语句上*/ // super("yogchao",25); 调用父类中的构造方法 this("yongchao",24); // 所以在构造方法里面super(),和this()只能出现一个!!!且放在第一位 System.out.println("Son4 空参构造"); } public Son4(String name,int age){//super(…)或者this(….)必须出现在构造方法的第一条语句上*/ super(name,age); //子类一定会访问父类 //super(); 有参构造里面也隐藏着super(); 而不是super(参数),因为他根本不知道你要穿什么,所以默认是super() System.out.println("Son4 有参构造"); }}/** * ###08.11_面向对象(继承中的面试题)(掌握) * A: 案例演示 * Fu 静态代码块 * Zi 静态代码块 * Fu 构造代码块 * Fu 构造方法 * Zi 构造代码块 * Zi 构造方法 * 执行过程 * 1.JVM 调用main方法,将main方法进栈 * 2.遇到 Zi z=new Zi(),会先将Fu.class和Zi.class分别加载到内存,在创建对象,当Fu.class加载进内存,Fu类 * 中的静态代码块会随着Fu.class一起加载到内存,当Zi.class加载进内存,Zi类中的静态代码块会随着Zi.class * 一起加载到内存,所以先输出 Fu静态代码块,再输出Zi静态代码块 * 3.走Zi类的构造方法,因为Java中是分层初始化的,先初始化父类,再初始化子类,所以先走父类的构造,但是在 * 执行父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的,所以第三个输出构造代码块 * 第四个输出构造方法 * 4.父类初始化完,子类开始初始化,第五个输出子类的构造代码块,第六个输出子类构造方法 * * */ class Fu{ static{ System.out.println("Fu 静态代码块"); } { System.out.println("Fu 构造代码块"); } public int num=10; public Fu(){ System.out.println("Fu 构造方法"); }}class Zi extends Fu{ static { System.out.println("Zi 静态代码块"); } { System.out.println("Zi 构造代码块"); } public int num=20; public Zi(){ System.out.println("Zi 构造方法"); } public void show(){ int num=30; System.out.println(num); //30 考察就近原则 System.out.println(this.num); //20 System.out.println(super.num); //10 }}
0 0
- Java继承回顾(一)
- Java继承回顾(二)
- java回顾(一)
- JAVA回顾 (一)
- java知识点回顾(一)
- java从头回顾(一)
- java基础知识回顾(一)
- java多线程回顾(一)
- java基础回顾(一)
- java基础回顾(一)
- Java基础回顾(一)
- java 网络编程回顾(一)
- Java基础回顾随记(一)
- Java基础回顾(一)
- Java知识点回顾一
- JAVA基础回顾一
- java反射回顾<一>
- java 基础(一)继承
- java一些经典算法题
- RabbitMQ 三种Exchange
- IntelliJ IDEA中的Maven项目下的配置文件发布问题
- python学习——函数的参数
- APP开发实战83-Android动态权限兼容性问题
- Java继承回顾(一)
- Spring 定时器配置 基于注解 (使用 Spring4)
- Buy the Ticket
- Storyboard和Xib混用黑魔法-swift版
- 准备食物
- linux强行删除损坏的mysql
- c++ stl 学习
- C#控制台 通过构造函数对只读属性赋值
- 【Leetcode】Palindrome Pairs