目录
一、封装
1.概念
封装是将代码隐藏起来,仅仅暴露一个访问接口来使用,在操作上使用get/set方法。即将方法和属性写到同一个类中,并将属性私有化,生成get/set方法,外部访问属性需要通过get和set方法,内部可以直接访问属性,这样的一个类我们认为它完成了封装。
2.private实现属性封装
一个属性被private修饰,该属性只在类的内部可见,出了该类无法使用,不能直接通过对象访问(继承的类也不行)。
阿里编码规约:类中无特殊说明,所有的成员变量统一使用private(99%)封装,此时调用者无法直接调用。若要继续取得,设置操作private属性,直接调用类提供的getter/setter方法修改private修饰的内容。
public class Test {
public static void main(String[] args) {
card cd=new card();
System.out.println(cd.getPassword());
System.out.println(cd.getCardNumber());
}
}
import java.util.Scanner;
public class card {
private int cardNumber=123456;
private String password="123456789";
private double sal;//余额
public int getCardNumber() {
return cardNumber;
}
public String getPassword() {
return password;
}
public double getSal(String pass) {
if(pass.equals(password))
return sal;
else{
System.out.println("密码错误,请查证后再试");
}
return -1.0;
}
public void setPassword(String pass) {
if(pass==password){
System.out.println("密码正确,可以修改密码");
Scanner sc=new Scanner(System.in);
String newPassword=sc.next();
password=newPassword;
} else{
System.out.println("密码不正确,无法修改");
}
}
}
3.封装的作用
保护性+易用性
1)提高程序安全性,保护数据,防止代码数据在无意中被破坏
2)隐藏代码实现细节,只要接口不变,内容的修改不会影响到外部的调用者(方法封装)
3)统一接口,保护类中的成员,不让类以外的程序直接访问或修改,只能通过提供的公共接口访问(数据封装)
4)系统可维护性大大增加,外部不能直接访问对象的属性,只能通过该属性对应的公有方法访问
- 提高程序的安全性,保护数据:保护或防止代码(数据)在无意中被破坏。保护类中的成员,不让类以外的程序直接访问或修改,只能通过提供的公共接口访问(数据封装)
- 隐藏代码的实现细节
- 统一接口
- 系统可维护性大大增加
4.其他
1)private不能修饰外部类(内部类可以):因为类定义就是为了产生对象
2)static不能修饰外部类:因为statuc是无对象可用,类的作用是产生对象,矛盾
二、继承
1.概念
继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展自己的属性及方法。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为,一个子类只能继承一个父类,但是可以多重继承,一个父类可以拥有多个子类。如某类B“继承”某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。
2.protected—继承访问权限
一旦一个属性和方法被protected修饰,此时该属性和方法可以被子类使用【让子类可见】
1)作用域
在不同包的具有继承关系的子类中可见
eg:animal包下有animal类。zoo包下有dog类,dog是animal的子类,dog仍可访问animal,使用animal中的name,age,food等
2)四大访问权限比较
private<default<protected<public
default:包访问权限-同一包下同级目录可见【即同级目录的不同类可见】
protected:不同包有继承关系的类可见【同一包没有关系的类也可见(即包含default可以实现的内容但比default多了另外可以访问的空间),但并没有实际用处。】
3.继承语法
子类 extends 父类
public class Test {
public static void main(String[] args) {
Dog dog=new Dog();
dog.name="狗狗";
dog.eat("狗粮");
Cat cat=new Cat();
cat.name="猫猫";
cat.eat("猫粮");
}
}
public class Animal {
protected String name;
public void eat(String food){
System.out.println(name+"正在吃"+food);
}
}
public class Cat extends Animal{
}
public class Dog extends Animal{
}
1)Java中,使用extends继承一个父类,此时子类就具备了父类中所有public和protected域(属性和方法),但父类中的private属性和方法仍然不能直接访问。
2)Java中的继承是单继承局限,即一个子类只能使用extends继承一个父类,不允许多继承(不允许extends后面跟多个父类),但允许多层继承(例如鸭子是两栖动物的子类,两栖动物是动物的子类)
3)Java中所有的类都默认继承object类
4)eg:出错分析
name是子类person的对象(子类可见),可见,而animal.name是animal自己产生对象调用的,并且animal已经是在Animal包外创建了,所以不可见【继承是让子类可见,但这你用的是你自己,不可见】!
4.调用父类的有参构造
public class Animal {
protected String name;
protected int age;
public Animal(String name,int age){
this.name=name;
this.age=age;
}
public void eat(String food){
System.out.println(this.name+"正在吃"+food);
}
}
public class Dog extends Animal{
public Dog(String name,int age){
//调用父类的有参构造,若父类中没有无参构造,必须在子类中通过super显示调用父类的有参构造