封装
封装的概念
把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类或者对象进行操作,对不可信的类或者对象隐藏,这样的过程叫做封装。
封装的分类
对属性的封装
将属性设置为private(私有),限制其只能在类的内部使用
对方法的封装
对于方法的封装,将外部可以访问方法设置为public,将外部不能访问的方法设置为private
代码示例
//将属性和方法进行封装 public class Encapsulation { //成员变量设置为私有,达到属性封装的目的 private String name; //为私有属性获取提供getter方法,用于获取属性值 public String getName() { return name; } //为私有属性获取提供setter方法,用于给属性赋值 public void setName(String name) { this.name = name; } //将成员方法设置为私有,达到封装的目的 private void eat(){ System.out.println("我是一名程序员,哈哈!!!"); } }
继承
什么是继承
一个新类可以从现有的类派生,这样的过程叫做继承。
那么在继承的过程中,新类被称为子类,现有的类被称为父类,子类将会继承父类的属性和行为。
编辑 继承的语法
[修饰符] class 子类类名 extends 父类类名 {类体部分}
代码示例
创建一个动物类(Animal)
public class Animal { private int age; private String sex; private void eat(){ System.out.println("吃饭!!!"); } private void sleep(){ System.out.println("睡觉!!!"); } }
创建一个狗类(Dog),继承动物类(Animal)的属性和方法
public class Dog extends Animal{ public static void main(String[] args) { Dog dog=new Dog(); dog.setAge(3); dog.setSex("公"); System.out.println("狗狗今年"+dog.getAge()+"岁"); System.out.println("狗狗性别是"+dog.getSex()+"狗"); dog.eat(); dog.sleep(); } }
Dog类继承了Animal类,Dog类可以称为AniMal的子类,Animal类可以成为Dog里的父类。
子类的扩展
子类除了可以拥有父类非私有的属性和方法外,也可以扩展自己的属性和方法
代码示例
public class Dog extends Animal{ private String name; public void shout(){ System.out.println("汪汪汪汪!!!"); } public static void main(String[] args) { Dog dog=new Dog(); //private修饰变量和方法的可以直接在内部调用 dog.name="旺财"; System.out.println(dog.name); dog.shout(); } }
- Java中的继承是单继承,也就是一个类只能有一个父类。
- 如果一个类没有显式的继承某一个类,那么它有一个默认的父类是java.lang.Object类
- Java继承了父类非私有的成员变量和成语方法,但是请注意:子类是无法继承父类的构造方法的
方法的重写
重写 override overload
子类从父类继承的某个实例方法无法满足子类的功能需要时,需要在子类中对该实例方法进行重新实现,这样的过程称为重写,也叫做覆写。
方法重写的要求
子类重写方法的访问修饰范围必须大于或者等于父类对应方法的访问修饰符范围
除修饰符外,重写方法的其他部分必须和父类保持一致
super关键字
super代表的是父类对象
super的使用方式
super.属性名 用于在子类中调用父类被隐藏的同名实例变量
代码示例
public class SuperClass { int num=20; //static 修饰内部类 可以被外部访问 static class SubClass extends SuperClass{ int num=30; public void speak(){ System.out.println(super.num); System.out.println(num); } } public static void main(String[] args) { SubClass subClass=new SubClass(); subClass.speak(); } }
super([参数列表]) 用于在子类的构造方法中调用父类的构造方法
代码示例
public class SuperClass { public SuperClass(){ System.out.println("父SuperClass的无参构造器"); } public void speak(){ System.out.println("我是父类!!!"); } //static 修饰内部类 可以被外部访问 static class SubClass extends SuperClass{ int num=30; public SubClass(){ super(); //可以不写,默认就有 System.out.println("子SubClass的无参构造器"); } public void speak(){ super.speak(); System.out.println("我是子类!!!"); } } public static void main(String[] args) { SubClass subClass=new SubClass(); subClass.speak(); } }
- 每一个子类的构造方法在没有显示调用super()系统都会提供一个默认的super()
- super() 书写在第一行
- 可以在子类构造方法中显示调用super(),完成对特定父类构造方法的调用
多态
什么是多态
多态顾名思义即为多种形态的意思
Java中多态的含义
发送消息给某个对象,让这个对象自行决定采用哪种行为响应这个消息
子类对象的引用赋值给父类引用变量来实现动态的方法调用
Java中形成多态的前提
- 继承
- 重写
- 向上转型
代码示例
动物类
public class Animal { public void eat(){ System.out.println("吃饭!!!"); } }
狗类
public class Dog extends Animal{ //重写父类方法 public void eat(){ System.out.println("吃骨头!!!"); } }
猫类
public class Cat extends Animal{ //重写父类方法 public void eat(){ System.out.println("吃鱼!!!"); } }
多态测试类
public class MixinsTest { //多态(多种声明对象形式) public static void main(String[] args) { Animal dog=new Dog(); Animal cat=new Cat(); dog.eat(); cat.eat(); } }
输出结果
编辑
多态的作用
- 提高代码的可重用性
- 降低模块之间的耦合度