java学习-面向对象的三个特征
1. 封装
概念:隐藏对象内部的实现细节,控制对象中属性的访问和修改权限。
访问修饰符: private
(仅本类可见)
class FengZhuang {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int val) {
if(val > 0 && val < 120) {
this.age = val
} else {
this.age = 18
}
}
}
隐藏类内部实现过程
设置属性值时,可以有效的过滤无用值
2. 类的继承
-
子类可以使用父类中的属性和方法,子类也可以定义自己的属性和方法。
-
既可以提高代码的复用性,也可以提高代码的可扩展性。
-
java是单继承,一个类只能有一个父类,但是可以多级继承。属性和方法也会逐级叠加。
子级如何访问爷爷级的重用的属性和方法呢
不可继承:
-
构造方法:只负责创建本类,不可继承。
-
构造方法的特点:名称与类名相同,且不能写类型
class Test {
public Test() {...}
// public void Test() {...} 错误
}
-
-
访问修饰符:
private修饰的属性和方法仅本类可见;default仅同包父子类可见;
父子类中方法的重写和覆盖:
当父类中提供的方法无法满足子类的需求时,可在子类中定义与父类相同的方法进行重写。
-
重写原则:方法名称、参数列表、返回值类型必须与父类相同;访问修饰符可等于或比父类更宽泛。(否则可能会报错)
public class TestExtends {
public static void main(String[] args) {
B b = new B();
b.upload();
}
}
class A {
public void upload() {
System.out.println("print function in A");
}
}
class B extends A {
public void upload() {
System.out.println("print function in B");
}
}如果想在子类中访问父类的方法或属性(包括被重写的),可以使用
super.
的形式。
继承的对象构建过程:
super、构造函数和this:
-
super与this访问属性
class A {
int a = 1;
}
class B {
int a = 2;
public void print() {
int a = 3;
System.out.println(a); // 3
System.out.println(this.a); // 2 (this.访问本类的属性和方法)
System.out.println(super.a); // 1 (super.访问父类的属性和方法)
}
} -
super和构造函数
class AS {
public AS() {
System.out.println("AS");
}
public AS(int age) {
System.out.print("AS-");
System.out.print(age);
System.out.println();
}
}
class BS extends AS {
public BS() {
super();
System.out.println("BS");
}
public BS(int age) {
super(age + 1);
System.out.print("BS-");
System.out.print(age);
System.out.println();
}
}-
在构造函数中通过
super()
调用父类的构造方法(通过传参或不传参可以控制执行AS的哪一个构造方法) -
super或this如果使用在构造函数中,必须放在首行;
-
子类中如果使用了this()/this(实参)就不能在调用super。(在构造函数中调用this()会报
递归调用
的错,那什么情况下可以调用) -
在子类构造函数中如果没有调用
super
,则默认执行super();
-
3. 多态
概念:父类引用指向子类对象,从而产生多种形态。
Animal a = new Dog()
// 引用类型------对象类型
Animal和Dog要有直接或者间接的继承关系。
父类引用仅可以调用父类所声明的属性和方法,不可调用子类独有的属性和方法 。
多态的作用:
-
屏蔽子类间的差异。
-
灵活、耦合度低。
多态中方法的重写
-
实际运行过程中依旧遵循重写原则。既
amt.fn()
的执行结果BMT中方法的执行结果 -
子类中独有的方法不能在父类引用对象中调用。既
amt.fnB()
会报错。
class MultiType {
public MultiType() {
AMT amt = new BMT();
amt.fn(); // fn in BMT
// amt.fnB(); // 或报错
}
}
class AMT {
public void fn() {
System.out.println("fn in AMT");
}
}
class BMT extends AMT {
public void fn() {
System.out.println("fn in BMT");
}
public void fnB() {
System.out.println("fn in BMT only");
}
}
应用场景:
-
使用父类作为方法形参实现多态,使方法的参数类型更为宽泛。
-
使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。
-
向上转型(装箱)
-
向下转型(拆箱)
-
向下转型中的异常
-
instanceof