看了慕课网站上的java学习第二季,总结如下
类是抽象的概念,仅仅是模板,对象是一个看得见摸得着的实体
定义一个类:
定义类名
编写类的属性
编写类的方法
定义类的时候首字母要大写
成员变量的作用域是整个类内部可见,可以不赋初始值;局部变量针对于定义它的方法,必须赋初始值,不可以有多个同样名字的局部变量;两类变量重名的时候,局部变量优先级更高。
如果需要在静态方法中调用非静态变量需要通过创建类的对象,然后通过对象访问非静态变量
在普通成员方法中,可以直接访问同类的非静态变量和静态变量
静态方法在调用非静态方法时也需要通过对象来调用,调用静态方法可以直接调用
静态初始化块只在类加载时执行,且只执行一次,静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。静态初始化块需要static{}
封装
隐藏属性,通过方法来得到属性。
修改属性的可见性,e.g. private修饰符,创建getter/setter方法,在方法中加入属性控制语句,方法名是get+方法名
包的名字是全小写
对于访问修饰符:
Private只能本类访问
默认可以本类和同包访问
Protected可以本类、同包、子类访问
Public可以全部访问,本类、同包、子类、其他等
This区分属性和参数定义了一样的名字的情况下
内部类就是定义在另外一个类里面的类,与之对应的,包含内部类的类被称为外部类
内部类的作用:
1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
内部类可以分为成员、静态、方法和匿名
例如:
//外部类HelloWorld
public class HelloWorld {
// 内部类Inner,类Inner在类HelloWorld的内部
public class Inner {
// 内部类的方法
publicvoid show() {
System.out.println("welcometo imooc!");
}
}
publicstatic void main(String[] args) {
// 创建外部类对象
HelloWorldhello = new HelloWorld();
// 创建内部类对象
Inner i = hello.newInner();
// 调用内部类对象的方法
i.show();
}
}
成员内部类
必须使用外部类对象来创建内部类对象,而不能直接去new一个内部类对象,即:内部类对象名 = 外部类对象.new 内部类()
成员内部类的.class文件是:外部类名$内部类名.class
有外部类和成员内部类,如果两个里面有相同的成员变量或者方法,内部类默认访问自己的成员变量或者方法,如果要访问外部类的成员变量的话,使用this,比如外部类名.this.变量名
静态内部类
不能直接访问外部类的非静态成员,但可以通过new 外部类().成员
如果外部类的静态成员与内部类的成员名称相同,可以通过“外部类名.静态成员”访问外部类的静态成员,如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
创建静态内部类的对象时,不需要外部类的对象,可以直接创建:内部类对象名=new 内部类()
方法内部类
内部类定义在外部类的方法里面,只可以在该方法内使用,不能在外部类的方法以外的地方使用,所以方法内部类不能使用访问控制符和static修饰符
在方法里面创建方法内部类的对象然后调用内部类
继承
Class 子类名 extends 父类名
如果子类对继承父类的方法不满意,可以重写父类继承的方法
继承的初始化顺序,优先父类对象,之后才是子类对象
父类对象-属性初始化-构造方法-------子类对象-属性初始化-构造方法
final关键字
final关键字可以修饰类、方法、属性和变量
final修饰类,则该类不允许被继承
final修饰方法,则该方法不允许被覆盖(重写)
final修饰属性,则该类的属性不会进行隐式的初始化,类的初始化属性必须要有值,或在构造方法中赋值(但是只能选择其一)
final修饰变量,则该变量的值只能赋一次值,不允许再次修改,相当于一个常量
super关键字
在对象的内部使用,可以代表父类对象
Super.属性值获得父类属性值,直接在子类中属性值则直接输出子类属性值
子类的构造过程中必须调用其父类的构造方法
如果显示的调用父类的构造方法,super()需要放在构造方法的第一行
如果子类的构造方法没有显示的调用父类的构造方法,系统默认调用父类无参的构造方法
如果子类构造方法中既没有显示调用父类的构造方法,而父类又没有无参的构造方法,则编译出错
Object类是所有类的父类
1、 toString()方法 system.out.println(子类名)输出子类的地址
2、 equals()方法比较的是对象的引用是否是指向同一块地址,与==的作用类似,如果是比较数值的话是可以的,但是如果是引用的话,比较的是地址
多态
1、 引用多态,父类的引用可以指向本类的对象,父类的引用可以指向子类的多态
2、 方法多态,创建本类对象时,调用的方法是本类的方法;创建子类对象的时候,调用的方法为子类重写的方法或继承的父类的方法。
多态中的引用类型转换
1、 向上类型转换(隐式/自动类型转换)
2、 向下类型转换(强制类型转换)
3、 instanceof运算符,来解决类型转换的安全问题。If(animal instanceof Dog){}else{}
抽象类
Abstract定义抽象类
abstract定义抽象方法,只有声明,不需要实现
包含抽象方法的类是抽象类
抽象类中可以包含普通的方法,也可以没有抽象方法
抽象类不能直接创建,可以定义引用变量
abstract classAnimal { abstract void grow(); }
关注事物本质,用抽象类;关注一个操作,用接口
定义接口用interface关键字,一般修饰符是public,可以继承多个父类
修饰符 interface 接口名[extends 父接口1,父接口2]
接口中的方法都是抽象方法,系统会自动用public abstract自动修饰
继承父类实现接口的语法:
修饰符 class 类名 extends 父类 implements 接口1,接口2
{
类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中抽象方法}
如果要继承父类,继承的父类必须在实现接口之前
使用接口:接口在使用过程中,还经常与匿名内部类配合使用,匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称,仅仅在使用的时候定义这个接口
方法一:
IPlayGame ip3=new IPlayGame() {
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println("使用匿名内部类的方式实现接口");
}
};
ip3.playGame();
方法二:
new IPlayGame() {
public void playGame() {
// TODO Auto-generated method stub
System.out.println("使用匿名内部类的方式实现接口");
}
}.playGame();
接口中方法不能有方法体,同时方法的修饰符不能是private和protected