Java基础01
1.继承
继承是因为对象之间属性或者方法存在
交集
因此可以将两者通过extend
形式结合节省代码量?。子类实际上是将父类定义的更加的具体化的一种手段。父类表示的范围大,而子类表示的范围小
-
-
一个子类只能够继承一个父类,存在单继承局限 即是不能多重继承,但是可以多层继承
-
在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)
class A { private String msg; public void setMsg(String msg) { this.msg = msg; } public String getMsg() { return this.msg; } } class B extends A { public void print() { //System.out.println(msg); // 错误: msg定义为private,不可见 } } public class TestDemo { public static void main(String args[]) { B b = new B(); b.setMsg("张三"); System.out.println(b.getMsg()); } } //可以通过间接方法访问父类private属性
- 在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化,即:默认情况下,子类会找到父类之中的无参构造方法。现在默认调用的是无参构造,而如果这个时候父类没有无参构造,则子类必须通过super()调用指定参数的构造方法,且在调用时super(参数)在子类构造方法所有语句之前。
class A { public A() { // 父类无参构造 System.out.println("*************************") ; } } class B extends A { public B() { // 子类构造 super();//隐藏的super() System.out.println("#########################"); } } public class TestDemo { public static void main(String args[]) { B b = new B() ; // 实例化子类对象 } } //输出 //************************* //#########################
2.封装
通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口
-
-
权限修饰符
-
// 定义变量 [修饰符] 变量类型 变量名称; [修饰符] 变量类型 变量名称 = 初始值;
- 权限对应的关系表
修饰符 本类 本包的类 不同包的子类 其他包 private √ × × × 默认(default) √ √ × × protected √ √ √ × public √ √ √ √ -
- 未封装前
public class Person{ public String name; public double money; } public class Test{ public static void main(String[] args){ Person person = new Person(); person.money = 500;// 初始金额500元 System.out.println("购买一张桌子,花费200元"); person.money -= 200; System.out.println("购买二手PSP,花费350元"); person.money -= 350; System.out.println("目前余额为:" + person.money);// -50 } }
- 封装不完全
public class Person{ public String name; public double money; // 定义一个方法,用于设置money属性的值 public void setMoney(double money){ if(money >= 0){ this.money = money; } } } public class Test{ public static void main(String[] args){ Person person = new Person(); person.money = 500;// 初始金额500元 System.out.println("购买一张桌子,花费200元"); person.setMoney(person.money - 200); System.out.println("购买二手PSP,花费350元"); person.setMoney(person.money - 350); System.out.println("目前余额为:" + person.money);// 300 } } //这里依然可以通过直接new父类访问属性不安全所以应该将属性的权限修饰符修改为private
- 封装后
public class Person{ public String name; // 声明money属性为private权限 private double money; // 定义一个方法,用于设置money属性的值 public void setMoney(double money){ if(money >= 0){ this.money = money; } } // 定义一个方法,用于获取money属性的值 public double getMoney(){ return this.money; } } public class Test{ public static void main(String[] args){ Person person = new Person(); person.setMoney(500);// 初始金额500元,此时已经不能使用对象.属性的方法赋值 System.out.println("购买一张桌子,花费200元"); person.setMoney(person.getMoney() - 200); System.out.println("购买二手PSP,花费350元"); person.setMoney(person.getMoney() - 300); System.out.println("目前余额为:" + person.getMoney());// 300 } }
-