访问修饰符有private、protected、public。
私有变量和私有方法(private)
有一个A类,他的成员变量和方法都是私有
public class A {
private int a;
private int sum (int m,int n){
return m - n;
}
}
那么对于另一个B类,在其中创建一个A类的对象,该对象是不能访问自己的私有变量和方法的。
公有变量和公有方法(public)
有一个A类,他的成员变量和方法都是公有的。
public class A {
public int a;
public int sum (int m,int n){
return m + n;
}
}
那么在任何一个类B中创建其对象后他的变量和方法都可以被访问到
友好变量和友好方法(默认)
public class B{
int a;
int sum(int m,int n){
return m + n;
}
}
这种情况需要在同一个包中,就是类A和类B在同一个package下
受保护变量和受保护方法(protected)
同友好变量和友好方法的访问权限一样
public类和友好类
在声明类的时候,如果在关键字class前面加上public关键字,那么他就是共有类,可以在任意一个类中使用public类创建的对象,
友好类就需要在同一个package下。
继承
声明格式
修饰符 class 子类名字 extends 父类名{
}
修饰符可以是public abstract final
继承的使用原则
1.子类能够继承父类中被声明为public和protected的成员变量和方法,但不能继承父类中被声明为private的成员变量和方法。
2.子类能继承在同一个包中由默认修饰符的成员变量和成员方法。
3.如果子类声明了一个与父类的成员变量同名的成员变量,则子类不能继承父类的成员变量。
4.同3,如果方法名相同时候子类不能继承父类方法。
对于3和4的理解:
public class Bird extends Animal{}
一切以bird为准就是对3和4的理解。如果bird和animal同时写了这些就以bird为准
如果还想重名也用父类的成员变量和方法就需要super
super
super和this可以理解为一个指针,super这个指针指向离自己最近的父类
this指向自己类本身的一个指针
class Country {
String name;
void value() {
name = "China";
}
}
class City extends Country {
String name;
void value() {
name = "Shanghai";
super.value(); //调用父类的方法
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
City c=new City();
c.value();
}
}
运行结果:
Shanghai
China
子类的继承
1.同一个包中的子类与父类,子类可以继承父类中非private修饰的成员变量和方法。
2.不在同一个包内的子类和父类,子类可以继承被public和protected修饰的成员变量和方法。
多态:一个重载和重写
重载:两同一不同:同一类,相同的名字。参数列表不同
重写:放生在继承,子类覆盖父类,以父类为准
方法覆盖发生在继承里,子类根据需要重写继承的方法。
目的:用父类的方法名重写了一个新的方法
发生在运行阶段
需要覆盖的方法要和父类方法具有完全相同的方法名,返回值,参数列表(个数、类型、顺序)。
重写/覆盖需要注意:
子类不能覆盖父类中声明为final和static的方法。
子类必须覆盖父类中声明为abstract的方法,或者子类也将该方法声明为abstract。
覆盖双方的声明应该是一致的
抽象类和抽象方法 abstract
为什么需要有抽象这个概念,某些类一定需要模型方法才能启用,把这个方法抽象后,要想实例化要么重写这个方法,要么继续abstract它。这样就避免子类的随意设计。
抽象方法不能用private和static修饰,因为抽象方法需要被重写,只有可以访问且可以修改才可以完成这个流程。
一、什么是抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
二、为什么要用抽象类
老是在想为什么要引用抽象类,一般类不就够用了吗。一般类里定义的方法,子类也可以覆盖,没必要定义成抽象的啊。
其实不是说抽象类有什么用,一般类确实也能满足应用,但是现实中确实有些父类中的方法确实没有必要写,因为各个子类中的这个方法肯定会有不同,所以没有必要再父类里写。当然你也可以把抽象类都写成非抽象类,但是这样没有必要。
而写成抽象类,这样别人看到你的代码,或你看到别人的代码,你就会注意抽象方法,而知道这个方法是在子类中实现的,所以,有个提示作用。
内部类:
public class A{}中,{}还可以定义类,这种类叫做内部类,
内部类分为四种:成员内部类、局部内部类、静态内部类、匿名类(不能用public修饰)
成员内部类就是并架于成员变量的类
调用较为复杂些:
public class Sample{
public int id;
class Inner{
}
}
//调用格式
Sample sample = new Sample();
Sample.Inner inner = sample.new Inner();
局部内部类(方法中的类)
public void sell(){
class Apple{
}
}
静态内部类 static
就是共享类。
匿名类
//声明
new 类名字(){}
内部类很多还需要继续学习!后续一点点再补齐