1.封装
1.1 什么是封装
简单的说就是,将桌上的卫生纸,放在抽屉中,告诉别人我的纸巾你不能随意使用了,如果你需要使用,通过我指定的方式去使用。这样操作保证了”高内聚,低耦合“,避免了用户随意的更改成员变量,明确了对成员变量的精准控制,隐藏信息实现细节。
1.2 如何封装
使用private修饰,对外提供使用成员变量的方法。
1.3为什么要使用包
1.允许类可以组成最小单元,便于查找
2.避免类名冲突,在不同的包可以定义同名的类
3.有助于实施访问权控制
包的命名规范:
1.包名小写,不能以点开头或者结尾 包名之间是以点分割,一个点代表一个目录层级
2.需要添加唯一前缀
3.包名后续根据企业要求命名规范执行
注:如果在一个类中引用了类要用import导入,后续再引用一个相同名字的类要用类的权限命名来new
继承
继承的概念:
继承(inheritance)机制是面向对象程序设计中使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生的新类,称派生类(或子类),被继承的类称基类(或父类)。
继承形式:
class 新类的名字:继承方式 继承类的名字{};
注:一个类只能有一个父类,但是一个父类可以有很多个子类
但是如果a继承b b继承c 那么a也可以使用c的属性与方法
访问父类
形式:
super.元素;
注:如果父类的元素被private修饰则不能使用,如果想要使用只能通过父类提供的方法去使用当super()时 调用父类的构造方法 且只能放在方法的第一行
方法重写
作用:
父类的一个方法显然不能将完全满足子类的相同名字的方法要做的事,重写的出现可以使子类能针对自己的需求去设计自己的方法。
需求:
只能子类中存在,方法的参数 方法名 返回值或者其子类 限定修饰符(权限要小于等于父类一般相同),都要与父类相同 代码块可以不一样。
形式:
class Father{
public void print(){
System.out.println("父类");
}
}
class Son extends Father{
public void print(){
System.out.println("子类");
}
}
类中常见的重写方法
//重写equals方法
public boolean equals(Object object){
//如果是同一个对象
if(this==object){
return true;
}
if (object instanceof Student student){
return this.name.equals(student.name)&&this.age==student.age;
}
return false;
}
重写hashCode()方法的原因:
在我们的日常开发 或者 很多数据结构中 有一个要求:两个对象如果使用equals比较为true 那么它们的hash值必须一样,所以我们重写equals方法的同时,都会重写hashCode。
//形式:
public int hashCode() {
return Objects.hash(name, age);
}
//重写toString方法
public String toString(){
return "名字: "+name+", 年龄: "+age;
}
注:上列重写方法都是根据成员变量等进行重写的。
Object类
如果一个类没有父类就没有继承Object类
多态
概念:
继承可以降低代码编写的冗余度,提高编程的效率。通过继承,子类获得了父类的成员变量和方法。
package bdqn.test01;
public class Person {
private String name;
private String gender;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
}
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
}
package bdqn.test01;
public class Student extends Person{
private int sno;
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public Student() {
}
public Student(String name, String gender, int age, int sno) {
super(name, gender, age);
this.sno = sno;
}
public void print(){
System.out.println("烦死了");
}
}
package bdqn.test01;
public class test {
public static void main(String[] args) {
/*
(4)最后编写一个测试类,此类里面包含main()方法,在main()方法中定义两个学生s1和s2并给他们赋值,
最后显示他们的学号、姓名、性别以及年龄,以及判断两个学生是否是同一个学生。
*/
Person person=new Student("小明","男",25,101);
person.print();
}
}
注:因为print()方法是子类Student的方法而不是父类Person的方法,所以person无法使用print()方法。