封装
- 通俗理解:将某些东西进行隐藏,然后提供相应的方式进行获取;
- 封装的好处:提高代码的安全性;
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
- 低耦合:仅对外暴露少量的方法用于使用;
- 隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可扩展性、可维护性;通俗的说,把该隐藏的隐藏起来,该暴露
的暴露出来,这就是封装性的设计思想;
package com.yuzhenc.oop;
public class Person4 {
private String name;
private int age = -1;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
if (age > 150 || age <= 0){
return;
}
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
package com.yuzhenc.oop;
public class Test05 {
public static void main(String[] args) {
Person4 p4 = new Person4();
p4.setName("sqlboy");
p4.setAge(250);
System.out.println(p4.getAge());
p4.setAge(25);
System.out.println(p4.getAge());
}
}
- 总结
- 将属性私有化,被private修饰,加入权限修饰符,一旦加入了权限修饰符,其他人就不可以随意的获取这个属性
- 提供public修饰的方法让别人来访问/使用
- 即使外界可以通过方法来访问属性了,但是也不能随意访问,因为咱们在方法中可以加入 限制条件
继承
- 子类继承父类一定在合理的范围进行继承的,子类 extends 父类;
- 父类private修饰的内容,子类实际上也继承,只是因为封装的特性阻碍了直接调用,但是提供了间接调用的方式,可以间接调用;
- 一个父类可以有多个子类,一个子类只能有一个直接父类,但是可以间接的继承自其它类,因为继承具有传递性;
- 继承的好处:提高了代码的复用性,父类定义的内容,子类可以直接拿过来用就可以了,不用代码上反复重复定义了;便于代码的扩展;为了以后多态的使用。是多态的前提
- 方法的重写:发生在子类和父类中,当子类对父类提供的方法不满意的时候,要对父类的方法进行重写;重写的方法,子类的方法名字和父类必须一致,参数列表(个数,类型,顺序)也要和父类一致;
- super:指的是父类的,可以修饰属性和方法
- 在子类的方法中,可以通过 super.属性 super.方法 的方式,显示的去调用父类提供的属性和方法。在通常情况下,super.可以省略不写;在特殊情况下,当子类和父类的属性或方法重名时,你要想使用父类的属性,必须加上修饰符super.,只能通过super.属性来调用;
- super修饰构造器:所有构造器的第一行默认情况下都有super(),但是一旦你的构造器中显示的使用super调用了父类构造器,那么这个super()就不会给你默认分配了;如果构造器中没有显示的调用父类构造器的话,那么第一行都有super(),可以省略不写;
- super调用父类构造器和this调用子类构造器只能存在一个,两者不能共存;因为super修饰构造器要放在第一行,this修饰构造器也要放在第一行;
package com.yuzhenc.oop;
public class Person5 {
private String name;
int age;
public Person5(){};
public Person5(String name, int age){
this.name = name;
this.age = age;
}
public void sleep(){
System.out.println("人在睡觉!");
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
package com.yuzhenc.oop;
public class Student extends Person5{
private int sno;
int age = 25;
public Student(){};
public Student(int sno) {
this.sno = sno;
}
public Student(int age, int sno){
this(sno);
super.setAge(age);
}
public Student(String name, int age, int sno) {
super(name, age);
this.sno = sno;
}
@Override
public void sleep() {
System.out.println("学生在睡觉!");
}
public void read() {
System.out.println("学生在读书!");
}
public void printAge() {
System.out.println(age);
System.out.println(super.age);
}
}
package com.yuzhenc.oop;
public class Test06 {
public static void main(String[] args) {
Student s1 = new Student("sqlboy",20,26);
s1.sleep();
s1.printAge();
s1.read();
}
}
修饰符 | 同一个类 | 同一个包 | 子类 | 所有类 |
---|
private | * | | | |
default | * | * | | |
protected | * | * | * | |
public | * | * | * | * |
Object类
- 所有类都直接或间接的继承自Object类,Object类是所有Java类的根基类;
- 所有的Java对象都拥有Object类的属性和方法;
- 如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类;
- to_String() 方法:返回该对象的字符串表示,经常子类进行重写;
- equals()方法: 比较两个对象的内容是否相同,经常子类进行重写;
package com.yuzhenc.oop;
import java.util.Objects;
public class Person6 {
private String name;
private int age;
public Person6(String name, int age) {
this.name = name;
this.age = 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;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person6)) return false;
Person6 person6 = (Person6) o;
return age == person6.age && Objects.equals(name, person6.name);
}
@Override
public String toString() {
return "Person6{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) {
Person6 p6 = new Person6("sqlboy",25);
Person6 ps6 = new Person6("sqlboy",25);
System.out.println(p6);
System.out.println(ps6);
System.out.println(p6 == ps6);
System.out.println(p6.equals(ps6));
}
}
多态
- 继承是先有父类再有子类,泛化是先有子类再泛化父类;
- 多态指的就是同一个方法调用,然后由于对象不同会产生不同的行为;
- 多态可以提高扩展性,但是扩展性没有达到最好,后面还有反射;
- 多态要素:继承;重写;父类引用指向子类对象;
package com.yuzhenc.oop;
public class Animal {
public void shout() {
System.out.println("我是动物,我可以叫...");
}
}
class Cat extends Animal {
@Override
public void shout() {
System.out.println("我是小猫,可以喵喵喵地叫...");
}
public void scratch() {
System.out.println("我是小猫,我可以挠人...");
}
}
class Dog extends Animal {
@Override
public void shout() {
System.out.println("我是小狗,可以汪汪汪地叫...");
}
public void guard() {
System.out.println("我是小狗,我可以看家护院...");
}
}
class Pig extends Animal {
@Override
public void shout() {
System.out.println("我是小猪,我可以嗯嗯嗯地叫...");
}
public void eat() {
System.out.println("我是小猪,我可以吃东西...");
}
}
class Girl {
public void play(Animal animal) {
animal.shout();
}
}
package com.yuzhenc.oop;
public class Test07 {
public static void main(String[] args) {
Pig pig = new Pig();
Girl girl = new Girl();
Dog dog = new Dog();
Cat cat = new Cat();
girl.play(pig);
girl.play(dog);
girl.play(cat);
}
}