目录
一、包
二、继承
继承
protected 关键字
四种访问权限
final关键字
三、多态
向上转型
动态绑定
方法重写
重载和重写的区别
super 关键字
super与this的区别
四、抽象类
抽象类
接口
接口与抽象类区别
一、包
包 (package) 是组织类的一种方式. 使用包的主要目的是保证类的唯一性
将类将放到包中
基本规则
在文件的最上方加上一个 package 语句指定该代码在哪个包中.
如果一个类没有 package 语句, 则该类被放到一个默认包中
包的访问权限控制
如果某个成员不包含 public 和 private 关键字, 此时这个成员可以在包内部的其他类使用, 但是不能在包外部的类使用.
二、继承
继承
对共性的抽取,使用extends关键字进行处理,可以对代码重复使用
语法规则
继承对象叫做子类、派生类
被继承对象叫做父类、基类、超类
基本语法
class 子类 extends 父类 {
}
1,Java当中的继承是单继承,不能同时继承两个以上的类,包括两个
2,子类构造的同时,要先帮父类进行构造,子类帮助构造,使用构造方法
3,对于父类的 private 的字段和方法, 子类中是无法访问的
4,子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用
5,如果一个类不想被继承,可以使用final修饰
class Animal {
public String name = "hello";
public int age;
protected int count;
public Animal(String name,int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name+"eat()");
System.out.println(count);
}
}
class Dog extends Animal{
public Dog(String name,int age) {
super(name,age);
}
}
class Bird extends Animal{
public String wing;
public String name;//null
public Bird(String name,int age,String wing) {
super(name,age);
this.wing = wing;
}
public void fly() {
System.out.println(super.name+"fly()"+age);
}
}
public class Text1 {
public static void main(String[] args) {
Dog dog = new Dog("haha",19);
System.out.println(dog.name);
System.out.println(dog.age);
dog.eat();
}
}
?super关键字
不能出现在静态的方法中,父类对象的引用
1,super()调用父类的构造方法
2,super.func()
3,super.data
protected 关键字
刚才我们发现, 如果把字段设为 private, 子类不能访问. 但是设成 public, 又违背了我们 "封装" 的初衷. 两全其美的办法就是 protected关键字
1,对于类的调用者来说, protected 修饰的字段和方法是不能访问的
2,对于类的子类和同一个包的其他类 来说, protected 修饰的字段和方法是可以访问的
四种访问权限
NO | 范围 | private | default | protected | public | 1 | 同一包中的同一类 | √ | √ | √ | √ | 2 | 同一包中的不同类 | | √ | √ | √ | 3 | 不同包中的子类 | | | √ | √ | 4 | 不同包中的非子类 | | | | √ |
final关键字
1,修饰一个变量或者字段的时候, 表示 常量 (不能修改).
2,final 关键字也能修饰类, 此时表示被修饰的类就不能被继承
三、多态
向上转型
1,直接赋值
2,函数的参数
3,方法返回
class Animal {
public String name = "hello";
public int age;
protected int count;
public Animal(String name,int age) {
eat();
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name+" ani::eat()");
}
}
class Dog extends Animal {
public Dog(String name,int age) {
super(name,age);
}
}
public class Text1 {
public static void main(String[] args) {
Animal animal = new Dog("花花",19);//父类引用子类对象
}
}
动态绑定
1,父类引用子类对象
2,通过这个父类引用调用父类和子类同名的覆盖方法
class Animal {
public String name;
public int age;
protected int count;
public Animal(String name,int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name+" ani::eat()");
}
}
class Dog extends Animal {
public Dog(String name,int age) {
super(name,age);
}
@Override
public void eat() {
System.out.println(name+" 狼吞虎咽的eat()");
}
}
public static void main(String[] args) {
//通过父类引用只能访问父自己的成员
Animal animal1 = new Dog("花花",3);
animal1.eat();
Animal animal2 = new Bird("蛋蛋",4,"飞翔");
animal2.eat();
System.out.println(animal2.name);
}
方法重写
1,方法名相同
2,参数列表相同(个数+参数类型)
3,返回值相同
4,方法不可以是static
5,子类的访问修饰限定,要大于等于父类
6,private方法不能够重写,被final修饰的方法不能被重写
class Animal {
public String name = "hello";
public int age;
protected int count;
public Animal(String name,int age) {
eat();
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name+" ani::eat()");
}
}
class Dog extends Animal{
public Dog(String name,int age) {
super(name,age);
}
@Override
public void eat() {
super.eat();
}
}
class Bird extends Animal{
public Bird(String name, int age) {
super(name, age);
}
@Override
public void eat() {
super.eat();
}
}
重载和重写的区别
NO | 区别 | 重载 | 重写 | 1 | 概念 | 方法名相同,参数的个数和类型相同 | 方法名名称,返回值类型,参数的类型及个数完全相同 | 2 | 范围 | 一个类 | 继承关系 | 3 | 限制 | 没有权限要求 | 被覆写的方法不能拥有比父类更严格的访问权限 |
super 关键字
不能出现在静态的方法中,父类对象的引用
1,super()调用父类的构造方法
2,super.func()
3,super.data
class Animal {
public String name = "hello";
public int age;
protected int count;
public Animal(String name,int age) {
eat();
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name+" ani::eat()");
}
}
class Dog extends Animal{
public Dog(String name,int age) {
super(name,age);
super.eat();
}
@Override
public void eat() {
super.eat();
}
}
super与this的区别
NO | 区别 | this | super | 1 | 概念 | 访问本类中的属性和方法 | 由子类访问父类中的属性、方法 | 2 | 查找范围 | 先查找本类,如果本类没有就调用父类 | 不查找本类而直接调用 | 3 | 特殊 | 表示当前对象 | 无 |
四、抽象类
抽象类
1,包含抽象方法的类,叫做抽象类
2,抽象方法,一个没有具体的实现的方法,被abstract修饰
3,抽象类不能被实例化,所以只能被继承
4,抽象类中可以包含和普通类一样的成员和方法
5,一个普通类,继承一个抽象类,这个普通类需要重写这个抽象类的所有抽象方法
6,抽象类最大作用就是为了被继承
7,一个抽象类A继承抽象类B,A可以不实现抽象父类B的抽象方法
8,抽象类不能被final修饰,抽象方法也不能被final修饰
9,针对7,普通类继承A,那么必须重写A和B的抽象方法
abstract class Shape {
public void func() {
System.out.println("测试普通方法!");
}
public abstract void draw();//抽象方法
}
abstract class A extends Shape{
}
class V extends Shape{
@Override
public void func() {
super.func();
}
@Override
public void draw() {
}
}
abstract class Shape {
public void func() {
System.out.println("测试普通方法!");
}
public abstract void draw();//抽象方法
}
abstract class A extends Shape{
public void count(){
System.out.println("sdspjd");
}
}
class V extends Shape{
@Override
public void func() {
super.func();
}
@Override
public void draw() {
}
}
class B extends A{
@Override
public void func() {
super.func();
}
@Override
public void draw() {
}
}
接口
1,使用interface来修饰
2,接口当中的普通方法,不能有具体的实现。非要实现通过关键字default来修饰
3,接口中可以有静态方法,里面所有的方法都是public
4,抽象方法,默认是public abstract的
5,接口不可以通过关键字new来实例化
6,类和接口之间的关系通过implenebts实现
7,当一个类实现了一个接口,必须要重写接口中的抽象方法
8,接口成员变量默认是public static final修饰的
9,当一个类实现一个接口,重写这个方法的时候,必须加上public
10,一个类可以通过关键字extends继承一个抽象类或者普通类,但是只能继承一个类。同时,也可以通过implements实现多个接口,接口之间用逗号隔开
interface IShape {
void draw();//抽象方法
}
class Rect implements IShape {
@Override
public void draw() {
System.out.println("?");
}
/*@Override
public void func() {
System.out.println("重写接口当中的默认方法");
}*/
}
class Flower implements IShape {
@Override
public void draw() {
System.out.println("?");
}
}
class Triangle implements IShape {
@Override
public void draw() {
System.out.println("△");
}
}
class Cycle implements IShape {
@Override
public void draw() {
System.out.println("●");
}
}
interface IA {
int A = 10;
void funcA();//public abstract
}
interface IB {
void funcB();
}
abstract class BClass {
}
class AClass extends BClass implements IA,IB {
public void funcA() {
System.out.println("A::funcA()");
System.out.println(A);
}
@Override
public void funcB() {
System.out.println("A::funcB()");
}
}
接口与抽象类区别
NO | 区别 | 抽象类 | 接口 | 1 | 结构组成 | 普通类+抽象方法 | 抽象方法+全局变量 | 2 | 权限 | 各种权限 | public | 3 | 子类的使用 | extends | implements | 4 | 关系 | 一个抽象类可以实现若干个接口 | 接口不能继承抽象类,但是接口可以使用extends关键字继承多个父类接口 | 5 | 子类限制 | 一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |
|