java笔记
  • Java语言概述
  • 入门
    • ubuntu安装
    • window配置环境变量
    • 编写HelloWorld
    • 注释
    • 编程风格
    • 进制与字符编码
    • 键盘录入
  • java基础
    • 数据类型
    • 运算符与类型转换
    • 控制语句
      • 选择结构(if-else/swtich)
      • 循环结构(while/do-while/for)
    • 数组
      • 数组基础
      • 数组进阶
    • 面向对象
      • 基础
        • 面向过程和面向对象
        • 类与对象
        • 构造方法
        • 垃圾回收机制garbage collection
        • 关键字
      • 进阶
        • 封装
        • 继承
        • 多态
        • 抽象
        • 内部类
      • 高级特性
        • String类
        • 枚举
        • 注解
    • 异常
    • 常用类
      • 包装类
      • String相关类
      • 时间类
      • 数学类
      • File类
      • 枚举类
    • 单个字符操作(Character 类)
    • Java字符串
      • String
      • StringBuilder
      • StringBuffer
    • Java集合
    • Java 泛型
    • Java解惑
  • 附录:git
  • 附录:转义字符
  • maven
    • pom.xml
    • maven安装
  • 其他
    • BeanUtils
  • java与php语法对比
  • idea
  • 开发记录
  • ExecutorService 异步线程池
Powered by GitBook
On this page
  • 介绍
  • 方法重写overwrite
  • 重写与重载区别
  • toString()
  • ==与equals
  • 手写equals
  • super
  • 属性/方法查找顺序

Was this helpful?

  1. java基础
  2. 面向对象
  3. 进阶

继承

Previous封装Next多态

Last updated 5 years ago

Was this helpful?

介绍

概述:Inheritance把多个子类的相同属性提取到父类,子类继承并直接使用。

特点:单继承。

子类继承父类,可以得到(除构造方法外)父类的全部(包括私有)属性和方法,不能直接访问父类私有属性和方法,可以通过公共的setget方法访问。

Object类是顶级父类,所有类间接或者直接继承自它。

意味着所有的Java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。

注意:如果父类有有参构造方法,子类重写父类必须提供有参构造方法(或者父类再提供一个无参构造),子类有参构造的参数列表必须包含父类构造方法里的参数。

Eclipse使用Ctrl+T查看继承结构

示例:

package com.itcode.demo;  


/**      
 * @author: 成都码到功成学员  
 * @Description: 继承 
 */  

// extends Object可以写可以不写,默认继承,Object类是顶级父类,所有类间接或者直接继承自它。  
class TestFather /* extends Object */{  
    int id;  
    String name;  

    public void eat() {  
        System.out.println("吃饭");  
    }  
}  

class TestSon extends TestFather{  
    int age;  



    public TestSon() {  

    }  

    public TestSon(int age) {  
        //引用父类属性id,name  
        this.id = id;  
        this.name = name;  
        this.age = age;  
    }  



    public void sleep() {  
        eat();// 调用父类方法  
        System.out.println("睡觉");  
    }  
}  
public class TestExtend {  

    public static void main(String[] args) {  
        TestSon son = new TestSon();  
        son.sleep();// 直接输出吃饭睡觉  

        // 对象类型判断  
        System.out.println(son instanceof TestSon);// true  
        System.out.println(son instanceof TestFather);// true  
        System.out.println(son instanceof Object);// true  
    }   
}

效果:

方法重写overwrite

概述:子类重写父类的方法,子类行为覆盖父类行为。重写是实现多态的必要条件。

要点:

  • 1、“==”: 方法名、形参列表(参数个数、参数类型、参数顺序)相同。

  • 2、“≤”:返回值类型(引用类型≤基本类型==)、异常类型,子类小于等于父类。

如图:

  • 3、“≥”: 访问权限,子类大于等于父类。

示例:

package com.itcode.demo;  


/**      
 * @author: 成都码到功成学员  
 * @Description:  
 * overwrite方法重写 
 */  


class TestFather2 {  

    public void study() {  
        System.out.println("父类学习");  
    }  

    public TestFather2 stop() {  
        return new TestFather2();  
    }  
}  

class TestSon2 extends TestFather2{  

    public void study() {  
        System.out.println("子类学习");  
    }  

    public TestFather2 stop() {  
        // 返回值类型和异常类型,子类小于等于父类  
        // 可以  
//      return new TestFather2();  
        return new TestSon2();  
//      return new Object();// 报错  
    }  

}  
public class TestExtend2 {  

    public static void main(String[] args) {  
        TestSon2 son = new TestSon2();  
        son.study();// 输出子类学习,因为子类的study()已把父类的study()覆盖  
    }   
}

重写与重载区别

名称

范围

方法名

参数列表

返回值类型

修饰符

异常

重写

子父类

相同

相同

相同或子类

大于等于

<=

重载

本类

相同

不同(个数/类型/顺序)

无要求

无要求

无要求

toString()

概述:toString方法来自Object超类,我们可以类中重写它。

方法源码:

public String toString() {  
    return getClass().getName() + "@" + Integer.toHexString(hashCode());  
}

示例:

package com.itcode.demo;  


/**      
 * @author: 成都码到功成学员  
 * @Description:  
 * toString();重写 
 */  


class TestTo {  
    int id;  
    String name;  

    /** 
     * @param id 
     * @param name 
     */  
    public TestTo(int id, String name) {  
        this.id = id;  
        this.name = name;  
    }  

    // 重写toString();  
    @Override  
    public String toString() {  
        return "id=" + id + ", name=" + name;  
    }  



}  

public class TestToString {  

    public static void main(String[] args) {  
        System.out.println("TestToString类未重写toString时调用:");  
        System.out.println("   " + new TestToString().toString());  
        TestTo son = new TestTo(2, "成都码到功成");  
        System.out.println("TestTo类重写toString时调用:");  
        System.out.println("   " + son.toString());  

    }   
}

效果:

==与equals

==比较基本(比较值)与引用数据类型(比较对象地址值),

equals方法比较引用数据类型

  • Object类的equals方法默认比较两个对象的hashcode值。

  • String类的equals方法比较字符串内容是否相等(常用)。

示例:

package com.itcode.demo;  


/**      
 * @author: 成都码到功成学员  
 * @Description:  
 * ==与equals() 
 */  
class TestEs {  

    int id;  
    String name;  

    public TestEs() {  
    }  

    /** 
     * @param id 
     * @param name 
     */  
    public TestEs(int id, String name) {  
        super();  
        this.id = id;  
        this.name = name;  
    }  


}  

public class TestEquals {  

    public static void main(String[] args) {  
        System.out.println("Object类的equals()#########################################");  
        TestEs t1 = new TestEs();  
        TestEs t2 = new TestEs();  
        // 比较  
        System.out.println(t1 == t2);// false  
        System.out.println(t1.equals(t2));// false  

        TestEs t3 = new TestEs(12, "成都码到功成");  
        TestEs t4 = new TestEs(12, "成都码到功成");  
        TestEs t33 = t3;  
        // 比较  
        System.out.println(t3 == t4);// false  
        System.out.println(t33 == t3);// true  
        // true,是因为创建时会从方法区常量池中去找,没有就创建,有相同就直接引用。  
        System.out.println(t3.name == t4.name);// true  
        System.out.println(t3.equals(t4));// false  

        System.out.println("String类的equals();##########################################");  
        String s1 = new String();  
        String s2 = new String();  

        System.out.println(s1 == s2);// false  
        System.out.println(s1.equals(s2));// true  

        String s3 = new String("成都码到功成");  
        String s33 = s3;  
        String s4 = new String("成都码到功成");  

        System.out.println(s33 == s3);// true  
        System.out.println(s33.equals(s3));// true  
        System.out.println(s1 == s2);// false  
        System.out.println(s1.equals(s2));// true  

        String s5 = "成都码到功成";  
        String s6 = "成都码到功成";  
        System.out.println(s5 == s6);// true  
        System.out.println(s5.equals(s6));// true  

        System.out.println("基本类型只能==##########################################");  
        int i1 = 23;  
        int i2 = 23;  
        System.out.println(i1 == i2);  // true



    }   
}

手写equals

重要

比如一个类Pig,两个属性姓名年龄

public Boolean equals(Object o){
    if(this == o){return true;}
    if(!(o intstanceof Pig)){return false;}
    Big b = (Big)o;
    return this.equals(b.name) && this.price == b.name;
}

super

super代表父类对象的引用,通过super关键字访问父类中被子类覆盖的方法或属性。

使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。

如构造方法第一行代码无显式的调用super(...)或者this(...),Java默认会调用super(),调用父类无参构造方法。也可以调用有参构造方法,如super(id, name)。

属性/方法查找顺序

==比较基本(比较值

依次查找当前类至上溯每个父类一直到Object,无编译错误,有结束寻找。

构造方法调用顺序,先父后子。

示例

package com.itcode.demo;  


/**      
 * @author: 成都码到功成学员  
 * @Description:  
 * 构造方法调用顺序 
 */  


class ExtFather {  

    public ExtFather() {  
//      super();// super();可以没有  
        System.out.println("父类无参构造");  
    }  
}  

class ExtSon extends ExtFather{  
    int age;  

    public ExtSon() {  
//      super();// super();可以没有,子类构造方法中不能出  
        System.out.println("子类无参构造");  
    }  

    public ExtSon(int age) {  
        this();//调用ExtSon2无参  
    }  

}  
public class TestExtend3 {  

    public static void main(String[] args) {  
        ExtSon son = new ExtSon();  
    }   
}

效果: