1.内部类
内部类:所谓内部类就是在⼀个类的内部进行其他类结构的嵌套的操作
- 内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据
- 内部类可以对同一包中的其他类隐藏起来
- 内部类可以实现 java 单继承的缺陷
- 当我们想要定义一个回调函数却不想写大量代码的时候我们可以选择使用匿名内部类来实现
在使用内部类的时候创建内部类对象
外部类.内部类 内部类对象 = new 外部类().new 内部类(); Outter.Inner in = new
Outter().new Inner();
在外部类内部创建内部类对象
Inner in = new Inner();
在成员内部类中要注意两点:
- 成员内部类中不能存在任何static的变量和方法
- 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类
静态内部类
- 静态内部类的创建是不需要依赖于外围类,可以直接创建
- 静态内部类不可以使用任何外围类的非static成员变量和方法,而内部类则都可以
外部类的创建语法:
外部类.内部类 内部类对象 = new 外部类.内部类();
class Outer{
private static String name = "zhangsan";
static class Inner{
public void print(){
System.out.println(name);
}
}
public void function(){
Inner inner = new Inner();
inner.print();
}
}
public class TestDemo3 {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.print();
}
}
静态内部类能否访问外部类实例内部成员:一般情况下不可以
方法内部类(实例内部类)
- 局部内类不允许使用访问权限修饰符 public private protected 均不允许
- 局部内部类对外完全隐藏,除了创建这个类⽅方法可以访问它其他的地方是不允许访问的。
- 局部内部类要想使用方法形参,该形参必须用final声明(JDK8形参变为隐式final声明).
class Outer{
private int age = 10;
public void function(int id){
class Inner{
private void fun(){
System.out.println(id);
System.out.println(age);
}
}
new Inner().fun();
}
}
public class TestDemo3 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.function(2001);
}
}
实例内部类能否定义static数据成员?
一般情况下不能,因为static所修饰的先初始化此时实例内部类还未定义,但是,若使用
public static final int A=100;
就可以了。
实例内部类是否有额外的内存消耗?
实例内部类拥有外层类的this引用。
本地内部类
匿名内部类
匿名内部类是一个没有名字的方法内部类
匿名内部类必须继承一个抽象类或者实现一个接口
匿名内部类中不能存在任何静态成员或方法
匿名内部类是没有构造方法的,因为它没有类名。
2.继承
继承的主要作用在于在已有基础上继续进行功能的扩充,实现了代码的重用
实现:
class 子类 extends 父类
子类又叫派生类,父类又叫基类、超类
派生类继承了父类除构造函数以外的其他东西
继承的实现:
class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends Person{
private String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public class TestDemo3 {
public static void main(String[] args) {
Student student = new Student();
student.setName("zhangsan");
student.setAge(10);
student.setSchool("123456");
System.out.println("姓名:"+student.getName()+",年龄:"+student.getAge()+",学校:"+student.getSchool());
}
}
关键字super
- super();调用父类的构造函数(放在第一行)
- super.data;访问基类的属性
- super.func();调用基类的方法
覆写
方法的覆写:子类定义了与父类方法名称、参数类型及个数完全相同的方法。但是被写不能够拥有比父类更为严格的访问控制权限。
写方法时,99.99%的情况下建议使用public
写属性时,98%情况下建议使用private
关键字final
final class A{} //A类不能有子类
使用final定义的变量就成为了常量,常量必须在声明时赋值,并且不能够被修改
多态
概念:基类引用派生类对象,且基类和派生类有同名的重写方法
Class对象放在方法区上
Class对象保存的RTTI信息(Runtime type information)
方法表与类型一一对应
方法表在编译是产生