java之继承_java继承的概念

java之继承_java继承的概念继承:实现代码的复用 1. 子类继承了父类中所有属性和方法(相当于在子类中定义了),父类中非私有的属性和方法在子类中能直接访问;但父类中私有的属性和方法不能在子类中直接访问,要通过父类提供的公共方法去访问。 2. 在实例化子类的对象时,会调用子类的构造器,子类构造器中默认有一个super(),这会调

继承:实现代码的复用

  1. 子类继承了父类中所有属性和方法(相当于在子类中定义了),父类中非私有的属性和方法在子类中能直接访问;但父类中私有的属性和方法不能在子类中直接访问,要通过父类提供的公共方法去访问。

  2. 在实例化子类的对象时,会调用子类的构造器,子类构造器中默认有一个super(),这会调用到父类的构造器

  3. 如果想要调用父类中指定的构造器,在子类构造器中显示的调用一下super(参数列表)

  4. super在使用时,要放在子类构造器的第一行(super只能在构造器中使用)

  5. super()和this()都只能放在构造器的第一行,所以这两个方法不能在一个构造器中共存。

   super()是子类去调用父类中的构造器;this()是子类去调用子类中的构造器

  6. Object是所有类的父类

  7. 当在实例化一个子类对象时,构造器的调用会一直追溯到Object

  9. 子类最多只能继承一个父类,即java是单继承机制

继承的内存布局:

java之继承_java继承的概念

子类继承父类的属性和方法,也可以覆写父类的属性和方法。

class Person {
    private int age;

    public void setAge(int age) {
        if (age < 0 || age > 200)
            age = 0;
        else {
            this.age = age;
        }
    }

    public int getAge() {
        return age;
    }    

    public void printInfo() {
        System.out.println("age = "+age);
    }

    public Person () {
     System.out.println("Person ()");
}
public Person (int age) { System.out.println("Person (int age)"); this.age = age; } } class Student extends Person{ private String school; public void setSchool(String school) { this.school = school; } public String getSchool() { return school; } public Student(String school) { /* will call the super() */ //super();//如果子类调用父类中默认的构造方法,super()写不写都行 super(5); //如果子类调用父类中带参数的构造方法,super就必须写,且还要带参数 System.out.println("Student(String school)"); this.school = school; } /* override */ public void printInfo() {//方法的重写 System.out.println("school = "+school+"; age = "+getAge()); } } public class Ext4 { public static void main (String args[]) { Student stu = new Student("ustc"); //stu.setAge(10); System.out.println(stu.getAge()); System.out.println(stu.getSchool()); stu.printInfo();//子类中有实现printInfo方法,就调用子类中的方法;如果没有实现,将会调用父类中的方法 } }

 

super关键字:

  1. 子类的构造方法里会默认调用super()

  2. 可以在子类构造方法中首行自行调用super(),可加参数

  3. super表示父类,可以用super.xxxx调用父类方法

  4. 当子类的属性和方法跟父类的属性和方法重名时,为了访问父类的成员,必须通过supuer。如super.方法名()、super.属性名

   当子类的属性和方法跟父类的属性和方法没重名时,使用super、this、直接访问方法或属性的效果是一样的。

如在子类的一个方法中调用和父类中同名的方法cal(属性也类似):

java之继承_java继承的概念

 如在子类的一个方法中调用和父类中同名的属性:

 

final关键字:final可以修饰类、属性、方法、局部变量

  1. 当不希望某个类被继承时,可以用final修饰这个类

  2. 当父类中的某个方法不希望被子类重写,可以用final修饰这个方法

  3. 当不希望类的某个属性值被修改,可以用final修饰这个属性

  4. 当不希望某个局部变量被修改,可以使用final修饰这个局部变量

java之继承_java继承的概念   java之继承_java继承的概念

方法的重写:

  1. 子类中重写方法的形参列表、方法名要和父类中方法的形参列表、方法名完全一样

  2. 子类中重写方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类

   如:父类方法的返回类型是Object,子类中重写方法的返回类型可以是String类型

  3. 子类中重写的方法不能缩小父类方法的访问类型

class Father {
    private int money;//父类中的私有属性不能被子类访public int getMoney() {return money; }
    public void setMoney(int money) {this.money = money; }

    public void printInfo() {System.out.println("This is Father");}

    private void printInfo2() {System.out.println("This is Father");}//父类中的私有方法不能被子类访问
}

class Son extends Father{
    private void printInfo() {System.out.println("This is son");}//会出错,编译不过,因为3.子类覆写的方法不能缩小父类方法的权public void printInfo2() {System.out.println("This is Father");}//printInfo2不是对父类中printInfo2方法的复写
                                        //因为父类中的方法是私有的,子类都不知道有这个方法,这个是子类自己实现的方法 }
public class Ext5 { public static void main (String args[]) { Son son = new Son(); son.setMoney(100);//由于money是父类中私有的属性,所以不能用son.money=100,即1.父类中的私有属性不能被子类访//son.printInfo(); } }

 

抽象类:规定子类必须实现的方法,起“模板”作用

格式:

abstract class 类名 {
    属性;
    普通方法 { }
    
    // 抽象方法
    访问权限  abstract 返回值类型 方法名 (参数) ; /* 只需要声明,不需要实现 */
}

  1. 抽象类不能实例化对象

  2. 子类必须重写全部抽象方法(子类要实现全部的抽象方法),除非它自己也申明为一个抽象类

  3. 抽象类可以不包含抽象方法,当包含抽象方法的类一定是抽象类

  4. abstract只能修饰类和方法,不能修饰属性和其他的。

  5. 抽象方法不能使用private、final、static来修饰,因为这些关键字都和重写相违背

abstract class Father {//抽象类
    private int money;    

    public int getMoney() {return money; }
    public void setMoney(int money) {this.money = money; }

    public abstract void study();//抽象方法
}

class Son extends Father{
    public void study() {System.out.println("I am study"); }//2. 子类要实现全部的抽象方法
    
}

public class Ext6 {
    public static void main (String args[]) {
        //Father f = new Father();//1. 抽象类不能被实例化对象,会编译出错
        Son son = new Son();
        son.study();
    }
}

 

接口:跟抽象类相似,起“模板”作用;子类可以实现(implement)多个接口,突破“单继承”的限制

格式:  

// 接口由全局常量、公共的抽象方法组成
interface 接口名称 {
    //属性;
    //方法(1.抽象方法 2.默认方法[default 修饰] 3.静态方法);默认方法和静态方法是jdk8引入的,可以有方法体({})。抽象方法没有方法体{}.
}

如:interface A {
    public static final int i = 10;
    public abstract int getNumber( );
}

  1. 子类必须重写全部抽象方法(子类要实现全部的抽象方法)

  2. 接口中的所有方法都是public的,可以省略不写;

  3. 接口中的抽象方法可以不用abstract修饰,可以省略不写

  4. 抽象类实现接口,可以不用实现接口的方法

  5. 一个类可以实现多个接口

  6. 接口中的属性只能是final,而且是public static final修饰,在接口中定义一个int a = 10;前面省略了public static final

  7. 接口中属性的访问形式:接口名.属性名

  8. 一个接口不能继承其他类,但是可以继承多个别的接口

  9. 接口的修饰符只能是public和默认的。(和public calss在一个文件的接口是默认的,不和public class在一个文件的接口是public的)

abstract class Father {
    private int money;    

    public int getMoney() {return money; }
    public void setMoney(int money) {this.money = money; }

    public abstract void study();
}

interface A {
    public static final int i = 10;//将public static final删除,其还是等效于有public static final,且i不能被修改(i是全局常量)
    public abstract int getNum();//将public abstract删除,其也等效于有public abstract
}

interface B {
    public static String name = "InterfaceB";
    public abstract String getName();
}

class Son extends Father implements A,B{//子类不仅可以继承父类(只能继承一个父类),还可以实现多个接口
    public int getNum() {return i;}//子类必须覆写全部抽象方法(子类要实现全部的抽象方法),在{}中写i++;会编译出错,因为i是全局常量
    public String getName() {return name;}
    public void study() {System.out.println("I am study"); }    
}

public class Ext7 {
    public static void main (String args[]) {
        Son son = new Son();
        System.out.println(son.getName());
        son.study();
    }
}

 

 

今天的文章java之继承_java继承的概念分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/48608.html

(0)
编程小号编程小号
上一篇 2023-09-03
下一篇 2023-09-03

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注