首页 > 编程语言 >Java面向对象:初识继承

Java面向对象:初识继承

时间:2024-06-17 22:27:54浏览次数:33  
标签:Java name age Dog 面向对象 初识 Animal public String

继承:一个类(子类或派生类)继承另一个类(父类或基类)的特性(属性和方法)。

1、继承

1.1、不使用继承

例子:

class Dog{
    String name;
    int age;
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(name + "在吃饭");
    }
    public void bark(){
        System.out.println(name + "在狗叫");
    }
}
class Cat{
    String name;
    int age;
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(name + "在吃饭");
    }
    public void mew(){
        System.out.println(name + "在猫叫");
    }
}
public static void main(String[] args) {
    Dog dog = new Dog("小狗", 5);
    dog.eat();
    dog.bark();

    System.out.println("==============");

    Cat cat = new Cat("小猫",6);
    cat.eat();
    cat.mew();
}

输出:

小狗在吃饭
小狗在狗叫
==============
小猫在吃饭
小猫在猫叫

从上述代码可以看出,Dog和Cat猫的内容上存在大量重复,那么就可以利用继承,将共性的内容进行抽取,实现代码复用。

1.2、使用继承

例子:

class Animal {
     String name;
     int age;
     public Animal(String name, int age) {
        this.name = name;
        this.age = age;
     }
     public void eat(){
        System.out.println(name + "在吃饭");
     }

}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name,age); // 使用 super 关键字调用父类的构造方法
    }
    public void bark(){
        System.out.println(name + "在狗叫");
    }

}
class Cat extends Animal{
    public Cat(String name, int age) {
        super(name,age); // 使用 super 关键字调用父类的构造方法
    }
    public void mew(){
        System.out.println(name + "在猫叫");
    }
}
public static void main(String[] args) {
    Dog dog = new Dog("小狗", 5);
    dog.eat();
    dog.bark();

    System.out.println("==============");

    Cat cat = new Cat("小猫",6);
    cat.eat();
    cat.mew();
}

输出:

小狗在吃饭
小狗在狗叫
==============
小猫在吃饭
小猫在猫叫

注意:

1、在表示继承时,需要用extends关键字;

2、子类会将父类的成员变量或成员方法继承到子类;

3、一次只能继承一个类,不能继承多个类。

2、子类中访问父类的成员变量

如果访问的成员变量子类有,则优先访问子类;子类没有,则访问父类;都没有,则报错。

2.1、子类和父类中不存在同名成员变量

class Animal {
    String name;
    int age;
}
class Dog extends Animal{
    String color;
    public void fun(){
        name = "小狗"; // 访问从父类中继承下来的name
        age = 5;  // 访问从父类中继承下来的age
        color = "黄色"; // 访问子类自己的color
        System.out.println(name);
        System.out.println(age);
        System.out.println(color);
    }
}
public static void main(String[] args) {
    Dog dog = new Dog();
    dog.fun();
}

输出:

小狗
5
黄色

2.2、子类和父类中存在同名成员变量

例子:

class Animal {
    String name;
    int age;
    String color;
}
class Dog extends Animal{
    char age;
    String color;
    public void fun(){
        name = "小狗";
        age = '5';
        color = "黄色";
        System.out.println(name); //访问父类继承下来的
        System.out.println(age); //访问子类本身的
        System.out.println(color); //访问子类本身的
    }
}

3、子类中访问父类的成员方法

如果访问的成员方法子类有,则优先访问子类;子类没有,则访问父类;都没有,则报错。

3.1、子类和父类中不存在同名成员方法

例子:

class Animal {
     String name;
     int age;
     public Animal(String name, int age) {
        this.name = name;
        this.age = age;
     }
     public void eat1(){
        System.out.println("Animal的name" + "在吃饭1");
     }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name,age); // 使用 super 关键字调用父类的构造方法
    }
    public void eat2(){
        System.out.println("Dog的name" + "在吃饭2");
    }
    public void fun(){
        eat1();
        eat2();
    }
}
public static void main(String[] args) {
    Dog dog = new Dog("小狗", 5);
    dog.fun();
}

输出:

Animal的name在吃饭1
Dog的name在吃饭2

3.2、子类和父类中存在同名成员方法

例子:

class Animal {
     String name;
     int age;
     public Animal(String name, int age) {
        this.name = name;
        this.age = age;
     }
     public void eat(){
        System.out.println(name + "在吃饭");
     }
    public void showName(){
        System.out.println("Animal的name: " + name);
    }

}
class Dog extends Animal{
    String name; // 子类成员变量,与父类同名
    public Dog(String name, int age) {
        super(name,age); // 使用 super 关键字调用父类的构造方法
        this.name = name;
    }
    public void bark(){
        System.out.println(name + "在狗叫");
    }
    public void showName(){
        System.out.println("Dog的name: " + name); // 访问的是子类的name
    }
}
public static void main(String[] args) {
    Dog dog = new Dog("小狗", 5);
    dog.eat();
    dog.bark();
    dog.showName();
}

输出:

小狗在吃饭
小狗在狗叫
Dog的name: 小狗

4、super关键字

4.1、调用父类的构造方法

在子类的构造方法中,可以使用super()来调用父类的构造方法。

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

class Dog extends Animal{
    public Dog(String name, int age) {
        super(name,age); // 使用 super 关键字调用父类的构造方法
    }
}

4.2、访问父类的成员变量

如果子类中存在与父类同名的成员变量,可以使用super来访问父类的成员变量。

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void printAnimal(){
        System.out.println("name" + this.name);
    }

}

class Dog extends Animal{
    String name;
    public Dog(String name, int age) {
        super(name,age); 
        this.name = "小黄";
    }
    public void printDog(){
        System.out.println("Dog的name:" + this.name);
        System.out.println("Animal的name:" + super.name);
    }
}
public static void main(String[] args) {
    Dog dog = new Dog("小狗", 5);
    dog.printDog();
}

输出:

Dog的name:小黄
Animal的name:小狗

4.3、访问父类的方法

如果子类重写了父类的方法,但想要调用父类中被重写的方法,可以使用super来访问父类的成员方法。

例子:

class Animal {
    String name;
    int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println("Animal在吃饭");
    }
}

class Dog extends Animal{
    public Dog(String name, int age) {
        super(name,age);
    }
    public void eat(){
        System.out.println("Dog在吃饭");
        super.eat();
    }
}
public static void main(String[] args) {
    Dog dog = new Dog("小狗", 5);
    dog.eat();
}

输出:

Dog在吃饭
Animal在吃饭

5、父类和子类同时有构造方法

当父类和子类同时有构造方法时,先执行父类的构造方法,再执行子类的构造方法。

例子:

class Animal {
    public Animal() {
        System.out.println("Animal的构造方法");
    }
}
class Dog extends Animal{
    public Dog() {
        super();
        System.out.println("Dog的构造方法");
    }
}
public static void main(String[] args) {
    Dog dog = new Dog();
}

输出:

Animal的构造方法
Dog的构造方法

注意:

1、在子类构造方法中,如果没有写super(...),会默认有一条super();

2、super()只能出现在第一条;

3、super()只能出现一次;

4、super()和this不能同时出现。

标签:Java,name,age,Dog,面向对象,初识,Animal,public,String
From: https://blog.csdn.net/m0_67456201/article/details/139708491

相关文章

  • 面经梳理-java多线程同步协作
    题目Synchronized和ReentryLock锁锁可以视作访问共享数据的许可证。锁能够保护共享数据以实现线程安全,其作用包括保障原子性、保障可见性和保障有序性。Java平台中的锁包括内部锁(IntrinsicLock)和显式锁(ExplicitLock)。内部锁是通过synchronized关键字实现的;显式锁是通过java.ut......
  • 面经梳理-java多线程其他
    题目Threadlocal使用场景?原理?如何保证内存不泄露?ThreadLocal使用场景不加锁的情况下,多线程安全访问共享变量,每个线程保留共享变量的副本(线程特有对象),每个线程往这个ThreadLocal中读写是线程隔离。ThreadLocal原理Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量th......
  • 深入探讨JavaScript的执行机制
    预编译首先下面这段代码的执行是一个怎样的结果呢?showName();console.log(MyName);varMyName='小陈同学'functionshowName(){console.log('函数showName被执行');}在这段代码中我们声明了一个变量MyName和一个函数showName,调用函数,打印MyName因为在函......
  • 面经梳理-java多线程基础
    题目线程和进程的概念?守护线程是干什么的?常见的守护线程有哪些?线程和进程的概念进程是程序的运行实例,是程序向操作系统申请资源的基本单位,线程是进程的一条执行路径。Java的线程分为两种:用户线程和守护线程。守护线程作用是为其他线程提供服务,如果所有的用户线程死亡,后台线程......
  • 面经梳理--java
    题目Java创建一个对象的方法有几种?使用new关键字反射(1)使用Class类的newInstance方法,只能无参构造器Employeeemp2=(Employee)Class.forName("org.programming.mitra.exercises.Employee").newInstance();或者(目前Class.newInstance()这种方法因为效率问题已经被标记@......
  • 面向对象程序设计1.2 类之间的组合关系
    一、复习一下在1.1里我们定义了类Date,忘记的小伙伴可以看看下面的代码classDate{private:intyear;intmonth;intday;//数据成员,默认为私有public:Date():year(2000),month(1),day(1){}//不带参数的构造函数Date(intyear,intmonth,in......
  • 45.JavaScript基础【三】
    【一】JavaScript之函数1)函数声明函数须先声明,才能使用函数声明时不会立即执行,只有调用时才会执行function函数名(参数1,参数2){ 代码体}2)函数调用函数名()函数的执行与定位位置无关,只与调用位置有关可多次调用,每次调用都是独立不相关的3)函数分类1.无......
  • 44.JavaScript基础【二】
    【一】JavaScript之运算符1)算术运算符加法:+减法:-乘法:*除法:/优先运算:()取余:%特殊NaNNaN参与的运算结果全是NaN隐式转化null转成0undefined转成NaN2)比较运算符>大于<小于<=小于等于>=大于等于==相等!=不相等===全等与相等区别在于会判断数据......
  • 43.JavaScript基础【一】
    【一】JavaScript1)介绍也是一门编程语言,他可以写后端代码JS是由ECMAScript、DOM、BOM组成JS是运行在浏览器脚本的语言2)注释语法//单行注释/*多行注释多行注释*/3)js代码的书写位置head头里面的script标签中写在body体最下面直接常见一个js脚本文件,......
  • 47.JavaScript基础【五】
    【一】什么是jQuery1)概述是一个轻量的、兼容多浏览器的JavaScript的第三方库其内部封装了JS代码、能通过更少的代码操作DOM对象提高了代码效率、简化了代码量2)优势轻量级的JS框架丰富的DOM选择器链式表达式事件、样式、动画支持Ajax操作支持跨浏览器兼容插件扩展开......