封装
封装(Encapsulation)就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
封装的优点
- 减少代码耦合
- 便于修改,体高代码的可维护性
- 隐藏方法细节
Java封装的步骤
-
使用private修饰符,表示最小的访问权限。
-
对成员变量的访问,统一提供setXXX,getXXX方法
例:
public class Person{ private String name; //将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了 private int age; public int getAge(){ //对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问 return age; } public String getName(){ return name; } public void setAge(int age){ //采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突 this.age = age; } public void setName(String name){ this.name = name; } }
继承
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的
继承优点
主要实现重用代码,节省开发时间。使代码更简洁,提高可维护性。
继承类型
需要注意的是 Java 不支持多继承,但支持多重继承。
继承的特性
-
子类拥有父类非 private 的属性、方法。
-
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法
- Java 的继承是单继承,但是可以多重继承
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
继承关键字
extends ,java中所有的类都是继承于 java.lang.Object,当一个类没有继承的关键字时,默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类
super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
final 关键字
final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
使用 final 关键字声明类,不能被继承,或者用于修饰方法,该方法不能被子类重写:
构造器
子类只是调用(隐式或显式)父类的构造器(构造方法或者构造函数)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
例:
class SuperClass { private int n; SuperClass(){ System.out.println("SuperClass()"); } SuperClass(int n) { System.out.println("SuperClass(int n)"); this.n = n; } } // SubClass 类继承 class SubClass extends SuperClass{ private int n; SubClass(){ // 自动调用父类的无参数构造器 System.out.println("SubClass"); } public SubClass(int n){ super(300); // 调用父类中带有参数的构造器 System.out.println("SubClass(int n):"+n); this.n = n; } } // SubClass2 类继承 class SubClass2 extends SuperClass{ private int n; SubClass2(){ super(300); // 调用父类中带有参数的构造器 System.out.println("SubClass2"); } public SubClass2(int n){ // 自动调用父类的无参数构造器 System.out.println("SubClass2(int n):"+n); this.n = n; } } public class TestSuperSub{ public static void main (String args[]){ System.out.println("------SubClass 类继承------"); SubClass sc1 = new SubClass(); SubClass sc2 = new SubClass(100); System.out.println("------SubClass2 类继承------"); SubClass2 sc3 = new SubClass2(); SubClass2 sc4 = new SubClass2(200); } }
接口
接口是比抽象类更为抽象的类 ,只有方法(全部是抽象方法)的声明没有方法的实现(由接口的实现类来实现)。
接口优点
- 1.类与接口是实现关系,一个类可以实现多个接口。
- 2.对外提供规则(类似USB接口)
- 3.降低了程序的耦合性(可以实现模块化开发,定义好规则,每个人实现自己的模块,提高了开发的效率)
定义接口(interface关键字)
public interface 接口名 { 抽象方法1; 抽象方法2; 抽象方法3; }
接口的实现(implements)
类似于继承
class 类 implements 接口 { 重写接口中方法 }
接口中成员的特点
- 可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变
- 可以定义方法,方法也有固定的修饰符,public abstract
- 不可以创建对象(不能实例化)
- 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类
- 一个类实现一个接口必须实现它所有的方法
接口与类
- 类与类之间: 继承关系,一个类只能直接继承一个父类,但是支持多重继承
- 类与接口之间: 只有实现关系,一个类可以实现多个接口
- 接口与接口之间: 只有继承关系,一个接口可以继承多个接口
接口和抽象类的异同
同:都不能实例化,都含有抽象方法
异:接口只能有抽象方法,默认修饰符 public abstract
接口没有构造方法
抽象类可以有成员变量,也可以有常量,默认修饰符public static final
多态
多态是继封装、继承之后,面向对象的第三大特性。
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。多态就是同一个接口,使用不同的实例而执行不同操作
Java 作为面向对象的语言,同样可以描述一个事物的多种形态。如 Student 类继承了 Person 类,一个 Student 的对象便既是 Student,又是 Person。
多态存在条件:
- 继承
- 重写
- 父类的引用变量(当变量指向一个对象时,这个变量就被称为引用变量)指向子类对象
public class Test { public static void main(String[] args) { show(new Cat()); // 以 Cat 对象调用 show 方法 show(new Dog()); // 以 Dog 对象调用 show 方法 Animal a = new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eat Cat c = (Cat)a; // 向下转型 c.work(); // 调用的是 Cat 的 work } public static void show(Animal a) { a.eat(); // 类型判断 if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } } } abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void work() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); } }
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/244719.html