Bootstrap

Java基础----封装与继承

Java基础----封装与继承

封装

面向对象的三大特征:封装,继承,多态
在这里插入图片描述
在这里插入图片描述

封装:对访问权限的控制

宠物健康值出现了-100:

把属性隐藏起来(health——>private)

提供方法对属性进行操作

public void setHealth(int health){
属性判断
    if(helth>100||helth<0)
方法体
    this.health=60;
    else{this.health=health;}
}
public int getHealth(){
方法体
return this.health;
}

完善方法,加上对属性的判断

修饰符

public:

啥也没有(默认)

private:隐藏私人的

代码示例(简单的宠物店演示)

public class Pet {
   private String name;
    String species;
    String sex;
   private int health;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setSex(int c) {

        switch (c) {
            case 1 : this.sex="公";break;
            case 2 :this.species="母";break;
            default: System.out.println("输入错误");
        }
    }

    public String getSex() {
        return sex;
    }

    public void setSpecies(int a) {
        switch (a) {
            case 1 : this.species="狗狗";break;
            case 2 :this.species="企鹅";break;
            default: System.out.println("输入错误");
        }
    }

    public String getSpecies() {
        return species;
    }

    public void setHealth(int health) {
       if (health>100 || health<0){
        this.health = 60;
       }
       else this.health=health;
    }

    public int getHealth() {
        return health;
    }
}
import java.util.Scanner;
public class TestPet {
    public static void main(String[] args) {
      Scanner scanner=new Scanner(System.in);
        Pet pet=new Pet();
        System.out.println("欢迎来到宠物店:");
        System.out.println("请输入领养宠物名字:");
String name=scanner.nextLine();
        pet.setName(name);
        System.out.println("请输入领养宠物类型:1.狗狗,2,企鹅");
       int a =scanner.nextInt();
        pet.setSpecies(a);
        System.out.println("请输入领养宠物性别:1.公,2.母");
        int c =scanner.nextInt();
        pet.setSex(c);
        System.out.println("请输入"+pet.getSpecies()+"的健康度(在100~0之间)");
        int b=scanner.nextInt();
        pet.setHealth(b);
        System.out.println("宠物的自白:");
        System.out.println("我的名字是"+pet.getName()+"健康度是"+pet.getHealth()+"我的性别是"+pet.getSex()+"我的种类是"+pet.getSpecies());


    }

}

注意:操作需要写在方法体里,不能直接写在类里。

getter/setter方法

public String getSpecies() {
return species;
}//公开给用户使用

包机制package

在这里插入图片描述

声明包:

package cn.jbit.inherit;//声明包

public class AccpScholl{
........//将这个类放在这个包里
}

声明放在第一句(除注释之外),用package声明包用分号结尾

包名的取名规范

在这里插入图片描述

包名从大到小
在这里插入图片描述

使用idea创建包

如何导入包

import 包名.类名;//导入包中的指定类

import 包名 .*//导入包中所有的类

先写声明包再导包,每个包都是独立的,顶层包不包含它的子包。

同名类(通过完整限定名去区分,或者导入具体的包)

在这里插入图片描述

访问权限

public:任何地方都可以用

public class demo1{

}

默认:只能在同包中访问

class demo1{

}

在这里插入图片描述

修饰符

static 静态修饰符(修饰方法和属性,代码块):可用类名直接访问,不用创建对象。

当类加载时,静态方法也会加载入内存

在类加载时(创建对象时)静态代码块只加载一次
在这里插入图片描述

多个实例共同操作的属性变量定义为静态变量,共同操作在内存中的同一个静态变量

静态方法

不能使用this(当前对象)和super

不能直接访问实例的变量和方法

可以直接访问静态方法和变静态量

必须被实现

可能使用静态方法的例子:1. 选票

实例方法(普通方法)

可以访问静态方法和实例方法,静态成员变量和实例成员变量

protect

继承

父类

将重复的代码抽取到父类中
在这里插入图片描述

继承关键字:extend
在这里插入图片描述

一个类只有一个直接父类,父类可以有多个子类

在这里插入图片描述

子类访问父类成员

在这里插入图片描述

每个类没写构造方法时默认无参构造方法,当写了带参构造方法时覆盖了无参构造方法 ,要使用是要写一下无参构造方法

在这里插入图片描述

子类先调父类的无参构造方法,再执行自己的构造方法,如果调用了父类的有参构造方法,那么就不执行父类无参构造方法

遇到的问题:

1.当使用Scanner类在Java中读取输入时,nextInt()方法会读取下一个整数,但不会读取该整数后面的换行符。而nextLine()方法会读取接下来的整行文本,包括换行符。这会在混合使用nextInt()nextLine()时导致一个问题。

例如,如果您先使用nextInt()读取一个整数,然后紧接着使用nextLine()读取一个字符串,nextLine()会读取到上一次nextInt()留下的换行符,并认为这是一个空行,而不是等待用户输入。

这是因为Scanner在读取输入时,是按照分隔符(默认为空格、制表符和换行符)来分隔不同的输入的。当nextInt()读取了一个整数后,它停在整数后面的第一个分隔符(通常是换行符)之前。随后调用的nextLine()会从这个换行符开始读取,因为它会读取到下一个分隔符之前的所有字符,但由于换行符后面没有其他字符,所以它返回一个空字符串。

为了避免这个问题,您需要在调用nextInt()之后立即调用nextLine()来消耗掉这个换行符,然后再读取您需要的字符串。这样做会读取并丢弃换行符,这样下一个nextLine()调用就会等待用户输入。

Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int number = scanner.nextInt();
// 消耗掉nextInt()后的换行符
scanner.nextLine();
System.out.println("请输入一个字符串:");
String text = scanner.nextLine();

2.类中可以有多个类,但只有一个公共类public class,类文件名要和公共类名相同

3.构造方法和普通方法的区别

  1. 名称

    • 构造方法通常与类名相同。
    • 普通方法则有它们自己的独特名称。
  2. 目的

    • 构造方法用于初始化新创建的对象的状态。
    • 普通方法用于执行对象的状态操作或查询。
  3. 返回类型

    • 构造方法没有返回类型,也不使用 void 关键字。
    • 普通方法必须有返回类型,可以是任何数据类型,包括 void(表示不返回任何值)。
public class Person {
    private String name;
    private int age;

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 普通方法
    public void introduce() {
        System.out.println("My name is " + name + " and I am " + age + " years old.");
    }
}

// 使用构造方法和普通方法
public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30); // 调用构造方法
        person.introduce(); // 调用普通方法
    }
}

在这里插入图片描述


;