目录
一、封装
封装: 使用private将属性进行封装(这个属性只在当前类的内部可见,对外部隐藏)
保护性、易用性(通过程序对外提供的方法来操作属性),例如汽车启动,电脑启动等隐藏在内部的过程。
二、继承
1、继承的作用
例子
定义了三个类,Animal类、Cat类、Dog类
public class Animal {
public String name;
public void eat(String food){
System.out.println(this.name + "正在吃" + food);
}
}
public class Cat {
public String name;
public void eat(String food){
System.out.println(this.name + "正在吃" + food);
}
}
public class Dog {
public String name;
public void eat(String food){
System.out.println(this.name + "正在吃" + food);
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
animal.name = "动物";
animal.eat("食物");
Dog dog = new Dog();
dog.name = "旺财";
dog.eat("狗粮");
Cat cat = new Cat();
cat.name = "小白";
cat.eat("猫薄荷");
}
}
不难发现他们都有重复的代码段,按道理说所有Animal的类都应该具备name属性以及eat方法。
所以需要继承来简化代码
当类和类之间满足一个类is a另外一个类,—定是存在继承关系,就像
Dog is an Animal,狗是动物
Cat is an Animal,猫是动物
天然的继承,还有Bird is an Animal
Duck is an Animal
2.继承的表示方法
子类extends父类
例如上面代码可以简化成一行
public class Cat extends Animal {
}
public class Dog extends Animal {
}
当一个类继承了另一个类,另一个类中所有的属性和方法子类就天然具备了。
注意点,Java不允许多重继承
子类无法继承两个父类,下列代码会报错
public class Cat extends Dog, Animal {
}
但是允许多重继承
多重继承
bird是Animal的子类,sparrow既是bird也是Animal的子类,extends后面只能跟一个父类。
3.隐式继承private
实际上被继承了,但是无法被子类直接使用
public class Animal {
public String name;
private int age;//子类无法通过 . 来直接访问这个属性
public void eat(String food){
System.out.println(this.name + "正在吃" + food);
}
}
可以通过父类提供的方法
public class Animal {
public String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Cat extends Animal {
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "小白";
cat.setAge(3);//此时可直接使用age
cat.eat("猫薄荷");
}
}
可见age被cat从Animal继承来了,因为cat类没有定义过任何属性方法,全是extends继承来的。
注意点
静态的属性和方法是归于某个类所有
当一个类继承了另一个类,所有静态属性和方法就继承。
到底能否直接使用,还是要看权限是不是public,如果是private就要通过父类提供的方法使用
总结
a.要能使用继承,前提必须满足类之间的is a关系b.—个子类只能使用extends继承一个父类。(单继承)
Java中不允许多重继承,extends后面只能跟一个父类,允许多层继承,没法当儿子,可以当孙子。
c.子类会继承父类的所有属性和方法,有两种继承方式显示继承(public属性和方法可以直接使用)
隐式继承(private属性和方法),子类其实也继承了这个属性和方法,但是无法直接使用。
4.继承的权限
private < default < protected < public
protected访问权限,只在当前类和同包中的不同类中以及不同包中的子类中是可见的
public class Animal {
//当前类和子类是可见的
protected String name;
private int age;
}
不同包中的有继承关系的类可见
package Person;
import Animal.Animal;
public class person extends Animal {
public void fun(){
//name属性为protected,不同包中的有继承关系的子类是可见的
System.out.println(name);
}
}
注意点
package Person;
public class Test {
public static void main(String[] args) {
Person person = new person();
per.name;
}
}
test和Animal没有继承关系,且是person包中,因此name是不可见的
总结
default同包可见 + 其他包中继承关系可见 = protected
三、super关键字
类比于this关键字
this关键字∶表示当前对象的引用
修饰属性,表示直接从当前类中找同名属性super关键字
修饰属性,表示直接从父类中去寻找同名属性
修饰方法,表示直接从父类中去寻找方法
理解
在认识super前要先知道一个知识
public class Animal {
//当前类和子类是可见的,对于其他包没有继承关系的类是不可见的
public Animal(){
System.out.println("产生父类对象,调用父类构造方法");
}
}
public class person extends Animal {
public person(){
System.out.println("产生子类对象,调用子类对象方法");
}
}
public class Test {
public static void main(String[] args) {
person person = new person();
}
}
运行结果
当调用new Person无参构造产生子类对象之前,先默认调用父类的构造方法产生父类对象然后才会执行子类的构造方法,产生子类对象。
相关面试题
public class B {
public B(){
System.out.println("1.B的构造方法");
}
{
System.out.println("2.B的构造块");
}
static{
System.out.println("3.B的静态方法块");
}
}
public class C extends B{
public C(){
System.out.println("4.C的构造方法