一些知识点:Java基础(2)

来源:互联网 发布:linux服务总结 编辑:程序博客网 时间:2024/06/05 04:39

       本篇主要包含Java关键字、UML、多态等上一篇没有的,又是一锅大杂烩。

Java引用变量有两个类型:一个是编译是类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。例如:  父类  引用变量  = new 子类();该引用变量的编译时类型为父类而运行时类型为子类,这个引用变量只能调用声明该变量时所用类里包含的方法,通过引用变量总是访问到编译时的成员变量。多态:相同类型的变量调用同一个方法时呈现多种不同的行为特征。

//父类public class Base {String a = "父类变量";public void test(){System.out.println("父类方法");}}//子类public class Sub extends Base{String a = "子类变量";public void test(){System.out.println("子类方法");}public static void main(String[] args) {//编译时类型为ObjectObject b = new Sub();b.getClass();//只能调用Object类中的方法//b.test(); //报错Base c1 = new Sub();System.out.println(c1.a); //父类变量Base c2 = new Base();//相同类型的c1,c2 调用同样的方法c1.test(); //子类方法c2.test(); //父类方法}}
这是因为Java允许把一个子类直接赋值给一个父类引用变量,无须任何类型转换(由系统自动完成类型转换)


Java的序列化(serialization)提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个字段上关闭serialization,可以在这个字段前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。例如 public transient int a;

当需要调用远程方法时,传递给方法的参数必须打包到一个字节流中,通过网络传输给远程JVM。例如在分布式框架中,方法通常入参是一个类并且实现了序列化。

native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI(Java Native Interface,Java本地接口)接口调用其他语言来实现对底层的访问。标识符native可以与所有其它的java标识符连用,但是abstract除外,因为abstract修饰的方法表示是只有声明而没有实现体,而native修饰的方法其实现在其他文件中。    

abstract 不能与private、static、final并列修饰同一个方法。abstract方法的修饰符只能是public或protected或省略,因为private方法不能被覆盖。static修饰的方法表示属于类,而抽象类需要子类实现其中的 抽象方法,当抽象方法在子类中被覆盖后就是实例方法。final修饰的方法表示该方法不能被改变。可见private、static、final的作用均与abstract的本意相违背。abstract类体现的是一种模板设计模式,abstract类作为多个子类的通用模板,而各个子类各有不同的实现。

接口里的成员变量默认使用public static final 修饰,接口中的方法默认使用public访问修饰符(由接口的特性所决定),接口体现的是一种规范。  

外部类的上一级是包,因此只有2个作用域,同一个包和任何位置只需public和省略访问控制符,内部类的上一级是外部类因此有4个作用域:同一个类、包、父子类和任何位置。用static修饰一个内部类,则这个内部类属于外部类本身,而不是外部类的某个对象。局部内部类:定义在方法中,仅在该方法内有效,因此不能使用访问控制符和static修饰。同一个类中可能有两个以上同名的局部内部类(处在不同的方法中)。

for循环前加标签的用法,多层循环时,当内层循环满足某一条件时,跳出最外层

int i=0,j=0;out: //这里的out可以是任何abcd...中文字for(;i<10;i++){for(;j<6;j++){if( j==4){break out;}}}System.out.println("i:"+i+"  j:"+j); //0,4

子类方法,变量的修饰符必须大于等于父类的方法变量的修饰符。但是也有特例:父类中省略访问控制符声明的方法,能够在子类中声明为private。

Math.floor(-10.4) == -11  ---> floor意为地板,向下取整,返回不大于他的数
Math.ceil(-10.4) == -10   ---> ceil意为天花板,向上取整,返回不小于他的最大数
Math.round(-10.4) == -10  --> 这个才是四舍五入

一个类可以实现多个接口,各个接口之间可以相互转化。这个怎么理解呢? 我是用多态中运行时类型来理解的。。等以后跟明白了再来修改!

public interface A {void methodA();}public interface B {void methodB();}public class ABImpl implements A,B {@Overridepublic void methodB() {System.out.println("实现接口B的方法B");}@Overridepublic void methodA() {System.out.println("实现接口A的方法A");}public static void main(String[] args) {A a = new ABImpl();a.methodA();B b = (B) a;b.methodB();}}

在UML类图中,常见的有以下几种关系: 泛化<继承>(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)
1.泛化(继承) -- 用带三角形箭头的实线表示,箭头指向父类 

2.实现 --  带三角形箭头的虚线,箭头指向接口,表示类是接口所有特征和行为的实现。(实现虚线)

3.关联 -- 带普通箭头的实线,是一种拥有的关系,箭头指向被拥有者,它使一个类知道另一个类的属性和方法。例如学生-->课程,当双向关联的时候,不需要箭头了

4.聚合 -- 带空心菱形的实线,菱形指向整体,是整体与部分的关系,且部分可以离开整体而单独存在

5.组合 -- 带实心菱形的实线,菱形指向整体   整体与部分的关系,但部分不能离开整体而单独存在

6.依赖 -- 带箭头的虚线,指向被使用者,是一种使用的关系,即一个类的实现需要另一个类的协助

详细可参见文章http://blog.csdn.net/tianhai110/article/details/6339565

移位运算符:转换为二进制运算,左/右移n位即乘/除2的n次方。移位的效率高于直接用乘除法。例如 :16 << 2 == 16 * 2^2

try catch体现的是一种责任链模式,

值传递与引用传递:基本类型和基本类型变量被当做参数传入方法中时是值传递,因为传入的是副本,无法改变其值。对象和引用型变量被当作参数传递给方法时是引用传递,在方法中无法给原变量重新赋值,但是可以改变它所指向对象的属性。即值传递不能改变原变量的内容和地址,引用传递不可改变原变量的地址,但可以改变原变量的内容。

Java的方法签名就是方法名+参数列表,不包括返回值和访问修饰符。Java在运行时没有保存形参的记录:method(int a,int b) --> method(arg0,arg1)

在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象,也就是某个类所有的实例对象是同一个 .class字节码文件产生。

Java中的注解是对源代码增加的一些特殊标记,这些特殊标记可以通过反射获取,当程序获取这些特殊标记后,可以做出相应的处理或不处理。

Java中的二(多)维数组即一维数组中的每个元素均指向一个数组。如一个二维数组的行和列,列即Java中的一个一维数组A,行则是该数组A中的每个元素所指向的另一个数组,因而在遍历时,外层循环遍历最外的那个一维数组,内层循环遍历一维数组中每个元素(即另一个一维数组)
   

0 0
原创粉丝点击