多态:
1)三个前提条件:
a:必须有继承关系
b:方法重写
c:必须有父类引用指向子类对象:向上转型
2)多态中的成员访问特点:
a:成员变量:编译看左,运行看左
b:成员方法(非静态的):编译看左,运行看右
c:静态成员方法:编译看左,运行看左(静态方法不算方法重写,和类有关)
3)多态的弊端
不能使用子类的特有功能:
要使用子类的特有功能:
a):创建子类的具体对象(虽然可以,但是从内存角度考虑,不好:耗费空间)
b):向下转型:将父类的引用强制转换为子类的引用
子类名 对象名= (子类名)父类引用 ;
向下转型会出现的异常:
ClassCastException
ArrayIndexOutOfBoundsException:数组角标越界异常
NullPointerException:空指针异常(解决方案:给对象做非空判断)
if(对象名!=null){
给该对象进行操作..
抽象类:
a:概念
是由于在一个类中存在一个抽象功能,所以必须用abstract去修饰当前的这个类
abstract class Animal{
} 抽象类中不一定有抽象方法,如果一个类中有抽象方法,那么这个类一定是抽象类!
抽象类是不能直接实例化的:不能创建对象
抽象类的子类:具体类
抽象类的实例化:需要通过该抽象类的子类进行数据的初始化!抽象类多态
Animal a = new Cat() ; 抽象类多态形式
b)抽象类的成员特点
成员变量:可以是自定义常量,也可以是变量
成员方法:可以抽象方法(没有方法体的方法),也可以是非抽象方法
构造方法:可以有无参构造/也可以有有参构造
c)abstract不能和哪些关键字共同使用
public或者protected(这两个 是可以使用的)
static
private
final
接口:
创建对象:具体类对象(根据具体需求)
使用抽象类多态(次之)
使用接口多态(最常用的)
接口的表示方法:interface 接口名{}
接口名和类名的命名规则一样
接口的子实现类和接口的关系:implements实现
class 子实现类名implements 接口名{}
接口的子实现类:一定是一个具体类;子实现类是抽象类(没有意义)
接口不能直接实例化—>最终创建接口的对象就是通过子实现类来进行实例化!
接口里面的代码越少越好:
登陆();
注册() ;
接口的子实现类 implements 接口{
登陆(){
//业务逻辑
}
}
测试类
main(){
通过接口多态:
接口名 对象名 =new 子实现类名() ;
接口的成员特点:
成员变量:
变量是一个常量:默认修饰符:public static final
成员方法:默认修饰符:public abstract
接口中是不能有构造方法的;
形式参数和返回值问题
形式参数
基本类型:只是把值赋值给形式参数
引用类型:具体类类:如果形式参数是一个具体类,那么需要创建该类对象
package org.westos_形参和返回值;
/*
* 形参的返回值是一个具体类的时候
* */
class People{
public void method(Student s) {
s.show();
}
}
class Student{
public void show() {
System.out.println("学生show");
}
}
public class Practice01 {
public static void main(String[] args) {
People p = new People();
p.method(new Student());
}
}
抽象类:如果形式参数是抽象类的情况,那么需要自定义一个抽象类的子类,来进行实例化(创建对象)!,创建对象的实质:抽象类多态!
package org.westos_形参和返回值;
/*
* 抽象类:如果形式参数是抽象类的情况,那么需要自定义一个抽象类的子类,来进行实例化(创建对象)!,创建对象的实质:抽象类多态!
* */
class Demo{
public void method(People2 p) {
p.show();
}
}
abstract class People2{
public abstract void show();
}
class Student2 extends People2{
public void show() {
System.out.println("学生show");
}
}
public class P02 {
public static void main(String[] args) {
Demo d = new Demo();
People2 p = new Student2();
d.method(p);
}
}
接口:如果形式参数是接口情况,那么需要自定义一个接口的子实现类,然后通过接口多态的形式给接口进行实例化!(接口多态!)
返回值类型
基本类型 :返回一个具体的值
引用类型:具体类:直接返回该类对象(通常实际开发中使用的是匿名对象)
抽象类:返回值如果是抽象类,需要的返回是该抽象类的子类对象
package org.westos_形参和返回值;
/*
*返回值如果是抽象类,需要的返回是该抽象类的子类对象
* */
class Demo{
public People2 method() {
return new Student2();
}
}
abstract class People2{
public abstract void show();
}
class Student2 extends People2{
public void show() {
System.out.println("学生show666");
}
}
public class P02 {
public static void main(String[] args) {
new Demo().method().show();
}
}
接口:返回值如果是接口类型,需要的是返回该接口的子实现类对象(通过子实现类进行实例化!)
3:内部类的概述及访问特点
内部类: 在一个类中定义另一个类
访问特点: 内部类可以访问外部类的所有成员
外部类想访问内部类的成员时必须先创建内部类的对象
4:内部类的分类:
成员内部类: 在外部类的成员位置
package org.westos_内部类;
/**
*
* 看程序
* 面试题:
要求请填空分别输出30,20,10。
外部类和内部类没有继承关系!
* */
class Outer7 {
public int num = 10;
class Inner7 {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(new Outer7().num);//要访问外部类的成员变量:匿名对象 :new 外部类名().成员变量
//外部类的this限定
System.out.println(Outer7.this.num);
}
}
}
public class InnerClassTest {
public static void main(String[] args) {
Outer7.Inner7 oi = new Outer7().new Inner7();
oi.show();
}
}
局部内部类:在外部了的局部位置定义的这个类
匿名内部类
package org.westos_内部类;
/**
* 匿名内部类在开发中的使用
* */
interface Inter3{
public abstract void study() ;
}
class StudentDemo{
public void method(Inter3 i){//形式参数是一个接口
i.study() ;
}
}
//方式1:
class Armay implements Inter3{
public void study(){
System.out.println("好好学习,天天向上...");
}
}
//方式2:
//测试类
public class OuterTest {
public static void main(String[] args) {
//需求:调用StudentDemo中的method()方法
StudentDemo sd = new StudentDemo() ;
Inter3 i = new Armay() ;
i.study() ;
System.out.println("---------------------");
//方式2:匿名内部类
StudentDemo sd2 = new StudentDemo() ;
sd2.method(new Inter3(){
@Override
public void study() {
System.out.println("好好学习,天天向上...");
}
}) ;
}
}