面向对象概念
类的定义
class Person{ private int age;//成员变量 private String name; public void setAge(int age) { this.age=age; } public void setName(String name) { this.name=name; } public void sayHello() { System.out.println(“大家好,我是”+name+“我今年”+age+“岁了”); } }
对象的实例化 Person yzk=new Person(); yzk.setName("杨中科"); yzk.setAge(18); yzk.sayHello(); Person lzy=new Person(); lzy.setName("林志颖"); lzy.setAge(80); lzy.sayHello(); //两个对象的内存分配:根据模板拷贝两份。 yzk.sayHello(); 每new出的每个对象都是一个单独的实例,两个对象之间的成员变量是独立的两份。new出来的叫类对象或者实例(Instance) 类对象是引用传递 Person weiren=yzk; weiren.setAge(18); weiren.sayHello(); yzk.sayHello(); 解释:“Person weiren=yzk;”weiren指向yzk当前所指向的对象; 成员变量和局部变量 public void setAge(int age) { this.age=age; } 1、局部变量必须初始化,成员变量声明时默认初始化,基本数值类型默认初始化为int,String等非基本类型初始化为null。why?涉及到栈内存和堆内存,以后讲。 2、当成员变量和局部变量(函数参数也可以看做局部变量)重名的时候,被看做局部变量,因此为了避免混乱,建议访问成员变量的时候加上“this”,this代表当前对象。 3、new Person().sayHello();创建一个匿名对象,然后调用。 private/public
构造函数(Constructor)
方法名必须和类名一致 没有返回值类型 3、构造函数可以重载,Person(String name,int age) 4、用构造函数初始化和new之后通过set***初始化的区别:语意,有的对象生来就要有一些成员变量被赋值的,否则就是怪胎 静态static
单例模式
类的静态代码块 class MyTest { static { System.out.println(“zi 静态代码块”) } public MyTest() { System.out.println(“zi 构造方法”) } } MyTest t1=new MyTest(); MyTest t2=new MyTest(); 静态代码块在类第一次被使用的时候执行一次,在构造函数执行之前执行,只要用到类,哪怕没new对象(比如只是声明变量)也会被执行,且只执行一次,一般用于对类进行初始化。 包(package)
通过package定义在页面最顶部; 在磁盘上的保存路径和package一致,可以单级,可以多级 3、包名“潜规则” 包名小写 ”公司域名反着写.产品名.模块名”:com.rupeng.crm.user、com.sum.media.sound 4、当前包中的类无需引用;其他包中的类: import com.rupeng.crm.user.*(不推荐,一次引用太多,容易冲突) import com.rupeng.crm.user.Person;(推荐) 使用的时候java.sql.Array,不用import,适用于同时使用多个重名的类; 5、java.lang下的内容不用手动import 继承(inherit)
class FuLei { private void method1() { } private void method2() { } } class ZiLei extends FuLei { private void method3() { } private void method4() { } } ZiLei zi1=new ZiLei(); zi1.nethod1(); zi1.nethod2(); zi1.nethod4(); zi1.toString(); 继承中的构造函数调用顺序
class Fu { public Fu() { System.out.println("fu"); } } class Zi extends Fu { public Zi() { super();//不管是否显示调用,控制台都会输出fu System.out.println("zi") } } Zi z=new Zi(); 先执行父类的构造函数把父类初始化完成,再初始化子类的 private/public/protected
枚举
enum Dir { EAST,WEST,NORTH,SOUTH; } 使用Dir d=Dir.EAST; 3、(*)枚举类型中还可以定义方法:在所有枚举定义结束后写“;”比如:getIntValue(得到代表的整数)、parse(把整数解析为枚举对象)。常见用法:给枚举定义一个确定的值。构造函数要定义为private(why) 多态
class DiQiuRen { pubic void speak(){System.out.println("我是地球人");} } class Chinese extends DiQiuRen { @Override public void speak(){System.out.println("我是中国人");} public void baiNian(){System.out.println(过年好);} } DiQiuRen dqr1=new DIQiuRen(); dqr1.speak(); Chinese zgr1=new Chinese(); zgr1.speak(); 下面的执行结果是什么? Chinese zgr2=new DiQiuRen();//地球人不一定是中国人 DiQiuRen dqr2=new Chinese(); dqr2.speak(); DiQiuRen dqr2=zgr1; dqr2.speak();
final
抽象类
abstract class DiQiuRen { public abstract void speak(); } 抽象方法没有方法体;一旦类中定义了抽象方法,类必须被修饰为抽象;抽象类无法实例化(new) 抽象类子类
接口
public interface Speakable { public void speak(); } public class TeacherCang implements Speakable { } 4、既可以使用接口类型变量又可以使用类类型变量调用speak接口的意义是定义“做什么”,类定义“怎么做” 接口深入
|