[52PJ] Java面向对象笔记(转自52 1510988116)

面向对象概念

  • 面向对象三大特征:封装,继承,多态
  • 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复杂了,那么纯面向过程代码实现会很复杂,面向对象可以简化代码的结构和组织关系。面向对象不是替代面向过程的,宏观是面向对象,微观仍然是面向过程。
  • 类(class)和对象(Object):人、王力宏

类的定义

  • 最简单的类:class Person{ }

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+“岁了”);
}
}

  • 一个Java文件中只能定义一个public的class,且文件名必须和public类一样

对象的实例化

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

  • 我们可以把age成员变量声明为public,也可以把setAge声明为private,声明为private,这样就只能在类内部调用private成员(再写一个方法调用private的setAge)
  • 结论:public成员可以被类内部或者外部访问,private成员只能被类内部访问,这样可以保护不希望外界调用的内部成员(Member,包含字段Field/变量、方法)不被外界访问。
  • 直接通过public的age设置年龄,不通过setAge赋值,这样有什么坏处?
  • 字段(Field)/成员变量(Member Variable)一般声明为private

构造函数(Constructor)

  • 构造函数是创建类对象,并且在创建完成前对类进行初始化的特殊函数。如果定义类时没有声明构造函数,默认会给出一个无参构造函数,如果定义了任意一个构造函数,将不会提供默认的无参构造函数。
  • 构造方法格式及特点:

方法名必须和类名一致
           没有返回值类型
     3、构造函数可以重载,Person(String  name,int  age)
     4、用构造函数初始化和new之后通过set***初始化的区别:语意,有的对象生来就要有一些成员变量被赋值的,否则就是怪胎

静态static

  • 一些场景下会要求一个类的多个实例共享一个成员变量;有时候要定义“常量”,但是Java没有提供常量;有时候想定义一些不和具体对象关联、不需要new就调用方法
  • static方法不需要new就可以直接通过类名调用。
  • static变量不需要new就可以直接通过类名调用。
  • static 方法中无法使用this关键字,因为static独立于对象存在,不是任何人的唯一。
  • static成员中只能访问static成员,不能直接访问非static成员。非static成员可以访问static成员。

单例模式

  • 有的类在系统中只能有一个对象(*,资源管理器,缓存管理器等),这时就要使用“单例模式”(singleton)。实现单例模式有很多方法,先介绍最简单,最实用的“饿汉式”
  • 构造函数声明为private,这样避免外界访问
  • 定义一个private final static的对象实例
  • 定义一个public static的getInstance方法,返回唯一实例。

类的静态代码块
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)

  • java中一个类可以“继承自其他类,如果A继承自B”,则A叫做B的子类,B叫做A的父类(基类)。子类会从父类继承所有非private成员。子类还可以有子类。
  • java中一个类只能有一个父类,如果没指定父类,则java内置的Object为父类

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();
继承中的构造函数调用顺序

  • 子类的构造方法默认都去访问了父类的无参构造方法:在子类中的构造方法中都有一行默认语句:super()

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

  • private成员无法被子类、外界访问,这样保证了private成员的安全性
  • protected成员只能被自己以及子类(直接或者间接)以及兄弟(同package包中)访问,无法被“外姓人”访问

枚举

  • 有些数据是开放性范围的,比如int、float、String。有些数据可选值是有限取值范围的,比如星座、月份、方向,如果用1/2/3/4代表东南西北,那万一设置了8怎么办?
  • 枚举是一种定义确定取值范围的特殊类型(可选值一般大写)。(JDK5之后的语法)

enum Dir
{
  EAST,WEST,NORTH,SOUTH;
}
     使用Dir d=Dir.EAST;
      3、(*)枚举类型中还可以定义方法:在所有枚举定义结束后写“;”比如:getIntValue(得到代表的整数)、parse(把整数解析为枚举对象)。常见用法:给枚举定义一个确定的值。构造函数要定义为private(why)

多态

  • 面向对象三大特征:封装,继承,多态。多态是面向对象最强大的一个特征,也是最难的一个特征,设计模式等都是多态的体现。大型项目架构也大量应用多态。
  • 子类中定义和父类中一样的方法就叫“重写(Override)或覆盖”

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();

  • 父类变量可以指向子类对象,内存中也还是子类对象,有且只有这一个对象。变量是什么类型没有关系,到底执行谁的方法主要取决于内存中的对象是什么类型。
  • 变量类型是“把对象看成什么”,DiQiuRen dqr2=new Chinese();是把Chinese对象看成是“地球人”,因为“地球人”不一定有baiNian方法。因此dqr2.baiNian()编译失败。

final

  • 如果父类中的某些方法不希望被子类Override,比如kill,那么标记被final即可。好处:安全,可以保证父类定义的行为的执行(必须“被杀死”);效率高,避免了查询虚方法表(*)。
  • 如果某些类不希望被继承,类也可以声明为final。
  • final类的好处主要是安全(不会有冒名顶替的“不肖子孙”)。String类就是final。

抽象类

  • 复习:抽象类被标注abstract,抽象类无法new。
  • 地球人的sayHello输出“我是地球人”显然不合理,因为无法确定怎么说,也就是地球人不知道如何sayHello,只有具体到中国人、日本人、美国人才知道如何sayHello
  • 把地球人的sayHello的方法体去掉,并且方法增加abstract修饰,类也修饰为abstract:

abstract class DiQiuRen
{
   public abstract void speak();
}
    抽象方法没有方法体;一旦类中定义了抽象方法,类必须被修饰为抽象;抽象类无法实例化(new)
抽象类子类

  • 抽象类的抽象方法主要用来限制子类"必须实现这些抽象方法";子类也可以不实现,那么子类也要是抽象类,由子类的子类.....去实现
  • Eclipse中可以通过Alt+/或者主菜单“源码”——>“覆盖/实现方法”实现覆盖/实现父类方法。

接口

  • 接口是一种用来声明“能力”的类型,不提供具体实现不提供实现方法,连{ }都不能有。
  • 接口一般以“able”(英文表示“能力”的词一般以able结尾)结尾。
  • 接口无法实例化,只能被类“实现”(implements)

public interface Speakable
{
    public void speak();
}
public class TeacherCang implements Speakable
{

}
     4、既可以使用接口类型变量又可以使用类类型变量调用speak接口的意义是定义“做什么”,类定义“怎么做”
接口深入

  • 复习:接口用interface声明,接口中定义的方法不能提供实现,{ }空方法都不行。接口无法new,只能被类实现(implements)。
  • 接口一般以“able”(英文表示“能力”的词一般以able结尾)结尾。Ctrl+Shift+T看一下系统额接口名验证一下。
  • 接口中只能声明static final成员变量,不能声明普通成员变量。因为static final可以被外界用,一个没有实现代码的接口中声明普通成员变量没意义。
  • 接口中可以定义多个方法。也可以不定义任何方法(*标识接口)。
  • 接口只是“能力”不是“实现”,因此不能也不必要定义构造函数。
  • 类只能有一个父亲,类可以实现多个接口。
  • 接口可以“实现”其他接口,也是使用implements,不是extends,因此不能称作“继承接口”。
  • 接口的多态、类型转换。

时间: 2024-10-13 01:22:50

[52PJ] Java面向对象笔记(转自52 1510988116)的相关文章

Java面向对象笔记3

Java类必须包含一个或一个以上的构造器,使用构造器最大的好处就是在创建对象时,对类的Field进行初始化(当创 建一个对象的时候,系统为这个对象的Field进行默认初始化,如果是基本类型如数值型赋值为0,如果是引用类型的 Field赋值为null),如以下代码: public class Teacher { private String name; private int age; public Teacher(){ } public Teacher(String name,int age){

Java面向对象笔记5

封装.继承.多态是面向对象的三大特征,继承是实现类重用的重要手段,但是继承会带来一个最大的坏处,那就是破坏 封装.因此接下来介绍组合,组合是实现类重用的重要方式,能提供更好的封装性. 子类扩展父类的时候,可以从父类那里继承得到Field和方法,假设现在我们有足够的权限,那么子类就可以直接复用父 类的Field和方法,但继承在带来高度复用的同时,也带来了一个严重的问题,继承严重的破坏了父类的封装性.在封装 时,我们应该遵守这个原则:每个类都应该封装它内部信息和实现细节,而只暴露必要的方法给其他类使

Java面向对象笔记4

封装.继承.多态是面向对象的三大特征,在Java中什么是多态? Java引用变量有两种类型,分别是编译时类型和运行时类型.何为编译时类型,编译时类型就是由声明该变量时使用的类型决定,而运行时类型是由实际赋给该变量的对象决定 的,也就是说如果编译时类型和运行时类型不一致时,就可能出现上面提到的多态. 我们看下下面的程序: class BaseClass { public String name = "BaseClass"; public void base() { System.out.

java面向对象笔记

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.面向对象时一种思想,将功能封装进对象,强调具备了功能的对象 2.面向对象三个特征: 封装.继承.多态.  找对象,建立对象,使用对象,维护对象之间的关系 3.类和对象的关系: 类就是对现实生活中事物的描述,是对具体的抽象 对象是这类事物实实在在的个体,具体对象是对应java在堆内存中用new建立的实体 属性对应类中的变量,行为对应类中的函数(方法),共同成为类中的成员(成员变量,成员方法)

Java面向对象笔记2

接下来我们来看看面向对象语言中的方法,在定义方法时,发现它与结构化程序设计语言中函数尤为相似,值得注意 的是,Java里的方法是不能独立存在的,所有的方法都定义在类里. 那我们口中所讲的方法与函数到底有什么区别呢? 在结构化编程语言中,整个软件是由一个个的函数组成:而在面向对象编程语言里,整个软件是由一个个的类来组 成.因此定义方法时,只能定义在类中,如果使用static来修饰,那这个方法就是属于这个类,否则这个方法就属于这 个类的实例. 平时我们在同一个类的一个方法调用另外一个方法时,如果被调

Java面向对象笔记1

我们知道在面向对象的程序设计语音中有两个很重要的概念,就是类和对象,其中类是某一批对象的抽象,我们可以 把类理解成某种概念,那对象就是一个具体存在的实体. 在接下来讲解的Java语言就是一门面向对象的程序设计语言,其中类和对象是核心. 在Java中创建类主要如下格式: <span style="font-size:18px;">public class Teacher { }</span> 其中修饰符除了public之外,还可以使用其它修饰符,如:final.a

Java面向对象笔记9

如果一个类的对象是有限而且固定的,比如季节类,它只有4个对象,像这种实例有限而且固定的类,我们在Java 中被称为枚举类. 枚举类是Java 5 新增的,使用enum关键字来定义枚举类,枚举类是一个钟特殊的类,它一样可以有自己的Field. 方法,可以实现一个或者多个接口,也可以定义自己的构造器.在一个Java源文件中最多只能定义一个public访问 权限的枚举类.枚举类与普通类存在以下区别: 1.枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,并

Java面向对象笔记8

如果将一个类放在另一个类内部,那这个类就被称为内部类,内部类的主要作用如下: 1.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类. 2.内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相 访问.但外部类不能访问内部类的实现细节,例如内部类的成员变量. 3.匿名内部类适合用于创建那些仅需要一次使用的类. 成员内部类被分为两种:静态内部类和非静态内部类,使用static修饰的成员内部类是静态内部类,没有使用stat

Java面向对象笔记7

抽象类是从多个类中抽象出来的模板,在此基础上如果将这种抽象进行的更彻底,那么就可以提炼出一种更特殊 的"抽象类"------接口,接口里不能包含普通方法,接口里的所有方法都是抽象方法. 我们知道类是一种具体实现体,而接口定义了一种规范,接口定义了某一批类所需要遵守的规范,接口不关心这些 类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类 就可以满足实际需要.可见,就看就是从多个相似类中抽象出来的规范,接口不提供任何实现.接口体现的是规范