Java类与对象 详解

简介: Java类与对象 详解

面向对象简述:


面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。


但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。



面向对象的基本特征:


(1)封装:保护内部的操作不被破坏;

(2)继承:在原本的基础之上继续进行扩充;

(3)多态:在一个指定的范围之内进行概念的转换。

通过对象名使用成员变量,最基本都方法是:

对象名.成员变量名


认识类和对象:

定义一个类的语法:

class 类名{

               所含变量定义; //类的名字只能是java中的关键字

}


例如,定义一个Person类:

class Person {     // 类名称首字母大写
    String name ;
    int age ;
    public void tell() {        
          System.out.println("姓名:" + name + ",年龄:" + age) ;
         }
}


认识成员函数:

Java中的函数,编写在类中,一般称为成员函数,最简单的成员函数格式如下:

void  函数名称(){

                参数内容;

}


调用这个成员函数的格式为:“对象名.函数名();”

带参数的成员函数的格式如下:

void 函数名称 (类型1 参数名1,类型2 参数名2,……,类型n 参数名n){

               函数内容;

}


调用方法为:“对象名.函数名(参数值例表);”

带返回类型的成员函数

格式如下:


void 函数名称 (类型1 参数名1,类型2 参数名2,……,类型n 参数名n){

               函数内容;

               return 和返回函数类型一致的某个变量或者对象;    

}


函数的参数传递:

1)简单数据类型,采用值传递

2)引用数据类型,采用引用传递


认识函数重载:


在Java中,不能盲目将函数名定义一样。必须满足以下体条件之一:


1)函数参数个数不同


2)函数参数个数相同,类型不同


3)函数参数个数相同,类型相同,但是在参数列表中的出现顺序不同


       如何定义和使用构造函数:


构造函数也是一种函数,但是定义时必须遵循以下准则:


1)函数名称与类的名称相同


2)不含返回类型


定义了构造函数之后,在实例化对象时,就必须传入相应的参数列表,否则报错。使用方法是:


类名 对象名=new 类名(传给构造函数的参数列表);


无参构造例子:

class Telphone:

public Telphone() {

       System.out.println("Telphone构造方法执行了");

}

注意:


1)当一个类的对象被创建时,构造函数就会被自己调用,可以在这个函数中加入初始化工作的代码。在对象的生命周期中,构造函数只会被调用一次。


2)构造函数可以被重载,也就是说在一个类中可以定义多个构造函数。在实例化对象时,系统根据参数的不同调用不同的构造函数


3)在一个类中如果没有定义构造函数,系统会自动为这个类产生一个默认的构造函数,该函数没有参数,也不做任何事情。因此,只有在没有定义构造函数时才可以通过:


类名   对象名 = new   类名() ;

如果用户自己定义了含有参数的构造函数,系统将不提供默认的构造函数。


使用对象操作类例子:

class Person { 
    String name ;
    int age ;
    public void get() {
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
}
public class TestDemo {
        public static void main(String args[]) {
            Person per = new Person() ;// 声明并实例化对象
            per.name = "张三" ;//操作属性内容
            per.age = 30 ;//操作属性内容
            per.get() ;//调用类中的get()方法
        }
}


静态变量:

各个对象共有的内容只用一个空间保存,只需要将共有的变量定义成静态变量,方法实在其定义前加上“static”关键字即可。


静态变量的常见应用:

1)保存跨对象信息

2)存储对象个数


认识静态函数

静态变量和静态函数统称为静态成员。静态函数可以通过“类名.函数名”来访问,也可通过”对象名.函数名“访问。


静态代码块

当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。格式为:


static{

               需要静态执行的代码;

}

this



this修饰的变量用于指代成员变量

(方法的形参与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量)

用于解决局部变量隐藏成员变量。

public class student{
    private int age;
    public void setAge(int age){
        this.age = age;//this使其指向了成员变量
    }
}


使用封装

封装是面向的基本特征之一。


如何实现封装:


1)将不能暴露的成员隐藏起来,不能让其在类的外部被直接赋值。将成员定义为私有,在成员定义前加上private

2)用公共方法来暴露对该隐藏成员的访问,可以给函数加上public,将该方法定义为公共

在Java中,使用类似的方法管理类,这就是包(packgae)


如何访问包中的类:


1)在同一个包中,直接用类名来访问,不用指定类所在的包:可以直接访问,不会报错。

2)两个类不在同一个包中:

       在使用类时,指定类的路径;

       用import语句导入该类。


package机制:


通常是类的第一句非注释语句,通常在类的声明上方加“package 包名“写项目时最好加包,尽量不用默认包。

包名:域名倒着写即可,再加上模块名便于内部管理类。

在同一个类中直接用类名即可访问该类,否则需要指定包名。


import导入类:


功能:在本类中导入其它包的类


要点:1)java会默认导入Java.lang包下的所有的类


          2)如果同时导入不同包但名字相同的两个类,只能用包名+类名来显示调用相关类


             静态导入static import->导入指定类的静态属性方法


类的访问控制:


public:不写的情况下,属于默认访问修饰,此时,该类只能被同一个包中的所有类识别。写了的话,该类是一个公共类,可以被包内包外所有类识别。


对于成员来说,访问控制修饰符共有4个,分别是private、default、protected、public。特性如下:


1)private类型成员,只能在定义它的类的内部访问。


2)default类型成员,可以在定义它的类的内部访问,也可以被这个包中其他类访问。


3)protected类型成员,可以在定义它的类的内部被访问,也可以被这个包中的其它类访问,还可以被包外的子类访问。


4)public类型成员,可以在定义它的类的内部被访问,也可以被包内外的所有其它类访问。


注意:

1)静态变量可以通过”对象名.变量名“访问,而非静态变量不能这样使用。


2)如果一个包中的类很多,可以用”import包含.*“导入该包中的所有类。


3)内部类中的成员只在内部类范围才能使用,外部类不能像使用自己的成员变量一样使用它们。


4)如果在内部类中使用this,仅代表内部类的对象,因此也只能引用内部类的成员。


访问权限作用范围图:


同一个类
同一个包 不同包的子类 不同包的非子类
private
默认的
protected
public


继承


在Java中,被继承的类叫做父类、基类或者超类,与之对应的叫做子类或者派生类。继承是通过extends关键字实现的,格式如下:

class 子类 extends 父类{

}


子类继承父类后,实例化子类对象时,系统会首先实例化父类对象。

实例:

//父类
public class file{
    public long size;     //文件大小
    public String name;    //文件名
    public void info()    //显示文件信息
    {
        System.out.println(name + " " + size);
    }
}
//子类
public class videofile extends file()
{
    //父类的public成员自动继承
    //private不能被继承,子类无权访问    
    //只需要添加子类的特性
    public int duration //时长    
    public void play()
    {
       System.out.println("播放" + this.name);
    }
    public void stop()
    {
        System.out.println("停止" + this.name);
    }

成员的覆盖:

若父类没有不带参数的构造函数,有两种方法:


1)给父类增加一个不带参数的空构造函数。


2)在子类的构造函数中,第一句用super来给父类构造函数传参数。


子类中成员函数的定义和父类相同,指名称相同、参数列表相同、返回类型相同。如果子类中的函数定义和父类相同,最后调用时时调用子类中的方法。这叫做覆盖或者重写(Override)。


多态性


多态,也是面向对象的基本特征之一,也是软件工程的重要思想。动态多态的理论基础时:父类可以指向子类对象。


”父类引用可以指向子类对象“可以延申到如下两个方面:


1)函数传入的形参可以是父类类型:


根据多态性原理,子类对象无需砖换,就可以赋值给父类引用


2)父类类型对象转换成子类类型:


严格讲,父类类型对象无法转换成子类类型。但是又一种特殊情况,如果父类类型对象原来就是某一种子类类型的对象,就可以转换成相应子类类型对象,此时使用强制类型转换即可。


抽象类和接口:

含有抽象函数的类叫做抽象类,抽象类必须用abstract修饰。抽象类还可以含有普通成员函数,如果一个抽象类中的所有函数都是抽象的,我们也可以定义为接口。

在”继承接口“的情况下,一般有另一种说法,叫做”实现接口“,子类也叫做实现类。



注意:


1)子类中通过implements来实现接口中的规范


2)接口不能实例,但可用于声明引用变量类型


3)一个类实现了接口,必须实现接口中所有抽象方法,且这些方法只能是public


4)接口客多继承


5)格式:class 子类 extends 父类 implements 接口1,接口2,……{}


其它内容:


final:


1)用final来修饰一个类,表示该类不能被继承


2)用final来修饰一个函数,该类在被子类继承的情况下,此函数不能被重写


3)用final来修饰一个成员变量,表示该成员变量的值不允许被改变,也就是是说,不允许重新赋值(哪怕是同一个值),因此,我们一般用final关键字来定义一个常量


object类


在Java中定义一个类时,如果没有用extends明确表明直接父类,那么该类默认继承object类。因此,object类是所有类的父类或间接父类。

在object中,比较常用的两个方法:

1)tostring 方法

2)equals 方法


注意:

1)父类的私有成员可以被子类继承,但只能通过继承自父类的,并且子类可以访问的方法(setter和getter访问器)


2)Java只支持单重继承


3)在构造子类对象时,父类的构造函数比子类的构造函数先运行输出(子类默认调用父类的无参构造函数)


4)抽象类不能被实例化


5)抽象类必须被重写,除非子类也是抽象类


6)在抽象类中可以含有普通成员函数


4e6da724b77a412a9b9610ed78a62d6c.jpg


664f0914dafe4dd3b9b8dc1590ffd2a7.jpg

相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
12天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
65 8
|
2月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
76 17
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
3月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
62 17
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
137 4
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
84 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
71 4