java的三大特性
java中的函数重载:函数名相同的,但参数类型不一样,参数个数不一样,参数类型顺序不一样
可变个数形参:...
1.封装
封装就是将代码通过函数将一些代码细节包装起来,防止外部代码的随机访问,要访问这些数据就必须通过调用函数来完成
好处:
提高了代码的阅读性
提高了代码的可维护性
package com.my.packge3; public class Student { //目前age这个全局变量是每个用户都可以访问的,如果不想让别人调用这个变量,只需要把public 改成 private,变成私有的 //然后就只能通过调用setAge这个函数来访问这个全局变量 private String age; public void setAge(int age) { this.age = age+""; //把int类型数据变为string } }
package com.my.packge3; /* 封装 */ public class Encapsulation { public static void main(String[] args) { //创建学生对象,并给三个学生赋予年龄 Student student1 = new Student(); student1.setAge(28); Student student2 = new Student(); student2.setAge(28); Student student3 = new Student(); student3.setAge(28); } }
2.继承
两个类之间通过extends关键字来描述父子关系,子类便可拥有父类的公共方法和公共属性
解决:
提高了代码的复用性
代码的维护性更高
1.父类定义共有的行为,子类可以继承父类的公共方法和属性来复用
2.子类可以通过定义父类没有的方法或者通过覆盖父类的方法来实现扩展
3.但子类不能继承父类的私有成员,java中只能单继承,但父类可以被多个子类继承
4.创建本类对象之前,会先初始化父类对象
this关键字和super关键字
this代表的是当前类对象的引用
super是代表父类对象的引用
package com.my.packge2; public class Iphone4s { public String brand = "iphone 4s"; //打电话功能 public void makeCall(){ System.out.println("打电话功能"); } //发短信功能 public void sendMessage(){ System.out.println("发短信功能"); } //密码解锁功能 public void passwordUnlock(){ System.out.println("密码解锁功能"); } public void test(){ System.out.println("父类的测试方法"); System.out.println("Iphone4s"); } public Iphone4s(){ System.out.println("Iphone4s.Iphone4s()"); } }
package com.my.packge2; public class Iphone5 extends Iphone4s{ public String brand = "iphone 5"; public static void main(String[] args) { Iphone5 iphone5 = new Iphone5(); iphone5.sendMessage(); System.out.println(iphone5.brand); iphone5.test(); } //方法名一样和参数列表和父类一样,才会调用子类的方法 // public void test(){ // System.out.println("iphone5子类的测试方法"); // } //Override覆盖父类的方法,重写父类已有的方法 // @Override // public void test() { // System.out.println("iphone5子类的测试方法"); // } //super在这代表的是iphone4s的对象,super()是代表调用是父类默认的构造函数 //如果是带参构造函数,创建对象时,会默认调用父类的带参构造函数 @Override public void test() { System.out.println("Iphone5"); super.test(); } //创建本类对象之前,会先初始化父类对象,就是父类的构造方法先执行,再执行子类的构造方法 public Iphone5(){ System.out.println("Iphone5.Iphone5()"); } }
package com.my.packge2; public class Iphone5s extends Iphone5{ public String brand = "iphone 5s"; public void fingunlock(){ System.out.println("指纹解锁"); } }
3.多态
用父类的类型来接收子类的对象
先决条件:
1.继承
2.父类类型接受子类对象
优点:
1.扩展性强,解决了代码复用性,降低了类型的耦合度
示例:
使用多态之前,
package com.my.packge2; public class Duotaidemo { //输出iphone4s手机品牌信息 public void show4sBrand(Iphone4s iphone4s){ iphone4s.brand(); } //输出iphone5手机品牌信息 public void show5Brand(Iphone5 iphone5){ iphone5.brand(); } //输出iphone5s手机品牌信息 public void show5sBrand(Iphone5s iphone5s){ iphone5s.brand(); } //输出iphone6手机品牌信息 public void show6Brand(Iphone6 iphone6){ iphone6.brand(); } public static void main(String[] args) { Duotaidemo duotaidemo = new Duotaidemo(); Iphone4s iphone4s = new Iphone4s(); duotaidemo.show4sBrand(iphone4s); Iphone5 iphone5 = new Iphone5(); duotaidemo.show5Brand(iphone5); Iphone5s iphone5s = new Iphone5s(); duotaidemo.show5sBrand(iphone5s); Iphone6 iphone6 = new Iphone6(); duotaidemo.show6Brand(iphone6); } }
使用多态之后
package com.my.packge2; public class Duotaidemov2 { //输出所有品牌的手机信息 public void showallMobileBrand(Mobile mobile){ mobile.brand(); //但是这里不能使用某一个子类所独有的方法 //需要用的话,要做判断,想要调用子类特有的方法时,要向下强制转换类型 if (mobile instanceof Iphone4s){ Iphone4s iphone4s = (Iphone4s) mobile; iphone4s.passwordUnlock(); } } public static void main(String[] args) { Duotaidemov2 duotaidemov2 = new Duotaidemov2(); Iphone4s iphone4s = new Iphone4s(); duotaidemov2.showallMobileBrand(iphone4s); Iphone5 iphone5 = new Iphone5(); duotaidemov2.showallMobileBrand(iphone5); Iphone5s iphone5s = new Iphone5s(); duotaidemov2.showallMobileBrand(iphone5s); Iphone6 iphone6 = new Iphone6(); duotaidemov2.showallMobileBrand(iphone6); } }