1.封装
什么是封装?有什么作用?
封装就是将一些复杂的或者不想让你看见的事物包装起来。例如遥控器,里面的电路板多么复杂和丑陋,用一个壳将他包装起来,就达到了封装的效果,并且你只能通过遥控器的按钮来进行操作它给你提供的功能,并且你不能自己添加功能或者修改功能,这就是封装的作用和好处。
封住的目的?
简化代码,提高代码和数据的安全性,让使用者不能直接访问到内部数据和方法,只能使用提供的外部接口间接访问。
封装的步骤:
1.用Private关键字修饰成员变量
private String name;
private int age;
private int id;
2.使用public修饰getter和setter方法
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 int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
快捷生成getter和setter方法:
1.鼠标右击点击生成
2.点击Getter和Setter
3.然后出现这个界面,按住shift点击三个按确定即可快捷生成Getter和Setter方法
生成结果:
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 int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
完整封装和调用:
public class Test1{
public static void main(String[] args) {
Add add = new Add("小王",18,001);
System.out.println(add.getName());
System.out.println(add.getId());
System.out.println(add.getAge());
}
}
class Add{
private String name;
private int age;
private int id;
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 int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Add(String name,int age,int id){
this.setName(name);
this.setId(age);
this.setAge(id);
}
public Add(){
}
}
2.继承
什么是继承?
继承顾名思义就是子承父业,儿子继承父亲的财产,并对财产有使用和操作的权力,但是父亲所学的的知识或者经历之类的属于父亲的私有财产,儿子不能继承,也就是说父类里面的私有属性儿子不能继承,其他的非私有属性儿子类都能继承,并且一个父亲的财产还可以被多个儿子继承,但是一个儿子只能有一个父亲。
注意:
- Java是单继承的,一个类只能继承一个直接父类。
- Java 不支持多继承,但支持多重继承
继承的作用
减少代码的冗余,提高代码的复用性
继承的语法
public class A{ }
public class B extends A{ }//B继承A所有的属性和方法
方法重写
当子类继承父类中方法的时候,如果父类中的方法不满足子类的需求的时候,就需要使用到方法重写,对方法体重新编写,子类中重新编写的方法就会覆盖父类中的方法。
注意:
- 子类中方法重写的方法名要与父类中的需要重写的方法的方法名相同
- 子类方法覆盖父类方法,必须要保证权限大于等于父类权限
例如:
在这段代码中,子类中的方法覆盖了父类的方法AS, 但是子类的方法是用private修饰符修饰,因为private修饰符的作用范围没有public修饰符的作用范围大,所有会报错。
这里有段代码,大家可以看一下运行结果是多少?
public class Test1{
public static void main(String[] args) {
B b = new B();
b.AS();
}
}
class A{
String name;
int age;
public A(){
this.name="小王";
this.age=18;
System.out.println(this.name+this.age);
}
public void AS(){
this.name="小黑";
this.age=12;
System.out.println(this.name+this.age);
}
}
class B extends A{
public B(){
this.name="小雨";
this.age=50;
System.out.println(this.name+this.age);
}
public void ms(){
this.name="小黄";
this.age=5;
System.out.println(this.name+this.age);
}
}
一般人会认为结果是小王 小黑 小雨,但正确输出结果是
为什么呢?
因为继承关系中构造方法的执行有先后顺序。
父类静态代码 >子类静态代码 >父类构造方法 >子类构造方法
所有会将上面类中的父类构造方法优先输出,然后输出子类的构造方法,再输出普通的方法