一,类和对象
类是对象的抽象,对象是类的具体(也就是说类不是具体存在的,看不见摸不着的。对象就是实实在在存在的,是一个具体的事物)
二,封装
一般属性私有化(private),方法公有化(public),除非方法只是用来内部调用,可以用private修饰(把属性私有化,实现了对外界的隐藏,然后通过共有的getter和setter方法对属性进行获取和赋值,保证了操作的安全性)
1,对属性使用private 私有化进行修饰,实现了对外界的隐藏外界不能够直接操作类的属性。
2,定义针对属性的getter和setter方法,完成对属性的获取和设置值,在发放中可以完成安全验证。
对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。使用封装的好处:
良好的封装能够减少耦合。 |
类内部的结构可以自由修改。 |
可以对成员进行更精确的控制。 |
隐藏信息,实现细节。 |
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
class People{
public String name;
public int age;
}
public class Test {
public static void main(String[] args) {
People people = new People();
people.name = "小明";
people.age = 18;
System.out.println("姓名:"+people.name+" 年龄:"+people.age);
}
}
运行结果
这样的代码必须要了解 People 这个类的才能类内部的实现, 才能够使用这个类. 学习成本较高。
而且一旦类的实现者把name这两个字段修改成myName,外部就无法调用了,那么类的调用者就需要大量的修改代码,维护成本就非常高了。
使用 private 封装属性, 并提供 public 方法供类的调用者使用.
class People{
private String name;
private int age;
public void show() {
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class Test {
public static void main(String[] args) {
People people = new People();
people.show();
}
}
此时字段已经使用 private 来修饰. 类的调用者(main方法中)不能直接使用. 而需要借助 show 方法.
此时类的使用者就不必了解 Person 类的实现细节. 同时如果类的实现者修改了字段的名字,
类的调用者不需要做出任何修改(类的调用者根本访问不到 name, age这样的字段).
那么问题来了,我们前面说过 private 修饰的字段只能在当前类中使用。也就是说现在我们访问不到了name和age了。这就得用到 ger 和 set 方法了
3. getter和setter方法
当我们用private修饰字段后,这个字段就无法被直接使用了。
这个时候就用到了 get 和 set 方法了
class People{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class Test {
public static void main(String[] args) {
People people = new People();
people.setName("小明");
people.setAge(18);
people.show();
}
}
运行结果
getName 即为 getter 方法, 表示获取这个成员的值.
setName 即为 setter 方法, 表示设置这个成员的值
不是所有的字段都一定要提供 setter / getter 方法, 而是要根据实际情况决定提供哪种方法.
在 IDEA中快速生成 get 和 set 方法
Alt+Insert 键或者点鼠标右建找到Generate
三,继承
继承的定义:把几个类中相同的属性和方法抽离出来定义在基类中,子类不再需要定义这些属性和方法,继承之后,就相当于拥有了这些属性和方法。
1,子类继承父类,父类定义的公共的属性和方法子类会拥有,但是父类定义的私有化的属性和方法,子类不能继承
继承的意义:代码的重复使用
/**
* @author ZhangXiaoDie 2022/11/11 15:24
* @version 1.0 子类
*/
public class student {
private String name;
private int age;
private String height;
private int studentId;
public void study(){
System.out.println("学习");
}
public void sleep(){
System.out.println("睡觉");
}
public void eat(){
System.out.println("吃饭");
}
public void study1(){
System.out.println("在教室学习");
}
}
/**
* @author ZhangXiaoDie 2022/11/12 18:28
* @version 1.0 子类
*/
public class teacher {
private String name;
private int age;
private String height;
private int teacherId;
public void study(){
System.out.println("学习");
}
public void sleep(){
System.out.println("睡觉");
}
public void eat(){
System.out.println("吃饭");
}
public void study1(){
System.out.println("在办公室学习");
}
}
/**
* @author ZhangXiaoDie 2022/11/12 18:28
* @version 1.0 父类
*/
public class person {
private String name;
private int age;
private String height;
public void study(){
System.out.println("学习");
}
public void sleep(){
System.out.println("睡觉");
}
public void eat(){
System.out.println("吃饭");
}
}
继承之后 继承关键词 extends
/**
* @author ZhangXiaoDie 2022/11/11 15:24
* @version 1.0
*/
public class student extends person {
private int studentId;
public void study1(){
System.out.println("在教室学习");
}
}
/**
* @author ZhangXiaoDie 2022/11/12 18:28
* @version 1.0
*/
public class teacher extends person{
private int teacherId;
public void study1(){
System.out.println("在办公室学习");
}
}
/**
* @author ZhangXiaoDie 2022/11/12 18:28
* @version 1.0
*/
public class person {
private String name;
private int age;
private String height;
public void study(){
System.out.println("学习");
}
public void sleep(){
System.out.println("睡觉");
}
public void eat(){
System.out.println("吃饭");
}
}
方法的重写:
2,父类继承过来方法,子类可以进行改造,重新实现功能(方法的重写),调用的时候执行的是子类新实现的方法。
/**
* @author ZhangXiaoDie 2022/11/12 18:28
* @version 1.0
*/
public class person {
private String name;
private int age;
private String height;
public void study(){
System.out.println("学习");
}
public void sleep(){
System.out.println("睡觉");
}
public void eat(){
System.out.println("吃饭");
}
}
public class student extends person {
private int studentId;
public static void main(String[] args) {
}
public void study1(){
System.out.println("在教室学习");
}
public void eat(){
System.out.println("在餐馆吃饭");
}
}
执行的是子类里新实现的方法:”在餐馆里吃饭“