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.构造方法和普通方法的区别
-
名称:
- 构造方法通常与类名相同。
- 普通方法则有它们自己的独特名称。
-
目的:
- 构造方法用于初始化新创建的对象的状态。
- 普通方法用于执行对象的状态操作或查询。
-
返回类型:
- 构造方法没有返回类型,也不使用
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(); // 调用普通方法
}
}