1.向上转型
A a=new B(); //A是B的父类
向上转型,通俗点就是说先创建一个B子类对象,然后把它强制转型为A类对象。所以A类A1()方法被子类B中的A1()方法覆盖,而子类中的B2()丢失。由于B与A是继承关系,所以A中的私有属性不会被继承,强转为A类对象时该父类类型的引用不能调用父类的私有属性。该特点体现了java的 多态性。定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。如下面的小题答案为c:
向上转型,通俗点就是说先创建一个B子类对象,然后把它强制转型为A类对象。所以A类A1()方法被子类B中的A1()方法覆盖,而子类中的B2()丢失。由于B与A是继承关系,所以A中的私有属性不会被继承,强转为A类对象时该父类类型的引用不能调用父类的私有属性。该特点体现了java的 多态性。定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。如下面的小题答案为c:
public class Person{
private String name=”Person”;
int age=0;
}
public class Child extends Person{
public String grade;
public static void main(String[] args){
Person p = new Child();
System.out.println(p.name); //私有属性无法继承
}
}
A) 输出:Person B) 没有输出 C) 编译出错 D) 运行出错
2.super和this的存在方式
首先super();或this();语句必须出现在构造方法的
第一行,且
不能同时出现。
原因:
在构造函数中如果不指明构造器之间的关系,那么编译器会自动加上super();目的是在初始化时,保证父类对象先初始化。所以,若指定了构造函数间的调用,那么this()必须在第一行,以保证在执行任何动作前,对象已经完成了初始化。构造函数只能被构造函数调用,因为对象只会初始化一次。
为了避免构建出两个对象这种问题的出现,Java在编译时对这种情况做了强校验,用户不能再同一个方法内调用多次this()或super(),同时为了避免对对象本身进行操作时,对象本身还未构建成功(也就找不到对应对象),所以对this()或super()的调用只能在构造方法中的第一行实现,防止异常。
super();或this();的意义:super();表示调用自己的无参构造方法,this(a,b)就表示调用另外一个构造函数。super(a,b)同理。
如下面小题答案为a:
在使用super 和this关键字时,以下描述正确的是(a)
A) 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
B) super()和this()不一定要放在构造方法内第一行
C) this()和super()可以同时出现在一个构造函数中
D) this()和super()可以在static环境中使用,包括static方法和static语句块 静态无法创造对象
A) 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
B) super()和this()不一定要放在构造方法内第一行
C) this()和super()可以同时出现在一个构造函数中
D) this()和super()可以在static环境中使用,包括static方法和static语句块 静态无法创造对象
3.封装
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。
至于为什么需要封装,因为面向对象中所有的实体都是以对象为基本单位的,以宏观世界的实体来映射到计算机世界中,
每个对象有它自己的属性和自己的行为,我们用类来将这些属性和行为封装到一起,当它实例化出来一个对象的时候,我们可以说这个对象具有这些属性和行为。不同类别的对象正是因为这些特性的不同,我们才可以将它们区分开,而这也正反映了我们现实生活中不同种类个体的不同。
属性的封装可以用private关键字,再提供公共方法对其访问。而类中的方法有private权限也有其他权限,所以继承时要注意。
如下面小题答案为d:
以下对封装的描述正确的是(d)
A) 只能对一个类中的方法进行封装,不能对属性进行封装
B) 如果子类继承了父类,对于父类中进行封装的方法,子类仍然可以直接调用
C) 封装的意义不大,因此在编码时尽量不要使用
D) 封装的主要作用在于对外隐藏内部实现细节,增强程序的安全性
A) 只能对一个类中的方法进行封装,不能对属性进行封装
B) 如果子类继承了父类,对于父类中进行封装的方法,子类仍然可以直接调用
C) 封装的意义不大,因此在编码时尽量不要使用
D) 封装的主要作用在于对外隐藏内部实现细节,增强程序的安全性
4.继承
类和类之间的继承关系可以用UML符号表示,其中父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。
JAVA不支持多继承, 单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时 一个类可以实现多个接口,从而克服单继承的缺点。
JAVA不支持多继承, 单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时 一个类可以实现多个接口,从而克服单继承的缺点。
继承里面,先实例化父类,调用父类的构造函数,然后一步步到子类。
如下面的小题答案为a:
以下对继承的描述错误的是(a)
A) Java中的继承允许一个子类继承多个父类
B) 父类更具有通用性,子类更具体
C) Java中的继承存在着传递性
D) 当实例化子类时会递归调用父类中的构造方法
A) Java中的继承允许一个子类继承多个父类
B) 父类更具有通用性,子类更具体
C) Java中的继承存在着传递性
D) 当实例化子类时会递归调用父类中的构造方法
5.抽象类和接口
1)抽象类
先说抽象方法,抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:
abstract void fun();
如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。
因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。
[public] abstract class ClassName {
abstract void fun();
}
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样可以拥有成员变量和普通方法。
2)接口
接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。在Java中,定一个接口的形式如下:
[public] interface InterfaceName {
}
接口中可以含有变量和方法。接口中的变量会被隐式的指定为public static final变量(并且只能是public static fianl,用priavate修饰会编译报错),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,
接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且
一般情况下不在接口中定义变量。
允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就
必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
接口不允许实例化,只能实现,所以不存在构造方法。
3)区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
6.异常体系
7.中断与非中断
|非中断或:会执行所有判断条件
||中断或:满足后不执行后续条件
&和&&同理
8.swtich的作用对象
能用在String和int
Jdk1.6以前不支持String
Byte变int补零就行,不丢失精度
Long变成int丢失精度
Jdk1.6以前不支持String
Byte变int补零就行,不丢失精度
Long变成int丢失精度