java第七天(构造方法、封装、静态、继承、super与this的区别)
一、构造方法
public class Animal{
//无参构造方法
public Animal(){
}
//有参构造方法
public Animal(String name){
this.name = name;
}
}
定义:与类同名,没有返回值类型
什么调用:new 用来调用构造方法 (换句话实例化对象的时候调用构造方法)
构造方法允许重载!
构造方法重载有什么好处:创建对象的时候灵活性更好
构造方法的特点:
如果开发人员不提供构造方法,那么编译器会自动添加一个无参构造方法;
但是如果程序中已经提供了构造方法,那么编译器编译过程中就不会再提供构造方法了。
this:指代当前对象。用来区分成员变量和局部变量的同名情况。this.成员变量
注意事项
- 如果你不提供构造方法,系统会给出无参数构造方法。
- 如果你提供了构造方法,系统将不再提供无参数构造方法。
- 构造方法是可以重载的,既可以定义参数,也可以不定义参数
二、封装
原则:将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问
封装:private私有化成员属性,提供公开public的getter/setter
Getter:取值
Setter:赋值
在哪儿用:在构造方法中初始化属性值的用!!!!!或者对象名.set/get()进行使用!!!
好处:隐藏内部实现细节,保证代码的安全,同时也可以提升数据的安全性
访问修饰符,从访问的范围由小及大依次是:private default protected public
访问修饰符的作用:可以修饰类、接口、属性和方法。通常可以通过访问修饰符来改变所修饰对象的可访问范围。
public class Animal {
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("我是一只"+this.name+","+this.age+"岁了!");
}
}
//测试类
public class AnimalTest {
public static void main(String[] args) {
Animal animal = new Animal();
animal.setAge(12);
animal.setName("狼狗");
animal.show();
}
}
控制台输出:
我是一只狼狗,12岁了!
三、static关键字的应用
作用:实现一个类的所有对象共享数据
可以修饰代码块、方法、变量、常量
静态代码块:类加载时执行,只会执行一次
静态方法的调用:同一个类中,静态方法只能调用静态方法和静态变量,不同类中,使用类名.方法名()
静态变量的调用:同一个中,静态方法直接使用静态变量,不同类中,类名.静态变量名
静态变量和实例变量的区别:
静态变量属于类,被当前类的所有对象共享。
实例变量属于对象,不存在共享
静态方法和实例方法的区别:
静态方法属于类,被当前类的所有对象共享。
实例方法属于对象,不存在共享
适用场景:做工具类
四、继承
定义
继承 :就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为
好处
- 提高代码的复用性。
- 类与类之间产生了关系,是多态的前提。
OOP三大特征:封装、继承、多态
继承的概念:提供的一种子类沿用父类通用行为和属性的编码方式
继承的优势:减少代码冗余,进而可以提升代码的可维护性,提升代码可扩展性
继承的实现方式:extends
建议使用的访问修饰符:protected
继承的特点:1、传递性 2、单根性(一个子类有且仅有一个父类)、
继承描述关系:son extends father, son is a father
哪些内容不可以继承:
1、子类不能继承父类的构造方法
2、当父类中不存在空参构造方法,那么子类必须显式调用父类构造方法
子类不能继承父类的private修饰的内容(私有的属性和方法)
重写:一般发生继承里面。
特点:发生在父子类之间,方法名称相同,参数列表相同,返回值类型相同 override、访问修饰符子类不能比父类小
五、super与this的区别
super :代表父类的存储空间标识(可以理解为父亲的引用)。
this :代表当前对象的引用(谁调用就代表谁)。
访问成员
this.成员变量 ‐‐ 本类的
super.成员变量 ‐‐ 父类的
this.成员方法名() ‐‐ 本类的
super.成员方法名() ‐‐ 父类的
class Animal {
public void eat() {
System.out.println("animal : eat");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("cat : eat");
}
public void eatTest() {
this.eat(); // this 调用本类的方法
super.eat(); // super 调用父类的方法
}
}
public class ExtendsDemo08 {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Cat c = new Cat();
c.eatTest();
}
}
输出结果为:
animal : eat
cat : eat
animal : eat
访问构造方法
this(…) ‐‐ 本类的构造方法
super(…) ‐‐ 父类的构造方法
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。
super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。