封装
通常,应禁止访问一个对象中数据的直接表示,而应通过操作接口来完成,这叫做信息隐藏。
这样做的好处有 提高了程序的安全性,保护了数据;隐藏代码的实现细节;统一接口;增强了系统的可维护性
属性私有
对于类的属性,在类属性前加private关键字,定义该属性为私有属性
对象的私有属性不能被直接调用
public class Studen{
private int age;
private String name;
}
get/set
此时我们需要在类中提供一些对这些属性进行操作的public方法
如get set 方法(Alt+insert快速创建)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
亦可加入范围判断
public void setAge(int age) {
if(age>0&&age<100){
this.age = age;
}else{
this.age = 0;
}
}
继承
继承的本质是对某一批类的抽象
在Java中所有的类都默认继承object类
extends关键字
crtl+H
Java中只有单继承没有多继承
public >protected >default >private 私有的东西无法被继承
super与this
利用super与this关键字调用成员与方法
super关键字只能出现在子类的方法或构造方法中
super()与this() 子父类之间构造器的调用
public class Person {
public Person() {
System.out.println("调用了父类无参构造器");
}
public class student extends Person{
public student() {
System.out.println("调用了子类无参构造器");
}
创建student对象时,输出如下
说明在子类构造器中有隐藏代码super()实现了对父类无参构造器的默认调用
将隐藏代码显示表达出来即
public class student extends Person{
public student() {
super();//调用父类无参构造器
System.out.println("调用了子类无参构造器");
}
注意使用this()与super()调用构造器必须在代码第一行
如果父类仅有有参构造,那么子类的构造器将会报错,因为父类仅写有参构造,隐藏的无参构造不存在,那么子类构造器对父类无参构造super()的默认调用出错
解决办法有
- 在父类中对无参构造器显示表示;
- 在子类构造器中调用父类的有参构造
public class student extends Person{ public student() { super("传参"); System.out.println("调用了子类无参构造器"); }
方法的重写
override重写
重写只与非静态方法有关,只能public
父类
public class Person{
public void run(){
System.out.println("run");
}
子类
public class Student extends Person{
@Override
public void run(){
System.out.println("no run");
}
}
重写的原因
父类的功能,子类不需要,或不能满足子类的需要
多态
一个对象的实际类型是确定的,可以指向的引用类型为父类(因此所有对象的引用类型都可以为object)
对象能执行哪些方法,看前面的引用类型
student s1 = new student();
Person s2 = new student();
上图Person为student的父类。s1可以执行的方法是自己的方法或继承父类的方法;s2可以执行的方法是父类Person的方法,以及子类重写的方法,不能调用子类独有的方法。
多态的特点
就s2所言
- 多态情况下,子类和父类存在同名的成员变量时,访问的时父类的成员变量
- 多态情况下,子父类存在同名的非静态成员方法时,访问的是子类中重写的方法
- 多态情况下,子父类存在同名的静态成员变量成员方法时,访问的是父类的成员方法
- 多态情况下,不能访问子类独由的方法