每周学习心得

这周主要对隐藏和封装,构造器,类的继承关系,多态(很重要),包装类,final修饰符进行了深入学习。

1.通过构造器为成员变量定义初始化值,这也是构造器的最最重要的用途之一。

2.构造器重载:如果需要在构造器中调用另外一个构造器,可以使用 this(params),放在有效的执行语句第一行,而且不允许出现两条this(params)语句。

3.重写父类的方法:@override。作用:子类直接调用父类方法;可直接重写方法,覆盖父类的方法,增加代码多样性!

重写父类时所需要尊的规则:返回值和访问控制修饰符可以不一样,但是要符合“两同两小一大原则”,作为两同就是方法名和方法的参数列表相同;两小:子类的返回值类型和抛出的异常类要比父类的返回值类型和抛出的异常类更小或者相等,这里说的返回值类型小值指的是子类和父类的关系;一大:子类的访问权限要比父类的访问权限要大或者相等。

4.super可调用被覆盖的父类方法(super.fun()可调用父类没被覆盖方法,一般直接在子类中调用,无需使用了解即可)。

5.没有使用private修饰符修饰的成员变量和方法,子类都能够继承;

   子类重写了父类的方法,则父类的方法会被隐藏,隐藏的方法或者成员变量可以通过super关键字进行访问;

   引入super关键字的原因是可以访问被隐藏的成员变量和属性,而且super只能在子类的方法定义中使用。

6.java中所有的类都是Object的子类(有点类似JavaScript中的Window)

    在子类的构造器中,无论如何在第一行语句中都会调用一次父类的构造器;

    如果没有显式的调用,那么会调用父类的没有参数的构造器,如果父类没有定义空参数的构造器,则此时会无法编译;

    对象创建的过程就是调用对象类的构造器的过程,一个构造器最基本的组成;

    super()必须出现在第一行,而且只能有一个;

    this和super在同一构造器中只可能出现一次。

7.子类构造器调用父类构造器可能出现的情况有:

  • 子类构造器执行体的第一行显式的使用super调用父类的构造器,此时系统将根据super(params)调用对应的构造器。

  • 子类构造器执行提的第一行显式的使用this调用重载的构造器,系统将根据this(params)调用对应的重载构造器,本类中的对应的构造器再去调用父类的构造器。

  • 子类构造器中既没有super又没有this,子类在执行构造器语句前执行父类的无参构造器。

  • 无论如何子类都会调用一次父类的构造器。

  • 在实际的开发过程中,我们一般都会保证在一个类中有一个无参的构造器的存在。因为如果在其类的子类中没有定义构造器,或者定义了构造器没有显式的去调用父类的构造器,子类也能被成功的编译。

8.Java引用类型变量有两种类型:一种是编译时的类型,一种是运行时的类型。

    编译的类型是由声明变量的时候决定的;

    运行时类型由实际赋给该变量的对象决定。

    如果运行时的类型和编译时的类型不一致就会出现所谓的多态。

    首先编译时类型和运行时类型是一种父类和子类的关系;

    多态最常用的场景就是子类重写父类的方法后,如果引用变量的类型为父类,而对象为子类,如果引用类型调用重写方法,      会去执行子类定义的实现。

9.引用类型的强制类型转换:

    编写Java程序时,引用变量只能调用他编译时的方法,而不能调用其运行时类型的方法。如果你必须要调用其运行时的类型,      则需要进行强制类型转换;

    强制类型转换是把大的类型转换为小的类型;

    在我们的引用数据里,大的类型是父类,小的类型是子类;

    只可能发生在子类和父类的关系中。

10.instanceof运算符:

instance运算符的前一个操作数一般是引用数据类型变量,后一个操作数是类名(接口),它是用于判断前面的对象是否是后面的类、或者其子类。如果是的话,返回true;

instanceof运算符一般用于在我们对引用数据类型进行强制类型转换之前判断使用。

避免在实际的运行过程中出现 ClassCastException。

实例代码:

public class Client1 {
	public static void main(String[] args) {
		Animal tom = new Dog();
		Animal mimi = new Cat();

		Animal ani1 = new Animal();

		if (ani1 instanceof Dog) { // 此处ani1的数据类型为 Animal 所以运算的结果为 false
			Dog dog1 = (Dog) ani1;
			System.out.println(dog1.getAge());
		}

		if (tom instanceof Dog) { // 此处tom运行时数据类型为 Dog 所以运算的结果为 true,可以进行转换
			Dog dog2 = (Dog) tom; // 强制类型转换
			dog2.setAge(20);
			System.out.println(dog2.getAge());
		}

		tom.cry();
		mimi.cry();

	}
}


11.

对八大基本数据类型的包装类:

基础类型包装类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

从基本数据转成引用数据的方法:

  • 从构造器创建
  • 自动装箱创建

从引用数据类型转成基本数据类型,使用 对象.xxxxValue();

		int y = 10;
		Integer yi = new Integer(y);
		Integer yi2 = y;

		int y3 = yi.intValue();

		boolean b = false;
		Boolean bi = new Boolean(b);
		Boolean bi2 = b;

		boolean bi3 = bi2.booleanValue();

在实际开发中,一般对于一个实体对象的类成员属性的定义,我们一般使用的是基本数据类型的包装类。

在使用基本数据类型的时候,对于类的成员变量都会有默认值,但是这个默认值其实在很多的时候是有意义的,而不能随便的设置值。

如果使用包装类,则不会有初始化值,定义的为null。

12.
final 修饰符:

final 可以修饰在类、成员变量、方法

  • 如果修饰类:则该类不会被继承(一般在开发中很少使用);
  • 如果修饰成员变量:一旦给成员变量赋值后就不允许修改其值,一般用在对常量的定义中。
  • 如果修饰方法:该方法不能被重写

在实际的开发中, final 用的最多的场景是结合 static 关键字定义类变量,即静态变量。
定义为 final 另一个意图就是将变量的值保护起来。

public class Client1 {
	public static final String SCHOOL_NAME = "南通青鸟IT教育"; 
	public static void main(String[] args) {
		int r = 20;
		System.out.println(Math.PI * 2 * r);
//		Client1.SCHOOL_NAME = "青鸟IT教育"; // 错误代码,不能被修改
	}
}
13.
方法的重载重写
方法签名:只包含了方法名和参数列表
重写:发生在父类和子类之间,方法签名必须是一样的
重载:发生在本类中,方法名一样,但是参数列表不一样,重载可以是构造器的重载,也可以是方法的重载。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值