标签:加载 访问修饰符 vat efault 破坏 值类型 打洞 特性 自动
内聚:内聚是指一个模块内部各个部分之间的关联程度
耦合:耦合指各个模块之前的关联程度
封装原则:隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别
在面向对象方法中,用类来实现上面的要求。用类实现封装,用封装来实现高内聚,低耦合。
所谓访问权限,指的是本类的成员变量、成员方法和内部类对其他类的可见性。
Java一共有四种访问权限,按照权限由大到小分别为public、protected、default和private,如果省略了访问修饰符,那访问权限就是defualt。四种访问权限的含义和权限控制见下面表格:
注意:所谓的访问,有两种方式,直接访问和通过对象访问。
public class House { // 私有化属性 private String cookroom; private String bathroom; private String bedroom; private String parlor; public String getCookroom() { return cookroom; } public void setCookroom(String cookroom) { this.cookroom = cookroom; } public String getBathroom() { return bathroom; } public void setBathroom(String bathroom) { this.bathroom = bathroom; } public String getBedroom() { return bedroom; } public void setBedroom(String bedroom) { this.bedroom = bedroom; } public String getParlor() { return parlor; } public void setParlor(String parlor) { this.parlor = parlor; } }
可以看到一个封装的类 存在get 与 set 方法 分别是 获取 与 设置 this 指当前的对象 所以具体是指为获取当前的 /为当前的设置值
俗话说,龙生龙,凤生凤,老鼠的儿子会打洞,这就是继承的一种表现。就像我们每个人会继承父母的相貌等基因,甚至财富,人脉等资源。
同样在java代码中类与类,接口与接口之间都存在继承,要想继承另一个类,那么 extends 是必不可少的。
唯一要注意的是,java所倡导的继承是单继承,就像我们每一个人,只会有一个亲生父亲(当然马云爸爸,要认我做儿子的话,我也是无法拒绝的0.0),所以java类只能通过关键字extends 继承另外一个类,或者一个接口通过 关键字extends继承另外一个接口。
而类与接口之间,只能是类实现接口,通过关键字 implements 完成类实现接口。
主要实现重用代码,节省开发时间。
结论:非静态属性和方法可以被继承和重写。但是静态属性和方法可以被继承,但是没有被 重写 而是被隐藏,即调用的都是父类的属性和方法。
原因:
在类中,用static声明的成员变量为静态成员变量,俗称类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。
这里要强调一下:
static修饰的成员变量和方法,从属于类
普通变量和方法从属于对象
静态方法不能调用非静态成员,编译会报错
static关键字的用途一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。
显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
static可以用来修饰类的成员方法、类的成员变量,另外也可以编写 static代码块 来优化程序性能
static方法也成为静态方法,由于静态方法不依赖于任何对象就可以直接访问,因此对于静态方法来说,是没有this的,因为不依附于任何对象,既然都没有对象,就谈不上this了,并且由于此特性,在静态方法中不能访问类的非静态成员变量和非静态方法,因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。
虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法和静态成员变量。
static变量也称为静态变量,静态变量和非静态变量的区别:
静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化
非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
static成员变量初始化顺序按照定义的顺序来进行初始化
静态初始化块可以置于类中的任何地方,类中可以有多个静态初始化块。
在类初次被加载时,会按照静态初始化块的顺序来执行每个块,并且只会执行一次。
在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。看下面的例子就明白了:
public class Person { public String name = "李四"; private static String address = "中国"; }
public class Main { static int value = 33; public static void main(String[] args) throws Exception{ new Main().printValue(); } private void printValue(){ int value = 3; System.out.println(this.value); } }
输出结果为 33
this代表什么?this代表当前对象,那么通过new Main()来调用printValue的话,当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)
public class Test { private String name;//成员变量,也是全局变量 public void changeName() { String n = "tomoya";//n就是局部变量 name = n; } }
局部变量见名思意 在一个方法内部使用 别的地方就不能使用了 而成员变量是在当前类中的变量,所以作用范围就大的多 在局部变量的方法中也可以使用成员变量
父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。
1.继承的存在(继承是多态的基础,没有继承就没有多态).
2.子类重写父类的方法(多态下调用子类重写的方法).
3.父类引用变量指向子类对象(子类到父类的类型转换).
1.子类会自动向上转型
2.此时父类调用的重写方法是各个子类的方法实现
3.此时通过父类引用变量无法调用子类特有的方法
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
标签:加载 访问修饰符 vat efault 破坏 值类型 打洞 特性 自动
原文地址:https://www.cnblogs.com/luy520/p/12515194.html