目录
一.封装
前言:
封装是面对对象三大特征之一。封装可以隐藏实现细节,仅对外暴露公共的访问方式,保证内部结构的安全。
1.封装的定义:
封装就是将对象运行所需要的资源封装在程序对象中,并给外界公布接口,这样很复杂的逻辑经过包装之后给其他类使用就很方便,其他类不需要关心你里边的功能是以哪种方式实现的,只要传入需要的参数就可以得到想要的结果。
2.封装的作用
- 提高代码的安全性,就是说我只给外界暴露尽可能少的东西,这样对内部是比较安全的,同时也避免了在外部无意的破环,保护了内部的数据
- 提高代码的复用性。就是说比如在遇到这个问题,我不使用封装,那么解决了这个问题,在下次又遇到的类似的问题还要继续再敲一遍代码吗?所以代码封装以后,我i就再给他一个接口,或者少许的修改一下就可以了
- “高内聚”,是指类的内部数据操作细节我们自己完成,不允许外部干涉。我们将内部的细节封装,隐藏起来,这样不仅便于后期内部代码的修改,更是提高了可维护性。
- “低耦合”,是指仅需暴露少量的方法给外部使用,尽量方便外部使用。就是说简化外部调用,便有调用者使用,便于扩展和协作。
**如何封装:**创建你需要的类,解决方案管理器右键,然后添加一个类,创建类的名称,确定。
3.什么情况下用封装
- 保护字段/数据,这个字段/数据我不想让外界用户知道,就使用封装
- 但是可以让外部修改它,这个时候就使用到封装(属性封装)
- 这个字段/数据我要限制用户输入的值,比如说这个字段是sex性别,只能输入男和女,超出了这个范围 就没有数据,所以我们要限制用户输入的内容,这个时候就使用封装
- 就是只提供这个数据可以给用户外界使用,但不能修改它,此时就用到的封装
4.set和get方法
在使用private访问修饰符进行封装时,要留给用户一个展示口看到我们想给用户看到的信息,所以就用到了set()和get()方法。
作用:一般来讲,get是取来值的方法,set是设置值的方法,因为get在英文中有取,拿的意思,而set有设置的意思,所以用源get,set能很形象的明白方法的目的,比如对于一个name属性,getName就是取出这个name的名称,而setName就是设置name的名称。
代码介绍:
//动物类
public class Animal{
//私有化:宠物名
private String name;
//私有化:性别
private String sex;
//生成set和get方法
//获取名字
public String getName() {
return name;
}
//设置名字
public void setName(String name) {
this.name = name;
}
public String getSex(){
return sex;
}
public String setSex(String sex){
this.sex = sex;
}
}
//测试类
public class DogTest{
public static void main(String[] args){
//创建一个对象
Dog dog = new Dog();
//将名字和性别传到Dog类中
dog.setName("可可");
dog.setSex("雌");
//展示狗狗的名字和性别
System.out.println(dog.getName + dog.getSex);
}
}
二.继承
前言:
继承是面向对象语法的三大特征之一。继承可以降低代码编写的冗余度,提高编程的效率。通过继承,子类获得了父类的成员变量和方法。
1.继承的定义
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
2.继承的作用
通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
3.继承的优缺点
优点:
- 继承过来的字段和方法,可以像任何其他字段和方法一样被直接使用;
- 在子类中可以声明一个与父类中同名的新字段或静态方法,从而“隐藏”父类中的字段或方法;
- 可以在子类中声明一个在父类中没有的新字段和方法;
- 可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”或“方法覆盖”;
- 可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式地实现,也可以通过使用关键字super来实现。
缺点:
当父类发生变化时,子类不得不跟着变化,削弱了子类的独立性
4.继承的格式
public class子类名 extends 父类名{}
class 父类{
... //成员变量、成员方法
}
class 子类 extends 父类{
... //类体
}
//声明一个teacher类为父类
class teacher{
//定义父类的成员变量name、age
String name;
int age;
//定义父类成员方法,将成员变量输出
void show(){
System.out.println(name);
System.out.println(age);
}
}
//声明一个Student类为子类并继承父类
class Student extends teacher {
}
public class myfirst {
public static void main(String[] args) {
System.out.println("学生");
//声明一个Student类的实例对象student
Student student=new Student();
//子类调用父类的成员变量name并赋值
student.name="Tom";
//子类调用父类的成员变量age并赋值
student.age=19;
//子类调用父类的成员方法show
student.show();
}
}
//输出结果
学生
Tom
19
注意:
- 子类不能选择性继承父类;
- Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;
- 构造方法不会被子类继承,但可以从子类中调用父类的构造方法。
5.Super关键字
super:调用父类中重写的方法、访问父类中被隐藏的字段
子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段
例如:
class Animal{
public String name="琪琪"; //添加成员变量
public void sat() { //添加成员方法say
System.out.println("我是父类A成员方法say");
}
}
class Dog extends Animal{
public String name="暖暖"; //与父类中同名的字段,隐藏父类
public void sat(){ //重写方法say
super.sat(); //使用super关键字调用父类中的方法
System.out.println("我是子类B成员方法sat");
System.out.println("父类的name名字:"+super.name); //使用super关键字访问父类中的变量
}
}
public class Two {
public static void main(String[] args) {
Dog dog=new Dog (); //创建子类的一个实例对象
dog.sat(); //调用子类中重写的方法
System.out.println("子类的name名字:"+dog.name); //调用子类中的name
}
}
//运行结果
我是父类Animal成员方法sat
我是子类Dog成员方法sat
父类的name名字:琪琪
子类的name名字:暖暖
使用super调用父类的无参数构造方法/有参数构造方法
子类不继承其父类的构造方法。
- 当使用无参数的super()时,父类的无参数构造方法就会被调用;
- 当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。