java使用类来构造自己的数据类型,类其实就是对一类数据和行为的数据封装;可以达到低耦合功能;
注意啦:用类也是我们为了定义自己数据类型的一种方法,所以结构体,共用体也是一样的;都是为了处理数据而用的方法!
类的存放问题: java源代码文件是以类为中心的,一个类的定义源码必须只在一个源文件实现;一个“文件名.java”文件名必须与文件中用public class 修饰的类名一致,java语法还规定一个源文件中必须有且只能只有一个public类,public是一个访问修饰符,public的意思是我这个类可以供别的类使用,在任何地方。
从数据类型的角度看待类就有全新的认识:类是通过将别的数据类型封装到自己类里面作为自己的属性,代表一种全新的复杂数据类型。
类的构造方法:
方法名和类名是一样的
构造方法在创建对象的时候会java平台自动调用构造方法
构造方法没有返回值
类变量是该类的所有对象共享的变量,该类的任何一个对象访问它时候,取到的都是同一个内存地址的值; 同样任何一个该类的对象去修改它时,修改的也是同一个变量。类变量可以被对象的普通方法(非静态方法)去维护;
类变量是与类有关的公有属性
实例变量是属于每个对象个体的属性
类变量可以通过类名.类变量名直接访问
定义语法
访问修饰符 static 数据类型 变量名
访问类变量方式
类名.类变量名 或者 对象名.类变量名(不提倡)
程序有代码区和栈区
类方法
类方法定义形式
访问修饰符 static 返回值类型 函数名(参数列表)
类方法中不能访问非静态变量,
public static int getTotalFee()
{
age++; //对象属性,非静态变量
return totalFee;
}
但是普通方法可以访问静态变量(类变量)和对象属性(成员变量)
调用方式
通过类名.类方法名直接访问;
类方法属于与类相关的,公共的方法
实例方法属于每个对象个体的方法
java中默认遵守的规则:类变量用类方法去维护;
1、方法一样
2、需要参数类型,参数数量,参数顺序至少有一项不同
3、参数返回值和方法修饰符可以不同,但是不能作为判定重载的依据:
比如两个函数,参数类型,数量,或顺序都是一致的,方法名一样;单纯的只是返回值不同或者方法修饰符不同那么这样不构成方法重载。编译器是会报错的
方法覆盖是指子类有个方法和父类的某个方法在 返回值类型 + 方法名 +参数列表 一样;那么就说子类的方法覆盖了父类的这个方法。
类的继承可以做到代码的复用,但是也有一个问题,类中实现同一个功能的方法,父类和子类实现形式是不一样的;如果单纯地继承不能做到个性化。
方法覆盖是对父类方法在子类中重新实现;以在子类中调用该方法后直接调用子类方法而不去调用父类方法。方法覆盖需要 访问修饰符 + 返回类型 +方法名 +参数列表都一样;
总的来说方法覆盖有两点
1、子类方法的返回类型,方法名,参数列表要和父类的方法在这些方面完全一样
2、子类方法不能缩小父类方法的访问权限
局部变量名(Local Variable Name)
1、局部变量名一般包含多个单词,一般不包含动词;第一个单词首字母小写 ;如myCar
2、变量名能突出变量作用,则应该突出变量类型;比如Car类型变量的引用,可以命名为car
3、数组名最好后面加 s,表示多
4、对于 boolean类型变量习惯以is开头
成员变量(Member Variable Name)
习惯上在变量名前加 m字母表示成员变量。表示member
类名 (Class Name)
类名习惯上有一个或几个单词组成,每个单词的首字母都大写
方法名 (method Name)
方法名表示该方法的功能,一般以动词开头,第一个单词的首字母小写:
参数名(parameter Name)
参数命名规则和局部变量命名规则差不多,但是为了区分一个变量是不是参数,可以给参数名前面加上一个p前缀,这个p代表parameter
包名(package Name)
包名一般是小写
包名一般用一个单词构成,它的全限定名应该可以表达包中类的作用,例如common包最好放在叫car包中,这样全限定名car.common就能够表示出common包存放的是普通汽车类
抽象类:解决父类方法的不确定性,比如父类的一个方法实例,但是子类对该方法又有不一样的实现方式,需要方法覆盖了。那么父类的该方法就永远也不会调用。这时候我们可以用abstract修饰父类方法,那么这个方法就是抽象方法;如果用abstract修饰该类,那么该类就叫抽象类。
抽象类是java里面比较重要的类,
注意事项
1、用abstract修饰的类那么该类就是抽象类
2、用abstract修饰的方法,那么这个方法就是一个抽象方法,这个抽象方法的实现必须在子类里面实现,不能在父类定义抽象方法进行方法实现。同时必须实现。
3、抽象方法在实际编程中用的不多,但是面试问的较多:
4、抽象类不能实例化
Animal a =new Animal(); //这样是错的
5、抽象类可以有没有用abstract修饰的方法
6、一旦类包含了用abstract修饰符修饰了方法,则这个类必须声明为abstract类
7、 抽象类里面的抽象方法不能有主体:比如
abstract public void cry() {}
这样是错误的。
当一个类继承的父类是抽象类的话,那么需要我们将父类里面的所有抽象方法全部实现
abstract class Animal
{
String name;
int age;
abstract public void cry();
}
class Cat extends Animal
{
public void cry()
{
}
}
接口:
先举例说明:
现实生活中的usb接口插槽:我们不用担心任何一个设备的usb接口和电脑连不上,因为usb插槽设备厂商和外设设备厂商遵守了一个共同的协议,比如usb尺寸,排线等;但是设备内部又是不一样。
使用背景:java是单继承的面向对象编程语言,而类实现接口编程可以实现多个接口,这在一定程度上呢弥补了类扩展的局限。
定义:
接口就是给出一些没有内容的方法,封装在一起,到某个类要使用的时候,然后再根据具体情况把这些方法实现出来。
语法:
class 类名 implements 接口
{
实现所有接口方法;
变量;
}
一个重要的原则:是当一个类实现了一个接口,就要求该类实现这个接口的所有方法,
小结:接口是相比抽象类是更抽象的类,抽象类可以有方法体(比如没有用abstract修饰的方法有方法体),但是接口的所有方法都没有方法体,接口实现了程序设计的多态和高内聚和低耦合的设计思想。
接口的注意事项
接口不能实例化;如Usb usb = new Usb();所有这些对接口实例化都是错误的,因为接口是一些没有内容的方法的封装。
接口中所有的方法都不能有方法主体,比如这样的 public void KK() { } 这些都是错的。
一个类可以实现多个接口,
接口中可以使用变量,关于接口中的变量有两点需要说明:、
接口中的变量本质上都是static的,
在java实际开发中,经常把用到的变量定义在接口中,作为全局变量使用。访问形式:接口名.变量名
一个接口不能继承类,但是可以继承其他的接口
抽象类和接口对比
不同:
抽象类可以有函数主体 的方法,但是如果方法用abstract修饰了的话,那么不能有方法体。
接口中所有的都不能有实现的主体,
相同:
用abstract修饰的方法,以及接口里面的方法必须在子类或者实现接口类中实现
继承和实现接口对比
java里面是单继承的,也就是说一个类只能继承一个父类,这样的机制可以保证类的纯洁性,比C++里面的多继承机制简单,问题就是对子类功能扩展有一定影响;但是实现接口是可以实现多个接口的,一定程度是弥补了子类扩展的缺陷。
还有一点是继承是层级式的,倘若类1发生变化,那么类1下面的其他类都将受到影响,而接口可以避免这个问题,因为接口只对实现接口的类有作用,当然如果实现接口的类被其他子类继承了,那么实现接口类实现的接口方法在子类也是可以用的。比如在类1我实现了一个接口,那么类 2 3 4 5 都可以我类1实现的接口类方法;
final
final可以修饰变量和方法
使用final修饰的变量,必须在创建/声明的时候赋初值,并且是确定的;赋值后不能在更改。
对于用final修饰的引用类型变量,java也是要求必须在声明时给予初始值。
final修饰的变量叫常量,final变量名命名
XXX_XXX_ZZZ
可能使用场景
当不希望父类的某个方法被子类覆盖时候,用final修饰该方法
当不希望类中变量被修改,用final修饰,同时必须初始化
当不希望该类被继承 final class Akk{ }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/jq_ak47/article/details/47281511