package com.A;public class Demo01 { public String a = "公共的"; protected String b = "受保护的";
String c = "默认的"; private String d = "私有的";
//在类的内部可以随意访问数据域
public void test() {
System.out.println(a + b + c + d);
}
}
继承Demo01类, 父类中private修饰的d属性无法被继承。
package com.A;public class Son extends Demo01 {//访问继承自父类的数据域
public static void main(String[] args) {
System.out.println(new Son().a);
System.out.println(new Son().b);
System.out.println(new Son().c);
}
}
不同包的子类,默认权限c属性和私有属性d无法继承。
package com.B;import com.A.Demo01;public class Son_b extends Demo01{ //子类方法中打印从父类Dmeo01中继承来的数据域
public void test() {
System.out.println(new Son_b().a);
System.out.println(new Son_b().b);
}
}
用static修饰,能节省一些内在空间,虽然很有限
修饰符是用于限定类型以及类型成员申明的一种符号,可用于修饰类、变量和方法,分为访问修饰符和非访问修饰符。访问修饰符控制访问权限,不同的访问修饰符有不同的权限范围,而非访问修饰符则是提供一些特有功能。
访问权限修饰符
访问修饰符有四个,权限从大到小:public、protected、default、private ,访问范围如下:
public 本类、同包、子类和全局(只要导入包就能访问)
protected 本类、同包和子类
default 本类、同包(当类、方法和变量不添加权限修饰符时,默认使用)
private 本类(类的内部)
修饰符是用于限定类型以及类型成员申明的一种符号,可用于修饰类、变量和方法,分为访问修饰符和非访问修饰符。访问修饰符控制访问权限,不同的访问修饰符有不同的权限范围,而非访问修饰符则是提供一些特有功能。
访问权限修饰符
访问修饰符有四个,权限从大到小:public、protected、default、private ,访问范围如下:
public 本类、同包、子类和全局(只要导入包就能访问)
protected 本类、同包和子类
default 本类、同包(当类、方法和变量不添加权限修饰符时,默认使用)
private 本类(类的内部)
修饰符是用于限定类型以及类型成员申明的一种符号,可用于修饰类、变量和方法,分为访问修饰符和非访问修饰符。访问修饰符控制访问权限,不同的访问修饰符有不同的权限范围,而非访问修饰符则是提供一些特有功能。
访问权限修饰符
访问修饰符有四个,权限从大到小:public、protected、default、private ,访问范围如下:
public 本类、同包、子类和全局(只要导入包就能访问)
protected 本类、同包和子类
default 本类、同包(当类、方法和变量不添加权限修饰符时,默认使用)
private 本类(类的内部)
继承Demo01类, 父类中private修饰的d属性无法被继承。
不同包的子类,默认权限c属性和私有属性d无法继承。
通过以上的代码实例即可看出不同的访问修饰符所能控制的范围是不同的。
非访问修饰符
非访问修饰符有很多,最经常用到的当属static和final了,除此之外还有许多非访问修饰符会在下面一一介绍。
static
当编写一个类时,本质上就是在描述该事物的属性和行为,但这些只有创建对象时这些数据才会被分配。有的时候我们希望无需创建对象就能获取数据,且数据独一份,被所有对象共享。
static修饰的变量和方法叫做静态变量和静态方法,也叫类变量/方法,属于类本身。所有实例都能调用静态变量和静态方法。反之,实例变量和实例方法绑定于类的某个实例,只能由实例来调用,不对外共享,因为对象是唯一的。
static注意点:
调用静态变量和静态方法时,只需要类名.静态变量/静态方法。使用对象也可以调用,但这样做不规范。
static能修饰的类只有内部类,也叫作静态内部类,地位等同于外部类的静态变量。
static不能修饰局部变量,因为作用域仅限于所处的块,而static本身的功能相违背且不允许。
在静态方法中,例如main()方法,不能使用this和super关键字来访问实例变量和调用方法,若要调用实例变量,则需要实例化一个对象。
final
final可修饰变量、方法和类,一旦被final修饰,该变量就不能改变值或是改变其引用。编译器会检查代码,试图更改时编译器会报错。
final注意点:
final修饰的方法不能被重写,final修饰的类也不允许被继承,final修饰的类为不可变类。
修饰变量时,都是当成常量来用,通常和static关键字配合使用,而且常量最好使用全大写。
为什么要和static一起使用呢?通过两种常量来说明一下两者区别
final修饰的优点
final关键字可以提高性能,JVM和Java应用都会缓存final变量。
final修饰后,编译时就进行静态绑定,不需要在运行时在动态绑定。
final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。 使用final关键字,JVM会对方法、变量及类进行优化。
final修饰类则是不可变类。不可变类的实例创建后,该实例的内容无法被改变。String是不可变类的代表。
不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。
abstract
abstract只能修饰类和方法,称为抽象类和抽象方法,定义抽象类的唯一目的就是子类对该类进行扩展重写,抽象方法必须实现。
一个类不能同时被 abstract 和 final 修饰,因为理念冲突。
抽象类不能实例化对象,因为抽象方法没有方法体,所以抽象类实例无法调用方法,实例化无意义。
若类中包含抽象方法,则该类必须声明为抽象类,否则将出现编译错误。
抽象类中能同时声明抽象方法和普通方法,相当于普通类和接口的中间层,类似半成品。
synchronized
修饰方法作为同步方法,则在同一时间该方法只能被一个线程所访问,别的线程将阻塞。修饰方法可以隐式传入同步监视器对象。作为同步代码块,示例如下:
volatile
volatile的作用和synchronized一样,都是为了保证线程安全,但如果只是为了保证一两个成员变量的使用安全,使用synchronized开销太大。volatile修饰的成员变量每次被线程访问时,都会强制从共享内存中重新读取该成员变量的值。而且,当成员变量值改变时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量变化的值。
transient
运用在对象序列化中,当对某个对象进行序列化(转换成二进制存储在硬盘中),有些私有信息不想被序列化时,就用transient去修饰,transient表示透明化的,作用就如其名,序列化时就会忽略掉该信息。注意:类要实现序列化需要实现Serializable接口,该接口没有任何方法,仅仅作为序列化的标识。
如果没有static的话,每一个对象(这个类的实例)都会产生一个这个常量的拷贝,如果你只需要一个常量的话,那么请用static
修饰符是用于限定类型以及类型成员申明的一种符号,可用于修饰类、变量和方法,分为访问修饰符和非访问修饰符。访问修饰符控制访问权限,不同的访问修饰符有不同的权限范围,而非访问修饰符则是提供一些特有功能。
访问权限修饰符
访问修饰符有四个,权限从大到小:public、protected、default、private ,访问范围如下:
public 本类、同包、子类和全局(只要导入包就能访问)
protected 本类、同包和子类
default 本类、同包(当类、方法和变量不添加权限修饰符时,默认使用)
private 本类(类的内部)
相关问题推荐
里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一...
心里有个预期,然后看看是以什么目的进这家企业工作,要是赚钱的话,那就多要点,要是学习的话,可以根据情况要一个能养活自己的价格。
Java中有八种数据类型,基础数据类型分别是:byte,short,int,long,float,double,char,boolean,引用数据类型分别是:数组,类和接口。方法传参的时候我们有两种,一种是形式参数(定义方法时写的参数),一种是实际参数(调用方法时给的具体值)。首先...
现在的架构很多,各种各样的,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等,还有很多。分布式架构其实就是分布式系...
1、监控GC的状态使用各种JVM工具,查看当前日志,分析JVM参数的设置,分析堆内存快照和GC日志,根据实际的各区域的内存划分和GC的执行时间,判断是否需要进行优化2、分析结果、判断是否需要优化如果各项参数设置合理,系统没有超时的日志出现,GC频率也不高,...
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以...
学vue应该要先学习javascript 的基础知识和用法。
1、lambda是jdk8的新特性2、使用lambda的前提,必须是一个接口,接口只能有一个抽象方法3、Lambda 表达式的简单例子:// 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数...
1、面向对象编程(OOP):OOP最重要的思想是类,类是模板,从类中构造一个对象,即创建了这个类的一个实例;2、封装:是把数据和行为结合在一起,并对对象使用者隐藏数据的实现过程,通常一个对象中的数据叫他的实例字段(instance field) ;3、继承:Java中允许在已...
jdk1.8的新特性包括如下:一、接口的默认方法与静态方法,也就是接口中可以有实现方法二、Lambda 表达式三、函数式接口与静态导入四、Lambda 作用域在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变...
这个是在内存中存放的地址,你必须str1.equals(str2)才可以判断的。你可以输出地址看看,你这样比较的是两个地址,当然是false了。第一个直接缓存 数据共享Hello,是true。
采用接口(Interface)的中变量默认为static final的特性在普通类中使用final修饰变量采用了Java 5.0中引入的Enum类型。,也就是所谓的枚举类
其实就一句话:只要是有多个线程访问并修改某个变量或是区域的话,一定要加1653上同步设置(比如同步控制语句,互斥锁,信号量,原子操作等等)。B/S结构中,如果你不编写类似Apache等的HTTP Server,那么你不用考虑线程安全这个问题。如果有多个用户访问数据库...
同步方法 使用synchronized 修饰方法 ==》 解决线程安全问题同步代码块 synchronized(被加锁的对象){ 代码 } ==》 解决线程安全问题锁机制Lock ==》 解决线程安全问题 (这个例子在ex2上修改而成的)...
当多个线程访问同一个共享数据时,有可能会出现线程安全问题