java学习----继承与接口

简介: java学习----继承与接口1.基本概念与注意事项2.代码演示3.学习反思

1.基本概念与注意事项

继承

1.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

基本格式:

class Person{
   // ....成员变量,构造方法
}
class Student extends Person{
    //....类体,调用
}



2.注意:

子类不能选择性继承父类;

Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;

构造方法不会被子类继承,但可以从子类中调用父类的构造方法。

3.子类继承其父类的所有public和protected成员,但不能继承其父类的private成员。那么如何在子类中访问到父类中的字段呢,我们可以在父类中提供用来访问其私有字段的public或protected方法,子类使用这些方法来访问相应的字段。

4.子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段。

5.子类不继承其父类的构造方法。

当使用无参数的super()时,父类的无参数构造方法就会被调用;

当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。

6.注意

如果要初始化父类中的字段,可以在子类的构造方法中通过关键字super调用父类的构造方法;

对父类的构造放的调用必须放在子类构造方法的第一行;

如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器;

如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表;

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。

接口

1.接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。

2.一个类可以实现不止一个接口。

3.一个接口可以继承另一个接口,或者另一些接口,接口也可以继承,并且可以多继承。

4.一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。

5.接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的。

6.接口用来弥补类无法实现多继承的局限。


2.代码演示

1.银行存取钱


import java.util.Scanner;
class Bank{
    private int money;
public Bank(int money){
    super();
    this.money=money;
}
    public void setMoney(int money) {
       this. money=money;
    }
    public double getMoney() {
        return money;
    }
    public int save(int jia){
       return money=money+jia;
    }
    public int out(int jian){
       return money-=jian;
    }
    public void yue(int money3){
        money=money3;
    }
}
public class java17 {
    public static void main(String[] args) {
       Bank bank=new Bank(10000);
        Scanner m=new Scanner(System.in);
        int s= m.nextInt();
        bank.save(s);
        System.out.println("您存储" +s+"元"+"余额为:"+ bank.getMoney());
        Scanner n=new Scanner(System.in);
        int o= m.nextInt();
        bank.out(o);
        System.out.println("您取走" +s+"元"+"余额为:"+ bank.getMoney());
    }
}


2.面向对象综合性习题

18.定义一个学生类 Student,它继承自 Person 类。

(1)Person类:

成员变量(私有的):

姓名(name),字符串类型(String);

性别(sex),字符型(char);

年龄(age),整型(int)。

成员方法:

构造方法:对所有成员变量初始化

重写Object类的toString方法,返回字符串形如:姓名,性别,年龄

重写Object类的equals方法,当且仅当两人的姓名相等且性别相等且年龄相等时,认为两人相等。

(2)Student 类:

新增加的成员变量:

学号(number),长整型;

三门功课的成绩:哲学(phi),整型;

英语 (eng),整型;

计算机(comp),整型。

新增加的方法:

求三门功课的平均成绩 public double aver():该方法没有参数,返 回值类型为 double 型;

求三门功课成绩的最高分 public int max():该方法没有参数,返回值为 int 型;

求三门功课成绩的最低分 public int min():该方法没有参数,返回值为 int 型。

覆盖父类的同名方法:public String toString():获取学号、姓名、性别、平均分、最高分、最低分信息。

覆盖父类的同名方法equals:除了姓名、性别和年龄相等以外,学号也相等时,认为两学生相等。

(3)编写测试程序。程序要求实现:在程序中设置若干个学生信息(学号、姓名、性别、年龄、各科分数),要求通过运行程序,在屏幕中输出如下的结果:例如:学号:310 姓名:xpc 性别:n 年龄:19 平均分110 最高分:122 分 最低分:99。 试着比较两名学生是否相等。

class Per1{
    public String name;
    public  int age;
    public String sex;
    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 age;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getSex() {
        return sex;
    }
    public Per1(){
    }
    public Per1(String name,int age,String sex) {
        this.age = age;
        this.sex = sex;
        this.name = name;
    }
    public String toString(){
        return name+age+sex;
    }
    public boolean equals(String name1,String name2,int age1,int age2){
        if (name1.equals(name2)&&age1==age2){
            return true;
        }else {
            return false;
        }
    }
}
class Student1 extends Per1{
    int phi,eng,comp;
    public Student1(String name, int age, String sex,int phi,int eng,int comp) {
        super(name, age, sex);
        this.phi=phi;
        this.eng=eng;
        this.comp=comp;
        long number = 310;
    }public double aver(){
        System.out.println((phi+eng+comp)/3);
        return (phi+eng+comp)/3;
    }
    public int max(){
        int max=phi;
        if (eng>max){
            max=eng;
        }else if(comp>max){
            max=comp;
        }else {
            max=phi;
        }
        System.out.println(max);
        return max ;
    }
    public int min(){
        int min=phi;
        if (eng<min){
            min=eng;
        }else if(comp<min){
            min=comp;
        }else{
            min=phi;
        }
        System.out.println(min);
        return min;
    }
    public String toString(){
        return "["+name+age+sex+max()+aver()+min()+"]";
    }
     boolean equals(long number1,long number2){
        if (number1 == number2) {
            return true;
        }else{
            return  false;
        }
    }
}
public class Java18 {
    public static void main(String[] args) {
        Per1 c1=new Per1("xpc",19,"m");
        Per1 c2=new Per1("x",19,"n");
        Student1 a1=new Student1("pc",18,"m",110,122,99);
        boolean equals=c1.equals(c1.name,c2.name,c1.age,c2.age);
        if(equals){
            System.out.println("两个人相同");
        }else{
            System.out.println("两个人不相同");
        }
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(a1);
    }
}

3.接口练习例题


//.按如下要求编写Java程序:
 //       (1)定义接口A,里面包含值为3.14的常量PI和抽象方法double area()。
 //       (2)定义接口B,里面包含抽象方法void setColor(String c)。
 //       (3)定义接口C,该接口继承了接口A和B,里面包含抽象方法void volume()。
  //      (4)定义圆柱体类Cylinder实现接口C,该类中包含三个成员变量:底圆半径radius、
  //      圆柱体的高height、颜色color。
    //    (5)创建主类来测试类Cylinder。
interface A{
   double pi=3.14;
   void doubleArea();
}
interface B{
    void setColor(String c);
}
interface c extends A,B {
     void doublevolume();
}
abstract class tem implements c{
    public void doubleArea(){};
    public void setColor(String c){};
    public void doublevolume(){};
}
class Cylinder extends tem{
    private int radius;
    private int height;
    private String color;
    public double area(){
        return pi*radius*radius;
    }
    public double volume(){
        return area()*height;
    }
    public String color(){
        return color;
    }
}
public class lianxijiekou {
    public static void main(String[] args) {
        Cylinder h=new Cylinder();
        h.area();
    }
}

4.接口加运算


interface Icompute{
   int com(int n,int m);
}
class Usecompute{
    private int n;
    private int m;
    public void use(Icompute com,int one,int two){
        this.n=n;
        this.m=m;
        com.com(n,m);
    }
}
class Add implements Icompute{
    private int n;
    private int m;
    private int ret;
    public int com(int n, int m) {
        this.n=n;
        this.m=m;
        this.ret=n+m;
        System.out.println("ret="+ret);
        return ret;
    }
}
public class java25 {
    public static void main(String[] args) {
        Icompute n=new Add();
        n.com(4,8);
    }
}


3.学习反思

考核还是不理想,一道大题也运算不出来,算法题也没有回顾,整天忙得这么狠,但是结果还是不理想,找好自身问题,对自己询问:

知道某一代码的来龙去脉!

为什么这么写?

从哪来的每一步?

什么错误?

原因:全面、深刻的探寻

产生什么结果?

如何解决?

问题:

不是“没听懂”,而是“记不住”【要能说出来,讲清楚】

不能知其然,而不知其所以然【合理性】

只懂表象,不懂内核【原理性】


相关文章
|
7天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
20 9
Java——类与对象(继承和多态)
|
6天前
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
12 5
Java——抽象类和接口
|
6天前
|
Java
Java——接口的使用实例
Comparable接口用于自定义类的对象比较。通过实现此接口并重写`compareTo`方法,可以定义自定义类型的比较规则。 接下来介绍了Comparator接口,它提供了一种更灵活的比较方式。通过实现Comparator接口并重写`compare`方法,可以根据不同属性定义不同的比较规则。例如,定义一个`BrandComparator`类来比较汽车的品牌。 最后,介绍了Cloneable接口,用于实现对象的克隆。实现该接口并重写`clone`方法后,可以创建对象的浅拷贝或深拷贝。浅拷贝仅复制对象本身,深拷贝则会递归复制所有成员变量。
13 4
Java——接口的使用实例
|
4天前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
34 18
|
18天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
79 6
【Java学习】多线程&JUC万字超详解
|
12天前
|
Java 数据库连接 数据库
Java服务提供接口(SPI)的设计与应用剖析
Java SPI提供了一种优雅的服务扩展和动态加载机制,使得Java应用程序可以轻松地扩展功能和替换组件。通过合理的设计与应用,SPI可以大大增强Java应用的灵活性和可扩展性。
44 18
|
10天前
|
Java 开发者
Java的接口详解
Java接口是编程中的一种重要特性,用于定义方法签名而不提供具体实现,作为类之间的契约,使不同类能以统一方式交互。接口使用`interface`关键字定义,可包含方法声明和常量。类通过`implements`关键字实现接口,并可同时实现多个接口,解决多重继承问题。接口中的方法默认为抽象方法,变量默认为`public static final`。Java 8引入了默认方法和静态方法,增强接口功能。接口广泛应用于回调机制和多态性实现,有助于构建更灵活和可维护的代码结构。
|
11天前
|
Java
java的继承详解
在 Java 中,继承是一个核心概念,它允许子类 `extends` 父类来重用和扩展其属性与方法。子类可以覆盖父类的方法以改变行为,同时使用 `super` 关键字调用父类的构造方法或方法。虽然 Java 不支持多继承,但可以利用抽象类与接口实现多层继承。这种方式极大地增强了代码的复用性和维护性。
|
19天前
|
Java
盘点java8 stream中隐藏的函数式接口
`shigen`是一位坚持更新文章的博客作者,记录成长历程,分享认知见解,留住感动瞬间。本文介绍了函数式接口的概念及其在Java中的应用,包括`Comparator`、`Runnable`、`Callable`等常见接口,并详细讲解了`Function`、`Predicate`、`Consumer`、`Supplier`和`Comparator`等函数式接口的使用方法及应用场景,展示了如何利用这些接口简化代码并提高编程效率。**个人IP:shigen**,与shigen一起,每天进步一点点!
29 0
盘点java8 stream中隐藏的函数式接口
|
4月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法