Java继承&封装
封装
- 封装的概念
在我们写代码的时候经常会涉及两种角色: 类的实现者和类的调用者
封装的本质就是让类的调用者不必太多的了解类的实现者是如何实现类的,
把属性和动作隐藏,只提供相应的方法来调用即可,只要知道如何使用类就行了.
当类的实现者把内部的逻辑发生变化时,类的调用者根本不用因此而修改方法。
这样就降低了类使用者的学习和使用成本,从而降低了复杂程度,也保证了代码的安全性。 - private来实现封装
private 访问限制修饰符,被它修饰的字段或者方法就只能在当前类中使用。
- set/get函数来对封装的属性进行使用
public void setAge(int age) {
if (age<0) {
System.out.println("前来古人");//可以用来限定检测我们输入的数据是否合理
//提高了属性的安全性
}
}
public class user {
private String username;
private String userpassword;
private String userphone;
private String useradr;
private int userscore;
// 给每个属性加上一对出入的方法 get&set
//set 给属性赋值
//get 获取对象属性
public void setusername(String username) {
if(username!=null||username.equals("")) {
this.username=username;
}else {
System.out.println("用户输入非法!");
}
}
//自己的属性使用都用this 指代
public String getusername() {
return this.username;
}
}
public class usermanage {
public static void main(String[] args) {
user user1 =new user();
user1.setusername("dmsl");
String name=user1.getusername();
System.out.println(name);
}
}
构造方法
- 以类名为方法名,没有返回值结构
- 每个类都有一个隐式的空参数构造方法 只要类中定义了构造方法就会被覆盖
- 隐式的构造方法不参与重载
- 创建对象时全部属性都可以进行初始化(不过不大建议那么写)
继承
- 语法:extends
- 格式:
子类 继承(extends)父类{}
接口 继承(extends)接口{} //抽象与抽象之间 - 抽象的 抽象类 接口{抽象方法}
- 具体的 类
- 原则:
1. 抽象不依赖具体
2. 具体依赖抽象——依赖抽象的可以扩展更方便 - 继承的范围:
- 子类继承了父类的所有东西
继承关系中的方法重写
public class student {
public String name;
private String age;
int id;
protected int score;
public void setAge(String age) {
this.age=age;//子类依然会继承,所以它还是有这个属性的
}
public void study() {
System.out.print("父类的学习方法!");
}
}
public class unitstudent extends student {
//测试在子类中可以直接调用哪个属性
public void infoprint() {
System.out.println(name);
//System.out.println(age);//不可调用
System.out.println(id);
System.out.println(score);
}
//重写父类的方法
@Override//注解:检测这个方法是不是重写的
public void study() {
//System.out.print("父类的学习方法!");
System.out.print("这是子类的学习方法!");
}
}
- 继承关系中:子类可以重写父类的方法
- 重写的注解:
@Override 检查方法重写是否正确 - 格式要求:
除方法体之外(访问权限修饰符,返回值类型,方法名(参数类型,参数变量名))与父类一致;
重写之后,子类以及子类的对象优先调用重写之后的方法;
子类对于父类的扩展开放
自动转型
- 每个对象都不止一种身份类型
- 一个学生对象 ->学生类 ->人类
一个大学生类型的对象
- 创建对象
unitstudent stu1= new unitstudent();
-创建对象:new unitstudent();
-声明一个unitstudent类型的变量名;
-返回对象所在的地址给stu1这个变量名(对象名)
- 大学生类 student
- 学生类型 unitstudent
- 子类对象可以自动转型为父类类型(一个子类对象的变量储存的对象引用地址,也可以存在父类类型的变量名中)
public class stumanange {
static void stu_study(student stu) {
stu.study();
}
public static void main (String[] args) {
unitstudent stu1= new unitstudent();
System.out.println(stu1.getClass());
student stu2=new student();
System.out.println(stu2.getClass());
student stu3=new unitstudent();//子类对象自动转型为父类类型,还是调用重写之后的方法
System.out.println(stu3.getClass());
stu1.name="dmsl";
stu1.id=19911106;
stu1.score=116;
stu1.setAge("29");//此时stu1具有了age这一属性
//stu1.age=29 不可以直接调用
stu1.study();
stu2.study();
stu3.study();
stu_study(stu1);
stu_study(stu2);
stu_study(stu3);
Midstudent stu4= new Midstudent();//创建新对象
stu4.study();//调用的study函数结果
}
}