封 装
防止用户在main()方法中设置错误变量数值,因此采用private关键字封装。私有化后主函数将无法直接调用被private定义的属性,方法,构造器和内部类。
体现:私有化(private)后,因无法直接调用,所以将提供公共(public)的getxxx()和setxxx()来获取和设置此属性。
作用:保护代码安全性和有效性。
例如:
public class Order { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 四种访问权限修饰符 修饰符 类内部 同一个包 不同包子类 同一工程 private yes 缺省(default) yes yes pritected yes yes yes
public yes yes yes yes
继 承
与多态,封装共为面向对象的三大特征。继承使子类具有父类非私有化的属性或方法,还可以追加继承类特有的属性或方法,或者是重写来重新定义被继承类的方法或属性。
class A extends B{}
A:子类,派生类
B:父类,超类,基类
体现:子类A继承父类B后,A就获得B中声明的结构:属性和方法。
①父类中声明private的属性或方法,继承后,虽然因为封装类的特点,子类不能直接调用父类结构,但仍认为获取了父类中私有的结构。
②子类与父类的关系不同于数学中的子集和集合的关系(子类的功能更加强大)
继承性特点:
①不允许一个子类多重继承多个父类,但允许一个父类被多个子类继承。
②只支持单继承,多继承,不允许多重继承
public class Animals { String name; private int age; void eat(){ System.out.println("宠物吃饭"); } }
public class Cat extends Animals { void play(){ System.out.println("猫玩游戏"); } }
public class text { public static void main(String[] args) { Cat c=new Cat(); c.eat(); } } 结果:宠物吃饭
即Cat类继承了Animals类,堆空间中获取了Animals的所有属性和方法,即使被private修饰的无法直接调用,也存在于堆空间中.
this 和 super 的区别:
this
this调用方法调用的是当前对象,可以调用属性,方法,构造器,一般类中属性前都有this关键字,只不过省略了。
public void setAge(int age){
this.age=age;
}
为了增加代码的可读性,形参中存储的变量名一般采用直观的方法描述,但也因此导致形参与属性名字重合,这时就需要this关键字进行区别,this.age是类中的属性,age是所给的形参。
同样的,调用构造器也可以用this,即:
this(形参列表);
this调用构造器时需要注意:
①不能自己调自己。
②调多少次都只有一个对象。
③不能形成调用闭环(即n个构造器最多只能由n-1个"this(形参列表)"):
④"this(形参列表)"必须放构造器首行!(因此一个构造器只能有一次调用"this(形参列表)")
super
super调用方法调用的是父类对象,可以调用属性,方法,构造器
当子类和父类定义同名属性,想要在子类中调父类声明属性,需使用"super.属性",表明父类中声明的属性。
public class Animals { String name; int age=10; void eat(){ System.out.println("宠物吃饭"); } }
public class Cat extends Animals { int age=20; void play(){ System.out.println(super.age); } }
public class text { public static void main(String[] args) { Cat c=new Cat(); c.play(); } } 结果:10
super也可用来调用构造器,即:
super(形参列表);
super调用构造器时需要注意:
①子类构造器,方法中,用"super.属性/方法"调用父类声明属性和方法,但通常省略。
②"super(形参列表)"必须放子类构造器首行!
③类构造器中"super(形参列表)"和"this(形参列表)"只能二选一,不能同时出现
④构造器首行没有"super(形参列表)"或"this(形参列表)",则默认调用父类空参构造器。
⑤类多个构造器中,至少有一个构造器用"super(形参列表)"调用父类构造器
重写 与 重载 的区别:
重载:在同一个类中,方法名相同,参数列表不同,同一个类中各个构造器互相构成重载。
重写:子类继承父类方法,以相同的方法名和参数列表重新定义方法。
①子类中叫重写的方法,父类中叫被重写的方法。
②以继承关系为前提,没有继承就没有重写。
③子类权限修饰符要大于等于父类。
父:public void eat(){}
子:class eat(){} //不可行
④父类被重写方法返回值是A类型,则子类重写应为A类或A子类,父类返回值是基本数据类型,则子类也为相同的基本数据类型。
父:public Object eat(){return null;}
子:public String eat(){return null;} //可行
⑤子类抛出异常类型应不大于父类。
⑥子类父类同名同参方法,要么都非static(考虑重写),要么都static(不是重写)
包装类
基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
基本数据类型 , 包装类 和 String类 之间的相互转换
装箱:基本数据类型转换成包装类
拆箱:包装类转换成基本数据类型
基本数据类型转包装类:
原理:调用包装类构造器(基本数据类型无法调用方法)
Interger in=new Integer(10);//Integer是类,可以调用方法
注意:
①boolean为空时,因其为基本数据类型,所以是false;Boolean为空时,因其为类,所以为null
②Boolean转换时,若boolean不为"true",则都为false("True"也是false)
包装类转基本数据类型:
因类无法进行运算,需转基本数据类型
方法:调包装类Xxx的xxxValue()方法,即:
int i=in.intVolue();
自动装箱和自动拆箱
JDK5.0新特性
自动装箱:基本数据类型直接转换成包装类,即
Integer in=10;//可行
自动拆箱:包装类直接变成基本数据类型,即
Integer in=new Integer(10);int i=in;//可行
PS:Integer内部定义了IntegerCache结构,其中有Integer[]保存-128---127的所有整数,若自动装箱,给Integer赋值在-128---127范围内,则直接使用数组中元素(地址值相同),不必去new,提高效率
基本数据类型,包装类与String之间的转换
一.基本数据类型转String
方法一:连接运算:String s=10+"";
方法二:调用String中的balueOf(xxx),即:
String s=String.valueOf(10);
二.String转基本数据类型
调包装类的parsexxx(String s)方法,即:
int i=Integer.parseInt(str);
三.包装类转String
调用包装类对象的toString(形参)方法,即
String s=in.toString();