面向对象的编程思想:按照真实世界客观事务的自然规律进行分析,客观世界中存在什么样的实体,构建的软件系统就存在什么样的实体。
面向对象编程(object oriented programming,OOP),作为面向对象的计算机语言——Java,具有定义类和创键对象等面向对象能力
面向对象的三个基本特性:封装性,继承性,多态性
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
封装的优点:
代码示例:
//实现Java封装的步骤:
// 1.修改属性的可见性来限制对属性的访问(一般限制为private)
public class Person{
private String name;
private int age;
}
上面代码中,将name和age属性设置为私有,只能本类访问。自他类都访问不了
//2 对每个属性值提供对外的公共方法访问,也是创键一对赋值取值方法,用于对私有属性的访问
public class Person2{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name =name;
}
}
//采用this关键字是为了解决实例变量(private String name)和局部变量(SetName(String name)中的name变量)之间发生的同名的冲突
// this 指向该类的成员变量
类的继承格式:
calss 父类{
方法体;
}
class 子类 extends 父类{
}
实例说明:
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}
public class Penguin extends Animal {
public Penguin(String myName, int myid) {
//super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
super(myName, myid);
}
}
需要注意的是 Java 不支持多继承,但支持多重继承。
继承的特性:
继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
代码示例:
public class Animal {
private String name;
private int id;
public Animal(String myName, String myid) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}
public class Penguin extends Animal{
}
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
代码示例:
public interface A {
public void eat();
public void sleep();
}
public interface B {
public void show();
}
public class C implements A,B {
}
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态的优点:
多态生存的三个必要条件:
这个内容已经在上一章节详细讲过,就不再阐述,详细可访问:Java 重写(Override)与重载(Overload)
Java语言中有一个类的实现包括类声明和类体
[public] [abstract|final] class classname [extends superclassname] [implements interfaceNameList]{
//类体
}
class:声明类的关键字;classname:自定义的类名;public abstract final 为修饰符
abstract和final不能同时使用
声明类体中成员变量语法格式:
class classnamne{
[public|protected|private] [static] [final] type variablename;
}
参数说明:
public、protected和private修饰符用于封装成员变量
static修饰符用于声明静态变量,所以静态变量也称为“类变量”
final修饰符用于声明变量,该变量不能被修改
声明类体中成员方法语法格式如下:
class className{
[public|protected|private] [static][final|abstract] [native] [synchronized] type methodName([paramList])[throws exceptionList]{
//方法体
}
}
参数说明;
type:方法返回值数据类型;
methodName:方法名;
public、protected和private修饰符用于封装方法
static:修饰符用于声明静态方法
natice:nativ修饰方法称为本地方法;
synchronized修饰的方法是同步的,当多线程方式同步方法时,只能串行地执行
public class Animal{
//动物年龄
int age = 1;
//动物性别
public boolean sex =false;
//动物体重
private double weight =0.0;
public void eat(){
//方法体
return;
}
int run(){
//方法体
return 10;
}
protected int getMaxNumber(int number1,int number2) {
//方法体
if(number1>number2) {
return number1;
}
return number2;
}
}
Java中使用package定义包,package语句应该放在源文件的第一行,在每一个源文件中只能有一个包定义语句,并且package使用所有类型
语法格式:
import package1[.package2...].(类型名|*)
java.lang
java.lang 包中提供了Java语言的核心,如Object、class、String,…
java.id
提供多种输入/输出流,如,Writae,OutputStream,Reader
java.net
包含网络相关操作的类,ruURL,Socket和ServerSocket
Java .util包
包含一些实用工具类和接口,如集合,日期和日历等
java.text
提供文本处理,日期格式化和数字格式化等相关类及接口
java.awt 和java.swing
提供Java图形用户界面开发所需要的各种类和接口
定义:同一个类中的多个方法可以有相同的方法名称,但是有不同的参数列表,这就称为方法重载(method overloading)
代码示例
package oopdemo;
class MethodOverloading{
void receive(int i) {
System.out.println("接收一个int参数");
System.out.println("i="+i);
}
void receive(int x,int y ) {
System.out.println("接收两个int参数");
System.out.printf("x=%d,y=%d\r",x,y);
}
int receive(double x,double y) {
System.out.println("接收一个double参数");
System.out.printf("x=%f,y=%f\r",x,y);
return 0;
}
}
public class overloadDemo {
public static void main(String[] args) {
MethodOverloading mo = new MethodOverloading();
//调用void receive(int i )
mo.receive(9);
//调用void receive(int x,int y)
mo.receive(2,6);
//调用void receive(double x,double y)
mo.receive(7.0,7.0);
}
}
输出结果
接收一个int参数
i=9
接收两个int参数
x=2,y=6
接收一个double参数
x=7.000000,y=7.000000
方法重载的规则:
方法重载的实现:
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错,这叫做重载分辨。
Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的
访问控制的等级分为:私有、默认、保护、公有
关键字 | 控制等级 | 同一个类 | 同一个包 | 不同包的子类 | 不同包非子类 |
---|---|---|---|---|---|
private | 私有 | YES | |||
默认 | YES | YES | |||
protected | 保护 | YES | YES | YES | |
public | 共有 | YES | YES | YES | YES |
代码示例:
//同一个类调用成功
package eclipseDeBug;
public class privateDemo {
private int x;
public privateDemo() {
x = 100;
}
private void printx() {
System.out.println("ValueOf x is"+x);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
privateDemo P = new privateDemo();
P.printx();
}
}
//调用失败
package eclipseDeBug;
public class helloWrod {
public static void main(String[] args) {
privateDemo P = new privateDemo(); //能初始化
// P.printx(); 不能调用private修饰的方法
}
}
package eclipseDeBug;
public class dfClass {
int x;
public dfClass() {
x = 100;
}
void printx() {
System.out.println("Value of x is" + x);
}
public static void main(String[] args) {
dfClass p = new dfClass();//在同一个包中能够访问
p.printx();
}
}
package oopdemo; //不同包
import eclipseDeBug.dfClass;
public class helloWord {
public static void main(String[] args) {
dfClass p = new dfClass(); //能初始化,但是不能调用方法,因为类是公共的
// p.print()
}
}
代码示例:
package eclipseDeBug;
public class protectedClass {
protected int x;
public protectedClass() {
x = 100;
}
protected void printx() {
System.out.println("Value Of x "+"\t"+x);
}
}
//在同一个包内
package eclipseDeBug;
public class helloWrod {
public static void main(String[] args) {
protectedClass p = new protectedClass();
p.printx();
}
}
//在不同包中调用
package oopdemo;
import eclipseDeBug.dfClass;
import eclipseDeBug.protectedClass;
public class helloWord {
public static void main(String[] args) {
protectedClass p = new protectedClass();
// p.printx(); 不能调用该方法
}
}
//继承保护类
package oopdemo;
import eclipseDeBug.dfClass;
import eclipseDeBug.protectedClass;
public class helloWord extends protectedClass{
void display() {
printx(); //该方法从父类继承
int y = 10;
System.out.print(y); //该实例变量是从父类
}
public static void main(String[] args) {
helloWord p = new helloWord();
p.printx();
p.display();
}
}
输出结果:
Value Of x 100
Value Of x 100
10
提示:
static变量也称作静态变量,静态变量和非静态变量的区别是:
静态变量:静态变量被类中所有的对象所共享,它将变量值存储在一个公共的内存地址,因为地址公共,所以如果某个对象修改了静态变量的值,那么同一个类的所有对象都会受到影响。
非静态变量:非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
静态变量和方法可以在不创建对象的情况下进行访问。
静态方法与实例方法的区别:
静态方法:静态方法会随着类的定义而被分配和装载入内存中。静态方法可以调用静态方法以及访问静态数据域,但静态方法不能调用实例方法或者访问实例数据域。
实例方法:只有在类的对象创建时在对象的内存中才有这个方法的代码段。实例方法可以调用实例方法和静态方法,以及访问实例数据域或者静态数据域。
代码示例:
package eclipseDeBug;
public class staticClass {
//实例变量账户金额
double amount = 0.0;
//实例变量账户名
String owner;
//静态变量利率
static double interestRate = 0.068;
//静态方法
public static double interestBy(double amt) {
//静态方法可以访问静态变量和其他静态方法
return interestRate * amt;
}
//实例方法
public String messageWith(double amt) {
//实例方法可以访问实例变量、实例方法、静态变量和静态方法;
double interset = staticClass.interestBy(amt);
StringBuilder sb = new StringBuilder();
//拼接字符串
sb.append(owner).append("的利息").append(interset);
//返回字符串
return sb.toString();
}
public static void main(String[] args) {
//访问静态变量
System.out.println(staticClass.interestRate);
//访问静态方法
System.out.println(staticClass.interestBy(100000));
//初始化
staticClass sc = new staticClass();
sc.interestRate = 10000000;
sc.owner = "susu";
//访问实例方法
System.out.println(sc.messageWith(1000));
//通过实例访问静态变量
System.out.println(sc.interestRate);
}
}
/*
0.068
6800.000000000001
susu的利息1.0E10
1.0E7
*/
静态代码块:
package eclipseDeBug;
public class staticClass {
//实例变量账户金额
double amount = 0.0;
//实例变量账户名
String owner;
//静态变量利率
static double interestRate = 0.068;
//静态方法
public static double interestBy(double amt) {
//静态方法可以访问静态变量和其他静态方法
return interestRate * amt;
}
static {
//静态代码块,可以在声明的时候初始化
System.out.println("静态代码块被调用=============");
interestRate = 0.7989;
}
//实例方法
public String messageWith(double amt) {
//实例方法可以访问实例变量、实例方法、静态变量和静态方法;
double interset = staticClass.interestBy(amt);
StringBuilder sb = new StringBuilder();
//拼接字符串
sb.append(owner).append("的利息").append(interset);
//返回字符串
return sb.toString();
}
public static void main(String[] args) {
//访问静态变量
System.out.println(staticClass.interestRate);
//访问静态方法
System.out.println(staticClass.interestBy(100000));
//初始化
staticClass sc = new staticClass();
sc.interestRate = 10000000;
sc.owner = "susu";
//访问实例方法
System.out.println(sc.messageWith(1000));
//通过实例访问静态变量
System.out.println(sc.interestRate);
}
}
/*输出结果
静态代码块被调用=============
0.7989
79890.0
susu的利息1.0E10
1.0E7
*/
声明
声明对象与声明普通变量没有区别
type objectName;
type是引用类型,即类、接口和数组
实例化
实例化过程分为两个阶段:为对象分配内存空间和初始化对象,首先使用new运算符为对象分配内存空间,然后再调用构造方法初始化对象
String name;
name = new String("hello word");
String name =null;
name = "hello word"
引用变量默认值是null,当试图调用一个空对象的实例变量或实例方法时,会抛出空指针异常NullPointException
String name = null;
// 输出null字符串
System.out.println(name);
//调用length()方法
int len = name.length();
产生空对象有两种可能性:
Java构造方法的特点:
public class Rectangle{
//矩形宽度
int width;
//矩形高度
int height;
//矩形面积
int area;
//构造方法
public Rectangle(int w,int h){
width = w;
height = h;
area = getArea(w,h)
}
}
public 方法名字与类同名(){}
在一个类中可以有多个构造方法,具有相同的名字(与类名相同),参数列表不同,所以他们是重载的关系
package eclipseDeBug;
import java.util.Date;
public class Person {
private String name;
private int age;
private Date birthdate;
public Person(String n,int a,Date d) {
this.name = n;
this.age = a;
this.birthdate = d;
}
public Person(String n,int a) {
this.name = n;
this.age = a;
}
public Person(String n) {
this.name = n;
}
public String getInfo() {
StringBuilder sb = new StringBuilder();
sb.append("名字:").append(name).append('\n');
sb.append("年龄:").append(age).append('\n');
sb.append("出生日期:").append(birthdate).append('\n');
return sb.toString();
}
}
package eclipseDeBug;
public class thisClass {
private String name;
private int age;
private String city;
//调用三个参数构造方法
public thisClass(String name,int age,String city){
this.name = name;
this.age = age;
this.city = city;
System.out.println(this.toString());
}
public thisClass(String name,int age) {
//调用三个参数构造方法
this(name,age,null);
}
public thisClass(String name,String city) {
//调用三个参数的构造方法
this(name,30,city);
}
public thisClass(String name){
//调用thisClass(String name,int age)构造方法
this(name,null);
}
public String toString() {
return "thisClass [name="+name +",age"+age+","+city+"]";
}
public static void main(String[] args) {
thisClass tc = new thisClass("Java",18,"江西");
System.out.println(tc.toString());
}
}
当子类实例化时,不仅需要初始化子类成员变量,也需要初始化父类成员变量,初始化父类成员变量需要调用父类构造方法,子类使用super关键字调用父类构造方法。
父类:
package eclipseDeBug;
public class fatherClass {
private String name;
private int age;
private String city;
//三个参数构造方法
public fatherClass(String name,int age,String city) {
this.name = name;
this.age = age;
this.city = city;
System.out.println("这是父类");
}
public fatherClass(String name,int age) {
//调用3个参数构造方法
this(name,age,null);
}
}
子类:
package eclipseDeBug;
public class helloWrod extends fatherClass{
private String school;
public helloWrod(){
}
public helloWrod(String name,int age,String city,String school) {
super(name, age,city);
this.school = school;
System.out.println("这是子类");
}
public static void main(String[] args) {
helloWrod hw = new helloWrod("su",16,"jiangxi","asf");
hw.school = "jiangxi";
System.out.println(hw.school);
}
}
输出结果:
这是父类
这是子类
jiangxi
代码示例:
package eclipseDeBug;
public class parentClass {
int x = 10;
public static void main(String[] args) {
subClass sc = new subClass();
sc.print();
}
}
class subClass extends parentClass{
int x = 20;
public void print() {
//访问子类对象x成员变量
System.out.println("x="+x);
//访问父类x成员变量
System.out.println("super="+super.x);
}
}
输出结果:
x=20
super=10
package eclipseDeBug;
public class parentClass {
int x;
protected void setValue() {
x = 10;
System.out.println("这是父类");
}
public static void main(String[] args) {
subClass sc = new subClass();
sc.setValue();
sc.print();
System.out.print(sc.x);
}
}
class subClass extends parentClass{
//屏蔽父类x成员变量
int x ;
@Override
protected void setValue() {
// TODO Auto-generated method stub
//访问子类对象x的成员
x = 20;
//调用父类setValue()方法
super.setValue();
System.out.println("这是子类");
}
public void print() {
//访问子类对象X的成员变量
System.out.println("x="+x);
//访问父类x的成员变量
System.out.println("super.x="+super.x);
}
}
方法覆盖遵循的原则:
发生多态的三个前提条件:
声明抽象代码示例:
public abstract class Figure{
//绘制几何图形方法
public abstract void onDraw();
}
代码示例:
public interface Figure{
//接口静态成员变量
String name = “几何图型”; //省略public static final
//绘制几何图形方法
void onDraw(); //省略public
}
public class ellipses implements Figure{
//绘制几何图形方法
public void onDraw(){
System.out.println("绘制椭圆形");
}
}
//语法格式
【public】enum 枚举名{
枚举常量列表
代码示例:
package eclipseDeBug;
public enum WeekDay2 {
//枚举常量列表
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY
}
package eclipseDeBug;
public class WeekDay {
public static void main(String[] args) {
//day 工作日变量
WeekDay2 day = WeekDay2.FRIDAY;
System.out.println(day);
switch(day) {
case MONDAY:
System.out.println("周一");
break;
case TUESDAY:
System.out.println("周二");
break;
case WEDNESDAY:
System.out.println("周三");
break;
case THURSDAY:
System.out.println("周四");
break;
default:
System.out.println("周五");
}
}
}
代码示例:
package eclipseDeBug;
public enum WeekDay2 {
//枚举常量列表
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY;
//实例变量
private String name;
private int index;
//静态方法
private static int staticVar = 100;
//覆盖父类的toString()方法
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
sb.append(name);
sb.append('-');
sb.append(index);
return sb.toString();
}
//实例方法
public String getInfo() {
//调用父类中toString()方法;
return super.toString();
}
//静态方法
public static int getStaticVar() {
return staticVar;
}
}
package eclipseDeBug;
public class WeekDay {
public static void main(String[] args) {
//day 工作日变量
WeekDay2 day = WeekDay2.FRIDAY;
System.out.println(day);
//打印day默认调用枚举toString方法
System.out.println(day.getInfo());
//调用枚举静态方法
System.out.println(WeekDay2.getStaticVar());
}
}
输出结果
null-0
FRIDAY
100
package eclipseDeBug;
public enum WeekDay2 {
//枚举常量列表
MONDAY("周一",0),TUESDAY("周二",1),WEDNESDAY("周三",2),THURSDAY("周四",3),FRIDAY("周五",4);
//实例变量
private String name;
private int index;
//静态方法
private static int staticVar = 100;
private WeekDay2(String name,int index) {
this.name = name;
this.index = index;
}
//覆盖父类的toString()方法
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
sb.append(name);
sb.append('-');
sb.append(index);
return sb.toString();
}
//实例方法
public String getInfo() {
//调用父类中toString()方法;
return super.toString();
}
//静态方法
public static int getStaticVar() {
return staticVar;
}
}
package eclipseDeBug;
public class WeekDay {
public static void main(String[] args) {
//day 工作日变量
WeekDay2 day = WeekDay2.FRIDAY;
System.out.println(day);
//打印day默认调用枚举toString方法
System.out.println(day.getInfo());
//调用枚举静态方法
System.out.println(WeekDay2.getStaticVar());
}
}
周五-4
FRIDAY
100
代码示例
package eclipseDeBug;
public class enum2 {
public enum WeekDay{
//枚举常量列表
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY
}
public static void main(String[] args) {
//返回一个包含全部枚举常量的数组
WeekDay[] allvalues = WeekDay.values();
//遍历枚举常量数值
for(WeekDay word:allvalues) {
System.out.printf("%d-%s\n",word.ordinal(),word);
}
//创键Weekday对象
WeekDay day1 = WeekDay.FRIDAY;
WeekDay day2 = WeekDay.valueOf("FRIDAY");
System.out.println(day1 == WeekDay.FRIDAY);
System.out.println(day1.equals(WeekDay.FRIDAY));
System.out.println(day1 == day2);
}
}
提示:
版权声明:本文为CSDN博主「义无反顾xk」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
blic static void main(String[] args) {
//day 工作日变量
WeekDay2 day = WeekDay2.FRIDAY;
System.out.println(day);
//打印day默认调用枚举toString方法
System.out.println(day.getInfo());
//调用枚举静态方法
System.out.println(WeekDay2.getStaticVar());
}
}
~~~java
周五-4
FRIDAY
100
代码示例
package eclipseDeBug;
public class enum2 {
public enum WeekDay{
//枚举常量列表
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY
}
public static void main(String[] args) {
//返回一个包含全部枚举常量的数组
WeekDay[] allvalues = WeekDay.values();
//遍历枚举常量数值
for(WeekDay word:allvalues) {
System.out.printf("%d-%s\n",word.ordinal(),word);
}
//创键Weekday对象
WeekDay day1 = WeekDay.FRIDAY;
WeekDay day2 = WeekDay.valueOf("FRIDAY");
System.out.println(day1 == WeekDay.FRIDAY);
System.out.println(day1.equals(WeekDay.FRIDAY));
System.out.println(day1 == day2);
}
}
提示:
版权声明:本文为CSDN博主「义无反顾xk」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xkfanhua/article/details/80561673