(十三)多态、Object类

Basic Java Programming day13

今日内容

  • 预习
    多态(方法的多态):要有继承、要有方法重写、父类引用指向子类对象。

  • 复习

  1. final
    修饰类 不能被继承
    修饰变量 常量名全部大写
    修饰方法 可以被继承,不能被重写
  2. 抽象类
    1.抽象类里面不一定要有抽象方法
    2.有抽象方法的类一定是抽象类
    3.子类继承了抽象类 那么就必须重写所有抽象方法
    4.如果子类不想重写抽象方法或只想重写一部分方法把该子类声明为抽象类
    5.抽象类无法实例化(创建对象),但是能拥有自己的构造器。
  3. 接口(静态常量、抽象方法)
    1.类与类 继承 单继承
    2.接口与接口 多继承
    3.类与接口 实现 多个接口
  • 今日
    1. 多态
    2. Object类
    3. 四种权限修饰符
    4. 包装类
    5. 常量池

多态

  1. 多态:一种事物具有多种表现形式
    猫:猫 x = new 猫();
    动物 a = new 猫();
    宠物 a = new 猫();
  • 多态的体现:
    1. 父类(父接口)引用指向子类对象
      父类(父接口)引用去接收子类对象
    2. 要有继承或实现
    3. 方法的重写
  • 多态特点:
    父类引用只能调用父类中的成员,
    如果说子类重写了父类中的方法,那么调用子类重写的方法,在编译时首先检查父类中有没有该方法,如果没有,编译报错,有,就不报错。运行就会执行子类中的方法。
    编译看左边,运行看右边。

在继承关系中,变量不存在重写的概念,不具有多态性。只有成员方法才有重写的概念。

成员变量不具备重写的概念,因此在运行时只会调用父类的。
成员变量:编译运行都看左边。

静态方法:谁的引用调用静态方法,就执行谁的。

多态的好处:
提高了代码的维护性(继承保证)
提高了代码的扩展性(由多态保证)

向上向下转型。
为什么要向下转型:为了调用子类中特有的方法。

Object类

hashCode()
toString()
equals()

==和equals()的区别
	1.==能比较基本数据类型,也能比较地址。
	2.equals如果说没有重写,比较地址,重写比较内容。

只要重写了equals,比较的就是内容。
在jdk提供类中,很多对象都重写了equals。

解决类名冲突。
将字节码文件分类存放。

四种权限修饰符

public权限最大
protected 不同包不同类不能访问
default父类和不同包不同类不能访问
private 同类可以访问

类的组成及常用修饰符

包装类

将int转integer 装箱
int a = int1.intValue() 拆箱
jdk1.5之后 增加自动装箱拆箱。

常量池

单独的一块内存,专门用来存常量
存的整数值只能是-128~127

作业

  1. 什么是多态?发生多态的前提条件是什么?
    一种事物具有多种表现形式。
    1.多态的体现:
    父类(父接口)引用指向子类对象
    父类(父接口)引用去接收子类对象
    2.要有继承或实现
    3.方法的重写

  2. 发生多态时,成员的访问特点是?
    父类引用只能调用父类中的成员,
    如果说子类重写了父类中的方法,那么调用子类重写的方法,在编译时首先检查父类中有没有该方法,如果没有,编译报错,有,就不报错。运行就会执行子类中的方法。
    编译看左边,运行看右边。

  3. 根据提示信息,补全代码题

    public class Test3 {
    public static void main(String[] args) {
    	Father f = new Father();
    	f.study("书法");		// 输出为:父亲学习书法
    	Father f2 = new Son("李四");
    	f2.study("书法");	// 输出下面两行:	
    // 父亲学习书法 
    // 儿子学习书法   
    	Action action = new Son();
    	action.run();			// 输出为:正在跑步
    }
    }
    class Father{
    study();
    //补全类中的代码
    }
    Action{
    //Action 是接口,补全接口中代码
    }
    class Son {
    //补全类中代码
    }
    
  4. 代码阅读分析题

    class Base {
    	int i=50;
        Base() {
            int i = 100;
            System.out.println(i);
        }
        public void test() {
        	System.out.println("我是父类的test方法");
        }
    }
    public class Pri extends Base {
        int i = 200;
        public static void main(String args[]) {
        	Base b = new Pri();          
            b.test();
            System.out.println(b.i);
        }
        public void test() {
        	System.out.println(super.i);
        	System.out.println("我是子类的test方法");
        }
    }
    

    以上代码的输出结果为?为什么?
    100
    50
    我是子类的test方法
    50

  5. 代码阅读分析题

    public class Test4 {
    	public static void main(String[] args) {
    		Base b = new Sub();
    	}
    }
    class Base {
    	String baseName = "base";
    	public Base() {
    		callName();
    	}
    	public void callName() {
    		System.out.println(baseName);
    	}
    }
    class Sub extends Base {
    	String baseName = "sub";
    	public void callName() {
    		System.out.println(baseName);
    	}
    }
    

    以上代码的输出结果为?为什么?
    答:Null

  6. 代码阅读分析题

    public class Test5 {
    	public static void main(String[] args) {
    		S s = new S();
    	}	
    }
    class F {
    	private String name = show();
    	public F() {
    		System.out.println("F");
    	}
    	public String show() {
    		System.out.println("F的show()");
    		return "F的show()";
    	}
    }
    class S extends F {
    	private String name = show();
    	public S() {
    		System.out.println("S");
    	}
    	public String show() {
    		System.out.println("S的show()");
    		return "S的show()";
    	}
    }
    

    以上代码的输出结果为?为什么?
    S的show()
    F
    S的show()
    S

  7. 以下代码是否能编译运行,如果不能,请修改;如果能,输出结果为?

    abstract class A {
    	abstract void f() { };     
    	public abstract void k();
    }
    class B extends A {
    	protected void f() { }
    	void k() {     		
    		System.out.print("I am subclass");
    	}
    	public static void main(String[] args) {
    		A a = new A();    
    		a.f();
    		a.k();
    	}
    }
    
  8. == 和 equals 的区别
    ==能比较基本数据类型,也能比较地址。
    equals如果说没有重写,比较地址,重写比较内容。

  9. 代码分析题

    Integer n1 = 128;
    		Integer n2 = 128;
    		int n3 = 128;
    		System.out.println(n1 == n2);
    System.out.println(n1.equals(n2));
    		System.out.println(n1 == n3);
    		````
    

以上代码输出结果为?为什么?
false
true
true

总结

越往后学感觉自己越来越菜,这才刚学完Java基础,继续努力继续努力!!!!希望自己能把知识掌握在手。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值